Page MenuHomeFreeBSD

D4998.id12486.diff
No OneTemporary

D4998.id12486.diff

Index: UPDATING
===================================================================
--- UPDATING
+++ UPDATING
@@ -32,6 +32,13 @@
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20160119:
+ Building ZFS pools on top of zvols is prohibited by default. That
+ feature never really worked; it's always been prone to deadlocks.
+ Using a zvol as the backing store for a VM guest's virtual disk will
+ still work, even if the guest is using ZFS. Legacy behavior can be
+ restored by setting vfs.zfs.vol.recursive=1.
+
+20160119:
The NONE and HPN patches has been removed from OpenSSH. They are
still available in the security/openssh-portable port.
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
@@ -134,6 +134,9 @@
static int volmode = ZFS_VOLMODE_GEOM;
SYSCTL_INT(_vfs_zfs_vol, OID_AUTO, mode, CTLFLAG_RWTUN, &volmode, 0,
"Expose as GEOM providers (1), device files (2) or neither");
+static boolean_t zpool_on_zvol = B_FALSE;
+SYSCTL_INT(_vfs_zfs_vol, OID_AUTO, recursive, CTLFLAG_RWTUN, &zpool_on_zvol, 0,
+ "Allow zpools to use zvols as vdevs (DANGEROUS)");
#endif
typedef struct zvol_extent {
@@ -1114,7 +1117,9 @@
return (err);
}
#else /* !illumos */
- if (tsd_get(zfs_geom_probe_vdev_key) != NULL) {
+ boolean_t locked = B_FALSE;
+
+ if (!zpool_on_zvol && tsd_get(zfs_geom_probe_vdev_key) != NULL) {
/*
* if zfs_geom_probe_vdev_key is set, that means that zfs is
* attempting to probe geom providers while looking for a
@@ -1125,19 +1130,34 @@
*/
return (EOPNOTSUPP);
}
-
- mutex_enter(&zfsdev_state_lock);
+ /*
+ * Protect against recursively entering spa_namespace_lock
+ * when spa_open() is used for a pool on a (local) ZVOL(s).
+ * This is needed since we replaced upstream zfsdev_state_lock
+ * with spa_namespace_lock in the ZVOL code.
+ * We are using the same trick as spa_open().
+ * Note that calls in zvol_first_open which need to resolve
+ * pool name to a spa object will enter spa_open()
+ * recursively, but that function already has all the
+ * necessary protection.
+ */
+ if (!MUTEX_HELD(&zfsdev_state_lock)) {
+ mutex_enter(&zfsdev_state_lock);
+ locked = B_TRUE;
+ }
zv = pp->private;
if (zv == NULL) {
- mutex_exit(&zfsdev_state_lock);
+ if (locked)
+ mutex_exit(&zfsdev_state_lock);
return (SET_ERROR(ENXIO));
}
if (zv->zv_total_opens == 0) {
err = zvol_first_open(zv);
if (err) {
- mutex_exit(&zfsdev_state_lock);
+ if (locked)
+ mutex_exit(&zfsdev_state_lock);
return (err);
}
pp->mediasize = zv->zv_volsize;
@@ -1171,7 +1191,8 @@
mutex_exit(&zfsdev_state_lock);
#else
zv->zv_total_opens += count;
- mutex_exit(&zfsdev_state_lock);
+ if (locked)
+ mutex_exit(&zfsdev_state_lock);
#endif
return (err);
@@ -1181,7 +1202,8 @@
#ifdef illumos
mutex_exit(&zfsdev_state_lock);
#else
- mutex_exit(&zfsdev_state_lock);
+ if (locked)
+ mutex_exit(&zfsdev_state_lock);
#endif
return (err);
}

File Metadata

Mime Type
text/plain
Expires
Sun, Jan 18, 7:56 AM (18 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27706636
Default Alt Text
D4998.id12486.diff (3 KB)

Event Timeline