aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarik Horn <[email protected]>2012-06-01 20:49:10 -0500
committerBrian Behlendorf <[email protected]>2012-06-13 17:05:16 -0700
commit74497b7ab6af69434453e03c755d3f6e6e655aee (patch)
tree69c6d2068536df39f2a45e58de7deb427f0db2af
parentbc98d6c80944dcd920d1147e6bff2192e886a2f5 (diff)
Add zvol_inhibit_dev module option.
ZoL can create more zvols at runtime than can be configured during system start, which hangs the init stack at reboot. When a slow system has more than a few hundred zvols, udev will fork bomb during system start and spend too much time in device detection routines, so upstart kills it. The zfs_inhibit_dev option allows an affected system to be rescued by skipping /dev/zd* creation and thereby avoiding the udev overload. All zvols are made inaccessible if this option is set, but the `zfs destroy` and `zfs send` commands still work, and ZFS filesystems can be mounted. Signed-off-by: Brian Behlendorf <[email protected]>
-rw-r--r--module/zfs/zvol.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c
index ba26543f7..125d58de9 100644
--- a/module/zfs/zvol.c
+++ b/module/zfs/zvol.c
@@ -46,6 +46,7 @@
#include <sys/zvol.h>
#include <linux/blkdev_compat.h>
+unsigned int zvol_inhibit_dev = 0;
unsigned int zvol_major = ZVOL_MAJOR;
unsigned int zvol_threads = 32;
@@ -1341,6 +1342,9 @@ zvol_create_minors(const char *pool)
spa_t *spa = NULL;
int error = 0;
+ if (zvol_inhibit_dev)
+ return (0);
+
mutex_enter(&zvol_state_lock);
if (pool) {
error = dmu_objset_find_spa(NULL, pool, zvol_create_minors_cb,
@@ -1370,6 +1374,9 @@ zvol_remove_minors(const char *pool)
zvol_state_t *zv, *zv_next;
char *str;
+ if (zvol_inhibit_dev)
+ return;
+
str = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
if (pool) {
(void) strncpy(str, pool, strlen(pool));
@@ -1431,6 +1438,9 @@ zvol_fini(void)
list_destroy(&zvol_state_list);
}
+module_param(zvol_inhibit_dev, uint, 0644);
+MODULE_PARM_DESC(zvol_inhibit_dev, "Do not create zvol device nodes");
+
module_param(zvol_major, uint, 0444);
MODULE_PARM_DESC(zvol_major, "Major number for zvol device");