]> granicus.if.org Git - zfs/commitdiff
Fix volmode=none property behavior at import time
authorLOLi <loli10K@users.noreply.github.com>
Mon, 31 Jul 2017 18:07:05 +0000 (20:07 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 31 Jul 2017 18:07:05 +0000 (11:07 -0700)
At import time spa_import() calls zvol_create_minors() directly: with
the current implementation we have no way to avoid device node
creation when volmode=none.

Fix this by enforcing volmode=none directly in zvol_alloc().

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #6426

module/zfs/zvol.c
tests/zfs-tests/include/libtest.shlib
tests/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_volmode.ksh

index 623fb9b221bfe1b2fe6fe5fb9ff15f7eb1b1586d..2547602204c03ab00bf384f9a68842dd23164058 100644 (file)
@@ -1603,6 +1603,9 @@ zvol_alloc(dev_t dev, const char *name)
        if (volmode == ZFS_VOLMODE_DEFAULT)
                volmode = zvol_volmode;
 
+       if (volmode == ZFS_VOLMODE_NONE)
+               return (NULL);
+
        zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP);
 
        list_link_init(&zv->zv_next);
index b6ac41dfa987ba44f6f21b31f974d573dae67b30..4395d2868075e691e2292c414a3b3c19b02ce9f3 100644 (file)
@@ -3460,7 +3460,7 @@ function swap_setup
        typeset swapdev=$1
 
        if is_linux; then
-               log_must mkswap $swapdev > /dev/null 2>&1
+               log_must eval "mkswap $swapdev > /dev/null 2>&1"
                log_must swapon $swapdev
        else
                log_must swap -a $swapdev
index 5cf6a60b3bb2cfa2d7cb44ae1b39f48cef6d96c0..934d8942f056d5e19cbd64d6cfbf722ac6b0571b 100755 (executable)
@@ -40,7 +40,8 @@
 # 4. Verify "volmode=dev" hides partition info on the device
 # 5. Verify "volmode=default" behaves accordingly to "volmode" module parameter
 # 6. Verify "volmode" property is inherited correctly
-# 7. Verify "volmode" behaves accordingly to zvol_inhibit_dev (Linux only)
+# 7. Verify "volmode" behaves correctly at import time
+# 8. Verify "volmode" behaves accordingly to zvol_inhibit_dev (Linux only)
 #
 # NOTE: changing volmode may need to remove minors, which could be open, so call
 #       udev_wait() before we "zfs set volmode=<value>".
@@ -54,6 +55,7 @@ function cleanup
        log_must zfs inherit volmode $TESTPOOL
        udev_wait
        sysctl_inhibit_dev 0
+       sysctl_volmode 1
        udev_cleanup
 }
 
@@ -194,10 +196,18 @@ log_must zfs set volmode=full $TESTPOOL
 verify_inherited 'volmode' 'none' $SUBZVOL $VOLFS
 blockdev_missing $SUBZDEV
 blockdev_exists $ZDEV
+
+# 7. Verify "volmode" behaves correctly at import time
+log_must zpool export $TESTPOOL
+blockdev_missing $ZDEV
+blockdev_missing $SUBZDEV
+log_must zpool import $TESTPOOL
+blockdev_exists $ZDEV
+blockdev_missing $SUBZDEV
 log_must_busy zfs destroy $ZVOL
 log_must_busy zfs destroy $SUBZVOL
 
-# 7. Verify "volmode" behaves accordingly to zvol_inhibit_dev (Linux only)
+# 8. Verify "volmode" behaves accordingly to zvol_inhibit_dev (Linux only)
 if is_linux; then
        sysctl_inhibit_dev 1
        # 7.1 Verify device nodes not are not created with "volmode=full"