From: Alexander Boyko Date: Thu, 7 Oct 2021 09:57:41 +0000 (-0400) Subject: LU-15071 utils: tunefs erease-params for zfs X-Git-Tag: 2.14.56~132 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=d67bd765f67082204094a20373b4e2c476ecfd81 LU-15071 utils: tunefs erease-params for zfs The patch exclude special zfs params for tunefs erase-params, skip nvlist modifying. Also fixes test_89 conf-sanity. tunefs --erase-params produced segmentation fault with old code. Test-Parameters: trivial fstype=zfs testlist=conf-sanity HPE-bug-id: LUS-10314 Signed-off-by: Alexander Boyko Change-Id: Ic8385a99ca896ce6d855692b3f77e198bf583d94 Reviewed-on: https://review.whamcloud.com/45145 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andriy Skulysh Reviewed-by: Artem Blagodarenko Reviewed-by: Oleg Drokin --- diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index e066261..145c0f2 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -6493,12 +6493,15 @@ test_89() { # LU-7131 stopall - [ "$mds1_FSTYPE" == zfs ] && import_zpool mds1 + if [[ "$mds1_FSTYPE" == zfs ]]; then + import_zpool mds1 || return ${PIPESTATUS[0]} + fi + # Check that parameters are added correctly echo "tunefs --param $key=$val1" - do_facet mds "$TUNEFS --param $key=$val1 $mdsdev >/dev/null" || + do_facet mds1 "$TUNEFS --param $key=$val1 $mdsdev >/dev/null" || error "tunefs --param $key=$val1 failed" - params=$(do_facet mds $TUNEFS --dryrun $mdsdev) || + params=$(do_facet mds1 $TUNEFS --dryrun $mdsdev) || error "tunefs --dryrun failed" params=${params##*Parameters:} params=${params%%exiting*} @@ -6507,9 +6510,9 @@ test_89() { # LU-7131 # Check that parameters replace existing instances when added echo "tunefs --param $key=$val2" - do_facet mds "$TUNEFS --param $key=$val2 $mdsdev >/dev/null" || + do_facet mds1 "$TUNEFS --param $key=$val2 $mdsdev >/dev/null" || error "tunefs --param $key=$val2 failed" - params=$(do_facet mds $TUNEFS --dryrun $mdsdev) || + params=$(do_facet mds1 $TUNEFS --dryrun $mdsdev) || error "tunefs --dryrun failed" params=${params##*Parameters:} params=${params%%exiting*} @@ -6520,9 +6523,9 @@ test_89() { # LU-7131 # Check that a parameter is erased properly echo "tunefs --erase-param $key" - do_facet mds "$TUNEFS --erase-param $key $mdsdev >/dev/null" || + do_facet mds1 "$TUNEFS --erase-param $key $mdsdev >/dev/null" || error "tunefs --erase-param $key failed" - params=$(do_facet mds $TUNEFS --dryrun $mdsdev) || + params=$(do_facet mds1 $TUNEFS --dryrun $mdsdev) || error "tunefs --dryrun failed" params=${params##*Parameters:} params=${params%%exiting*} @@ -6530,22 +6533,25 @@ test_89() { # LU-7131 error "on-disk parameter not erased correctly via tunefs" # Check that all the parameters are erased + do_facet mds1 "$TUNEFS --param $key=$val1 $mdsdev >/dev/null" || + error "tunefs --param $key=$val1 failed" echo "tunefs --erase-params" - do_facet mds "$TUNEFS --erase-params $mdsdev >/dev/null" || + do_facet mds1 "$TUNEFS --erase-params $mdsdev >/dev/null" || error "tunefs --erase-params failed" - params=$(do_facet mds $TUNEFS --dryrun $mdsdev) || + params=$(do_facet mds1 $TUNEFS --dryrun $mdsdev) || error "tunefs --dryrun failed" params=${params##*Parameters:} params=${params%%exiting*} - [ -z $params ] || - error "all on-disk parameters not erased correctly via tunefs" + params=$(echo $params | tr ' ' '\n') + [ -z "$params" ] || + error "all on-disk parameters not erased correctly via tunefs $params" # Check the order of options --erase-params and --param echo "tunefs --param $key=$val1 --erase-params" - do_facet mds \ + do_facet mds1 \ "$TUNEFS --param $key=$val1 --erase-params $mdsdev >/dev/null"|| error "tunefs --param $key=$val1 --erase-params failed" - params=$(do_facet mds $TUNEFS --dryrun $mdsdev) || + params=$(do_facet mds1 $TUNEFS --dryrun $mdsdev) || error "tunefs --dryrun failed" params=${params##*Parameters:} params=${params%%exiting*} diff --git a/lustre/utils/libmount_utils_zfs.c b/lustre/utils/libmount_utils_zfs.c index 9e468ad..71966fc 100644 --- a/lustre/utils/libmount_utils_zfs.c +++ b/lustre/utils/libmount_utils_zfs.c @@ -173,24 +173,61 @@ static int zfs_erase_prop(zfs_handle_t *zhp, char *param) return zfs_remove_prop(zhp, nvl, propname); } +static int zfs_is_special_ldd_prop_param(char *name) +{ + int i; + + for (i = 0; special_ldd_prop_params[i].zlpb_prop_name != NULL; i++) + if (!strcmp(name, special_ldd_prop_params[i].zlpb_prop_name)) + return 1; + + return 0; +} + static int zfs_erase_allprops(zfs_handle_t *zhp) { - nvlist_t *nvl; - nvpair_t *curr = NULL; + nvlist_t *props; + nvpair_t *nvp; + size_t str_size = 1024 * 1024; + char *strs, *cur; + int rc = 0; - nvl = zfs_get_user_props(zhp); - if (!nvl) + strs = malloc(str_size); + if (!strs) + return ENOMEM; + cur = strs; + + props = zfs_get_user_props(zhp); + if (props == NULL) { + free(strs); return ENOENT; + } + nvp = NULL; + while (nvp = nvlist_next_nvpair(props, nvp), nvp) { + if (strncmp(nvpair_name(nvp), LDD_PREFIX, strlen(LDD_PREFIX))) + continue; - curr = nvlist_next_nvpair(nvl, curr); - while (curr) { - nvpair_t *next = nvlist_next_nvpair(nvl, curr); + if (zfs_is_special_ldd_prop_param(nvpair_name(nvp))) + continue; - zfs_remove_prop(zhp, nvl, nvpair_name(curr)); - curr = next; + rc = snprintf(cur, str_size - (cur - strs), "%s", + nvpair_name(nvp)); + if (rc != strlen(nvpair_name(nvp))) { + fprintf(stderr, "%s: zfs has too many properties to erase, please repeat\n", + progname); + rc = EINVAL; + break; + } + cur += strlen(cur) + 1; + } + cur = strs; + while ( cur < (strs + str_size) && strlen(cur) > 0) { + zfs_prop_inherit(zhp, cur, false); + cur += strlen(cur) + 1; } - return 0; + free(strs); + return rc; } /* * ZFS on linux 0.7.0-rc5 commit 379ca9cf2beba802f096273e89e30914a2d6bafc @@ -482,17 +519,6 @@ static int zfs_get_prop_str(zfs_handle_t *zhp, char *prop, void *val) return ret; } -static int zfs_is_special_ldd_prop_param(char *name) -{ - int i; - - for (i = 0; special_ldd_prop_params[i].zlpb_prop_name != NULL; i++) - if (!strcmp(name, special_ldd_prop_params[i].zlpb_prop_name)) - return 1; - - return 0; -} - static int zfs_get_prop_params(zfs_handle_t *zhp, char *param) { nvlist_t *props;