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 <behlendorf1@llnl.gov>
This commit is contained in:
Darik Horn 2012-06-01 20:49:10 -05:00 committed by Brian Behlendorf
parent bc98d6c809
commit 74497b7ab6

View File

@ -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");