Fix volmode=none property behavior at import time

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
This commit is contained in:
LOLi 2017-07-31 20:07:05 +02:00 committed by Tony Hutter
parent 0c8fedeb35
commit 20c88dc3ef
3 changed files with 16 additions and 3 deletions

View File

@ -1603,6 +1603,9 @@ zvol_alloc(dev_t dev, const char *name)
if (volmode == ZFS_VOLMODE_DEFAULT) if (volmode == ZFS_VOLMODE_DEFAULT)
volmode = zvol_volmode; volmode = zvol_volmode;
if (volmode == ZFS_VOLMODE_NONE)
return (NULL);
zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP);
list_link_init(&zv->zv_next); list_link_init(&zv->zv_next);

View File

@ -3425,7 +3425,7 @@ function swap_setup
typeset swapdev=$1 typeset swapdev=$1
if is_linux; then 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 log_must swapon $swapdev
else else
log_must swap -a $swapdev log_must swap -a $swapdev

View File

@ -40,7 +40,8 @@
# 4. Verify "volmode=dev" hides partition info on the device # 4. Verify "volmode=dev" hides partition info on the device
# 5. Verify "volmode=default" behaves accordingly to "volmode" module parameter # 5. Verify "volmode=default" behaves accordingly to "volmode" module parameter
# 6. Verify "volmode" property is inherited correctly # 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 # NOTE: changing volmode may need to remove minors, which could be open, so call
# udev_wait() before we "zfs set volmode=<value>". # udev_wait() before we "zfs set volmode=<value>".
@ -54,6 +55,7 @@ function cleanup
log_must zfs inherit volmode $TESTPOOL log_must zfs inherit volmode $TESTPOOL
udev_wait udev_wait
sysctl_inhibit_dev 0 sysctl_inhibit_dev 0
sysctl_volmode 1
udev_cleanup udev_cleanup
} }
@ -194,10 +196,18 @@ log_must zfs set volmode=full $TESTPOOL
verify_inherited 'volmode' 'none' $SUBZVOL $VOLFS verify_inherited 'volmode' 'none' $SUBZVOL $VOLFS
blockdev_missing $SUBZDEV blockdev_missing $SUBZDEV
blockdev_exists $ZDEV 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 $ZVOL
log_must_busy zfs destroy $SUBZVOL 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 if is_linux; then
sysctl_inhibit_dev 1 sysctl_inhibit_dev 1
# 7.1 Verify device nodes not are not created with "volmode=full" # 7.1 Verify device nodes not are not created with "volmode=full"