From d4c2b9698e16bc1a69354886b57cf56ca7f3a244 Mon Sep 17 00:00:00 2001 From: loli10K Date: Sun, 9 Sep 2018 07:34:41 +0200 Subject: [PATCH] zpool should detect invalid fsproperty on create This change improve the handling of invalid filesystem properties when specified at pool creation: this is useful when 'zpool create -n' (dry run) is executed to detect invalid fs-level options (-O) before the actual command is run. Signed-off-by: loli10K --- cmd/zpool/zpool_main.c | 15 ++++-- .../zpool_create/zpool_create_003_pos.ksh | 52 +++++++++++++------ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 37124566ed3b..818b665ae7c7 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -536,7 +536,6 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props, boolean_t poolprop) { zpool_prop_t prop = ZPOOL_PROP_INVAL; - zfs_prop_t fprop; nvlist_t *proplist; const char *normnm; char *strval; @@ -580,10 +579,18 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props, else normnm = zpool_prop_to_name(prop); } else { - if ((fprop = zfs_name_to_prop(propname)) != ZPROP_INVAL) { - normnm = zfs_prop_to_name(fprop); - } else { + zfs_prop_t fsprop = zfs_name_to_prop(propname); + + if (zfs_prop_valid_for_type(fsprop, ZFS_TYPE_FILESYSTEM, + B_FALSE)) { + normnm = zfs_prop_to_name(fsprop); + } else if (zfs_prop_user(propname) || + zfs_prop_userquota(propname)) { normnm = propname; + } else { + (void) fprintf(stderr, gettext("property '%s' is " + "not a valid filesystem property\n"), propname); + return (2); } } diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh b/tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh index 51ddced76331..100a24c500c5 100755 --- a/tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh +++ b/tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh @@ -38,7 +38,8 @@ # actually creating the pool. # # STRATEGY: -# 1. Create storage pool with -n option +# 1. Create storage pool with -n option; this should only work when valid +# properties are specified on the command line # 2. Verify the pool has not been actually created # @@ -67,20 +68,39 @@ if is_mpath_device $DISK; then partition_disk $SIZE $disk 1 fi -# -# Make sure disk is clean before we use it -# -create_pool $TESTPOOL ${disk}${SLICE_PREFIX}${SLICE0} > $tmpfile -destroy_pool $TESTPOOL - -zpool create -n $TESTPOOL ${disk}${SLICE_PREFIX}${SLICE0} > $tmpfile - -poolexists $TESTPOOL && \ - log_fail "'zpool create -n ...' fail." - -str="would create '$TESTPOOL' with the following layout:" -cat $tmpfile | grep "$str" >/dev/null 2>&1 -(( $? != 0 )) && \ - log_fail "'zpool create -n ...' is executed as unexpected." +typeset vspec="${disk}${SLICE_PREFIX}${SLICE0}" +typeset goodprops=('' '-o comment=text' '-O checksum=on' '-O ns:prop=value') +typeset badprops=('-o ashift=9999' '-O doesnotexist=on' '-O volsize=10M') + +# Verify zpool create -n with valid pool-level and fs-level options +for prop in "${goodprops[@]}" +do + # + # Make sure disk is clean before we use it + # + create_pool $TESTPOOL $vspec > $tmpfile + destroy_pool $TESTPOOL + + log_must eval "zpool create -n $prop $TESTPOOL $vspec > $tmpfile" + + poolexists $TESTPOOL && \ + log_fail "'zpool create -n ...' fail." + + str="would create '$TESTPOOL' with the following layout:" + grep "$str" $tmpfile >/dev/null 2>&1 || \ + log_fail "'zpool create -n ...' is executed as unexpected." +done + +# Verify zpool create -n with invalid options +for prop in "${badprops[@]}" +do + # + # Make sure disk is clean before we use it + # + create_pool $TESTPOOL $vspec > $tmpfile + destroy_pool $TESTPOOL + + log_mustnot zpool create -n $prop $TESTPOOL $vspec +done log_pass "'zpool create -n ...' success."