1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-19 02:29:40 +00:00

vdev's sectorsize should not be greater than 8 Kbytes and also

it should be power of 2. This prevents non-aligned access while
probing vdev's labels.

PR:		kern/147852
Reviewed by:	pjd
MFC after:	1 week
This commit is contained in:
Andrey V. Elsukov 2011-02-04 15:22:56 +00:00
parent a3ebd02675
commit 459d0e830d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218278

View File

@ -393,7 +393,8 @@ vdev_geom_open_by_path(vdev_t *vd, int check_guid)
if (pp != NULL) {
ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path);
cp = vdev_geom_attach(pp);
if (cp != NULL && check_guid) {
if (cp != NULL && check_guid && ISP2(pp->sectorsize) &&
pp->sectorsize <= VDEV_PAD_SIZE) {
g_topology_unlock();
guid = vdev_geom_read_guid(cp);
g_topology_lock();
@ -457,6 +458,17 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
if (cp == NULL) {
ZFS_LOG(1, "Provider %s not found.", vd->vdev_path);
error = ENOENT;
} else if (cp->provider->sectorsize > VDEV_PAD_SIZE ||
!ISP2(cp->provider->sectorsize)) {
ZFS_LOG(1, "Provider %s has unsupported sectorsize.",
vd->vdev_path);
g_topology_lock();
vdev_geom_detach(cp, 0);
g_topology_unlock();
error = EINVAL;
cp = NULL;
} else if (cp->acw == 0 && (spa_mode(vd->vdev_spa) & FWRITE) != 0) {
int i;