diff options
Diffstat (limited to 'lib/libzfs')
-rw-r--r-- | lib/libzfs/libzfs_sendrecv.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c index 7d4cd1475..751e34a92 100644 --- a/lib/libzfs/libzfs_sendrecv.c +++ b/lib/libzfs/libzfs_sendrecv.c @@ -1149,15 +1149,20 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) return (err); } +/* + * Send all snapshots for a filesystem, updating the send dump data. + */ static int -dump_filesystem(zfs_handle_t *zhp, void *arg) +dump_filesystem(zfs_handle_t *zhp, send_dump_data_t *sdd) { int rv = 0; - send_dump_data_t *sdd = arg; boolean_t missingfrom = B_FALSE; zfs_cmd_t zc = {"\0"}; uint64_t min_txg = 0, max_txg = 0; + /* + * Make sure the tosnap exists. + */ (void) snprintf(zc.zc_name, sizeof (zc.zc_name), "%s@%s", zhp->zfs_name, sdd->tosnap); if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_OBJSET_STATS, &zc) != 0) { @@ -1168,47 +1173,52 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) return (0); } + /* + * If this fs does not have fromsnap, and we're doing + * recursive, we need to send a full stream from the + * beginning (or an incremental from the origin if this + * is a clone). If we're doing non-recursive, then let + * them get the error. + */ if (sdd->replicate && sdd->fromsnap) { /* - * If this fs does not have fromsnap, and we're doing - * recursive, we need to send a full stream from the - * beginning (or an incremental from the origin if this - * is a clone). If we're doing non-recursive, then let - * them get the error. + * Make sure the fromsnap exists. */ (void) snprintf(zc.zc_name, sizeof (zc.zc_name), "%s@%s", zhp->zfs_name, sdd->fromsnap); - if (zfs_ioctl(zhp->zfs_hdl, - ZFS_IOC_OBJSET_STATS, &zc) != 0) { + if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_OBJSET_STATS, &zc) != 0) missingfrom = B_TRUE; - } } - sdd->seenfrom = sdd->seento = sdd->prevsnap[0] = 0; + sdd->seenfrom = sdd->seento = B_FALSE; + sdd->prevsnap[0] = '\0'; sdd->prevsnap_obj = 0; if (sdd->fromsnap == NULL || missingfrom) sdd->seenfrom = B_TRUE; - - /* * Iterate through all snapshots and process the ones we will be * sending. If we only have a "from" and "to" snapshot to deal * with, we can avoid iterating through all the other snapshots. */ if (sdd->doall || sdd->replicate || sdd->tosnap == NULL) { - if (!sdd->replicate && sdd->fromsnap != NULL) - min_txg = get_snap_txg(zhp->zfs_hdl, zhp->zfs_name, - sdd->fromsnap); - if (!sdd->replicate && sdd->tosnap != NULL) - max_txg = get_snap_txg(zhp->zfs_hdl, zhp->zfs_name, - sdd->tosnap); - rv = zfs_iter_snapshots_sorted(zhp, dump_snapshot, arg, + if (!sdd->replicate) { + if (sdd->fromsnap != NULL) { + min_txg = get_snap_txg(zhp->zfs_hdl, + zhp->zfs_name, sdd->fromsnap); + } + if (sdd->tosnap != NULL) { + max_txg = get_snap_txg(zhp->zfs_hdl, + zhp->zfs_name, sdd->tosnap); + } + } + rv = zfs_iter_snapshots_sorted(zhp, dump_snapshot, sdd, min_txg, max_txg); } else { char snapname[MAXPATHLEN] = { 0 }; zfs_handle_t *snap; + /* Dump fromsnap. */ if (!sdd->seenfrom) { (void) snprintf(snapname, sizeof (snapname), "%s@%s", zhp->zfs_name, sdd->fromsnap); @@ -1220,6 +1230,7 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) rv = -1; } + /* Dump tosnap. */ if (rv == 0) { (void) snprintf(snapname, sizeof (snapname), "%s@%s", zhp->zfs_name, sdd->tosnap); |