]> granicus.if.org Git - zfs/commitdiff
Open pools asynchronously after module load
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 2 Jul 2013 18:59:51 +0000 (11:59 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 3 Jul 2013 16:24:38 +0000 (09:24 -0700)
One of the side effects of calling zvol_create_minors() in
zvol_init() is that all pools listed in the cache file will
be opened.  Depending on the state and contents of your pool
this operation can take a considerable length of time.

Doing this at load time is undesirable because the kernel
is holding a global module lock.  This prevents other modules
from loading and can serialize an otherwise parallel boot
process.  Doing this after module inititialization also
reduces the chances of accidentally introducing a race
during module init.

To ensure that /dev/zvol/<pool>/<dataset> devices are
still automatically created after the module load completes
a udev rules has been added.  When udev notices that the
/dev/zfs device has been create the 'zpool list' command
will be run.  This then will cause all the pools listed
in the zpool.cache file to be opened.

Because this process in now driven asynchronously by udev
there is the risk of problems in downstream distributions.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #756
Issue #1020
Issue #1234

module/zfs/zvol.c
scripts/zconfig.sh
udev/rules.d/90-zfs.rules.in

index 97b65c815e349d154d6963af33f83049d7e917f9..e35c91bc184ea2c91c89ee25f7611df645a0b98e 100644 (file)
@@ -1582,8 +1582,6 @@ zvol_init(void)
        blk_register_region(MKDEV(zvol_major, 0), 1UL << MINORBITS,
                            THIS_MODULE, zvol_probe, NULL, NULL);
 
-       (void) zvol_create_minors(NULL);
-
        return (0);
 
 out2:
index 141348c037faf47f66317e04382441299d8c5840..281166c59ba756f3540b090ce148dc0f43d71c18 100755 (executable)
@@ -264,8 +264,9 @@ test_4() {
        zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \
            ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 9
 
-       # Load the modules, wait 1 second for udev
+       # Load the modules, list the pools to ensure they are opened
        ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 10
+       ${ZPOOL} list &>/dev/null
 
        # Verify the devices were created
        zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \
index 52e1d639303e2787e6a151f27ce8661cf0facb5a..a2715d2e78140c51f0314b06ac6c152691d21d7e 100644 (file)
@@ -1,4 +1,4 @@
-SUBSYSTEM!="block", GOTO="zfs_end"
+SUBSYSTEM!="block|misc", GOTO="zfs_end"
 ACTION!="add|change", GOTO="zfs_end"
 
 ENV{ID_FS_TYPE}=="zfs", RUN+="/sbin/modprobe zfs"
@@ -7,4 +7,6 @@ ENV{ID_FS_TYPE}=="zfs_member", RUN+="/sbin/modprobe zfs"
 KERNEL=="null", SYMLINK+="root"
 SYMLINK=="null", SYMLINK+="root"
 
+SUBSYSTEM=="misc", KERNEL=="zfs", RUN+="@sbindir@/zpool list"
+
 LABEL="zfs_end"