aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Moeller <[email protected]>2021-07-27 16:18:29 +0000
committerBrian Behlendorf <[email protected]>2022-02-01 17:02:25 -0800
commit2b6b7111f4bae3fc84e42568d591669a6d8a1e12 (patch)
treea0d64aca0236f9503412b25f2ed686503ea77011
parentdd59c422d3b0923b3c17901d556a19b725c338da (diff)
libzfs_sendrecv: Style pass on send_iterate_prop
* Add a high level comment. * Move locals closer to point of use. * Use fnv* routines rather than explicit verification of success. * Factor out duplicated code by introducing isspacelimit to clarify behavior. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Ryan Moeller <[email protected]> Closes #12967
-rw-r--r--lib/libzfs/libzfs_sendrecv.c44
1 files changed, 19 insertions, 25 deletions
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
index 8e037cde6..d271db303 100644
--- a/lib/libzfs/libzfs_sendrecv.c
+++ b/lib/libzfs/libzfs_sendrecv.c
@@ -364,21 +364,23 @@ send_iterate_snap(zfs_handle_t *zhp, void *arg)
return (0);
}
+/*
+ * Collect all valid props from the handle snap into an nvlist.
+ */
static void
send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv)
{
- nvlist_t *props = NULL;
- nvpair_t *elem = NULL;
+ nvlist_t *props;
if (received_only)
props = zfs_get_recvd_props(zhp);
else
props = zhp->zfs_props;
+ nvpair_t *elem = NULL;
while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
char *propname = nvpair_name(elem);
zfs_prop_t prop = zfs_name_to_prop(propname);
- nvlist_t *propnv;
if (!zfs_prop_user(propname)) {
/*
@@ -396,34 +398,26 @@ send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv)
continue;
}
- verify(nvpair_value_nvlist(elem, &propnv) == 0);
- if (prop == ZFS_PROP_QUOTA || prop == ZFS_PROP_RESERVATION ||
+ nvlist_t *propnv = fnvpair_value_nvlist(elem);
+
+ boolean_t isspacelimit = (prop == ZFS_PROP_QUOTA ||
+ prop == ZFS_PROP_RESERVATION ||
prop == ZFS_PROP_REFQUOTA ||
- prop == ZFS_PROP_REFRESERVATION) {
- char *source;
- uint64_t value;
- verify(nvlist_lookup_uint64(propnv,
- ZPROP_VALUE, &value) == 0);
- if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT)
+ prop == ZFS_PROP_REFRESERVATION);
+ if (isspacelimit && zhp->zfs_type == ZFS_TYPE_SNAPSHOT)
+ continue;
+
+ char *source;
+ if (nvlist_lookup_string(propnv, ZPROP_SOURCE, &source) == 0) {
+ if (strcmp(source, zhp->zfs_name) != 0 &&
+ strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0)
continue;
+ } else {
/*
* May have no source before SPA_VERSION_RECVD_PROPS,
* but is still modifiable.
*/
- if (nvlist_lookup_string(propnv,
- ZPROP_SOURCE, &source) == 0) {
- if ((strcmp(source, zhp->zfs_name) != 0) &&
- (strcmp(source,
- ZPROP_SOURCE_VAL_RECVD) != 0))
- continue;
- }
- } else {
- char *source;
- if (nvlist_lookup_string(propnv,
- ZPROP_SOURCE, &source) != 0)
- continue;
- if ((strcmp(source, zhp->zfs_name) != 0) &&
- (strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0))
+ if (!isspacelimit)
continue;
}