]> granicus.if.org Git - zfs/commitdiff
zpool should detect invalid fs property on create
authorLOLi <loli10K@users.noreply.github.com>
Thu, 13 Sep 2018 20:37:42 +0000 (22:37 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 13 Sep 2018 20:37:42 +0000 (13:37 -0700)
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.

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

cmd/zpool/zpool_main.c
tests/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh

index 37124566ed3b9ecd5196bd704d9b9717ddc824ea..818b665ae7c7ab46b430ca299bdaebc2a4f05b0e 100644 (file)
@@ -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);
                }
        }
 
index 51ddced76331d25b9299c66366311b322381368b..100a24c500c5eb3e5195eede4ba03bd40810b3a4 100755 (executable)
@@ -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 <pool> <vspec> ...' fail."
-
-str="would create '$TESTPOOL' with the following layout:"
-cat $tmpfile | grep "$str" >/dev/null 2>&1
-(( $? != 0 )) && \
-        log_fail "'zpool create -n <pool> <vspec>...' 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 <pool> <vspec> ...' fail."
+
+       str="would create '$TESTPOOL' with the following layout:"
+       grep "$str" $tmpfile >/dev/null 2>&1 || \
+               log_fail "'zpool create -n <pool> <vspec>...' 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 <pool> <vspec>...' success."