Changeset View
Changeset View
Standalone View
Standalone View
sys/contrib/openzfs/module/zfs/dsl_dataset.c
Show First 20 Lines • Show All 2,316 Lines • ▼ Show 20 Lines | get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val) | ||||
zap_cursor_fini(&zc); | zap_cursor_fini(&zc); | ||||
return (0); | return (0); | ||||
} | } | ||||
void | 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); | ||||
fnvlist_add_nvlist(nv, zfs_prop_to_name(ZFS_PROP_CLONES), | fnvlist_add_nvlist(nv, zfs_prop_to_name(ZFS_PROP_CLONES), | ||||
propval); | propval); | ||||
} | } | ||||
nvlist_free(val); | nvlist_free(val); | ||||
▲ Show 20 Lines • Show All 2,681 Lines • Show Last 20 Lines |