Revert special case code from pre-hashtable nvlist era

Before a hash table was added on top of the nvlist code, there were
cases where the nvlist allocation was changed from fnvlist_alloc()
to nvlist_alloc() to avoid expensive NV_UNIQUE_NAME checks. Now
this is no longer necessary. These changes should be reverted to be
consistent with other code. There are some cases where this change
will also reduce the number of iterations.

Reviewed-by: Serapheim Dimitropoulos <serapheim@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Mark Maybee <mark.maybee@delphix.com>
Closes #11464
This commit is contained in:
Mark Maybee 2021-01-27 22:31:51 -07:00 committed by GitHub
parent 2921ad6cba
commit b2c5904a78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 22 deletions

View File

@ -2322,18 +2322,7 @@ void
get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv)
{ {
nvlist_t *propval = fnvlist_alloc(); nvlist_t *propval = fnvlist_alloc();
nvlist_t *val; nvlist_t *val = fnvlist_alloc();
/*
* We use nvlist_alloc() instead of fnvlist_alloc() because the
* latter would allocate the list with NV_UNIQUE_NAME flag.
* As a result, every time a clone name is appended to the list
* it would be (linearly) searched for a duplicate name.
* We already know that all clone names must be unique and we
* want avoid the quadratic complexity of double-checking that
* because we can have a large number of clones.
*/
VERIFY0(nvlist_alloc(&val, 0, KM_SLEEP));
if (get_clones_stat_impl(ds, val) == 0) { if (get_clones_stat_impl(ds, val) == 0) {
fnvlist_add_nvlist(propval, ZPROP_VALUE, val); fnvlist_add_nvlist(propval, ZPROP_VALUE, val);

View File

@ -600,26 +600,21 @@ dsl_destroy_snapshots_nvl(nvlist_t *snaps, boolean_t defer,
/* /*
* lzc_destroy_snaps() is documented to take an nvlist whose * lzc_destroy_snaps() is documented to take an nvlist whose
* values "don't matter". We need to convert that nvlist to * values "don't matter". We need to convert that nvlist to
* one that we know can be converted to LUA. We also don't * one that we know can be converted to LUA.
* care about any duplicate entries because the nvlist will
* be converted to a LUA table which should take care of this.
*/ */
nvlist_t *snaps_normalized; nvlist_t *snaps_normalized = fnvlist_alloc();
VERIFY0(nvlist_alloc(&snaps_normalized, 0, KM_SLEEP));
for (nvpair_t *pair = nvlist_next_nvpair(snaps, NULL); for (nvpair_t *pair = nvlist_next_nvpair(snaps, NULL);
pair != NULL; pair = nvlist_next_nvpair(snaps, pair)) { pair != NULL; pair = nvlist_next_nvpair(snaps, pair)) {
fnvlist_add_boolean_value(snaps_normalized, fnvlist_add_boolean_value(snaps_normalized,
nvpair_name(pair), B_TRUE); nvpair_name(pair), B_TRUE);
} }
nvlist_t *arg; nvlist_t *arg = fnvlist_alloc();
VERIFY0(nvlist_alloc(&arg, 0, KM_SLEEP));
fnvlist_add_nvlist(arg, "snaps", snaps_normalized); fnvlist_add_nvlist(arg, "snaps", snaps_normalized);
fnvlist_free(snaps_normalized); fnvlist_free(snaps_normalized);
fnvlist_add_boolean_value(arg, "defer", defer); fnvlist_add_boolean_value(arg, "defer", defer);
nvlist_t *wrapper; nvlist_t *wrapper = fnvlist_alloc();
VERIFY0(nvlist_alloc(&wrapper, 0, KM_SLEEP));
fnvlist_add_nvlist(wrapper, ZCP_ARG_ARGLIST, arg); fnvlist_add_nvlist(wrapper, ZCP_ARG_ARGLIST, arg);
fnvlist_free(arg); fnvlist_free(arg);
@ -654,7 +649,7 @@ dsl_destroy_snapshots_nvl(nvlist_t *snaps, boolean_t defer,
B_TRUE, B_TRUE,
0, 0,
zfs_lua_max_memlimit, zfs_lua_max_memlimit,
nvlist_next_nvpair(wrapper, NULL), result); fnvlist_lookup_nvpair(wrapper, ZCP_ARG_ARGLIST), result);
if (error != 0) { if (error != 0) {
char *errorstr = NULL; char *errorstr = NULL;
(void) nvlist_lookup_string(result, ZCP_RET_ERROR, &errorstr); (void) nvlist_lookup_string(result, ZCP_RET_ERROR, &errorstr);