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:
parent
bc98d6c809
commit
74497b7ab6
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue