summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2011-02-04 15:22:56 +0000
committerae <ae@FreeBSD.org>2011-02-04 15:22:56 +0000
commit17c8cc38771bbfb9a6f654c051938b5c77bd5f40 (patch)
treef0ded37625ab6f58a3e11188d9930a41596f37e4 /sys/cddl/contrib
parent56b54d13f219ed2a8f518c0a57b84ff5e9361daf (diff)
downloadFreeBSD-src-17c8cc38771bbfb9a6f654c051938b5c77bd5f40.zip
FreeBSD-src-17c8cc38771bbfb9a6f654c051938b5c77bd5f40.tar.gz
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
Diffstat (limited to 'sys/cddl/contrib')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
index d0d5137..fa42871 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
@@ -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;
OpenPOWER on IntegriCloud