mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
zfs send -p send properties only for snapshots that are actually sent
... as opposed to sending properties of all snapshots of the relevant filesystem. The previous behavior results in properties being set on all snapshots on the receiving side, which is quite slow. Behavior of zfs send -R is not changed. References: http://thread.gmane.org/gmane.comp.file-systems.openzfs.devel/346 Ported-by: Richard Yao <ryao@gentoo.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #2729 Issue #2210
This commit is contained in:
parent
7509a3d299
commit
057485504e
@ -577,6 +577,8 @@ typedef struct send_data {
|
|||||||
const char *fromsnap;
|
const char *fromsnap;
|
||||||
const char *tosnap;
|
const char *tosnap;
|
||||||
boolean_t recursive;
|
boolean_t recursive;
|
||||||
|
boolean_t seenfrom;
|
||||||
|
boolean_t seento;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The header nvlist is of the following format:
|
* The header nvlist is of the following format:
|
||||||
@ -611,20 +613,39 @@ send_iterate_snap(zfs_handle_t *zhp, void *arg)
|
|||||||
uint64_t guid = zhp->zfs_dmustats.dds_guid;
|
uint64_t guid = zhp->zfs_dmustats.dds_guid;
|
||||||
char *snapname;
|
char *snapname;
|
||||||
nvlist_t *nv;
|
nvlist_t *nv;
|
||||||
|
boolean_t isfromsnap, istosnap;
|
||||||
|
|
||||||
snapname = strrchr(zhp->zfs_name, '@')+1;
|
snapname = strrchr(zhp->zfs_name, '@')+1;
|
||||||
|
isfromsnap = (sd->fromsnap != NULL &&
|
||||||
|
strcmp(sd->fromsnap, snapname) == 0);
|
||||||
|
istosnap = (sd->tosnap != NULL && (strcmp(sd->tosnap, snapname) == 0));
|
||||||
|
|
||||||
VERIFY(0 == nvlist_add_uint64(sd->parent_snaps, snapname, guid));
|
|
||||||
/*
|
/*
|
||||||
* NB: if there is no fromsnap here (it's a newly created fs in
|
* NB: if there is no fromsnap here (it's a newly created fs in
|
||||||
* an incremental replication), we will substitute the tosnap.
|
* an incremental replication), we will substitute the tosnap.
|
||||||
*/
|
*/
|
||||||
if ((sd->fromsnap && strcmp(snapname, sd->fromsnap) == 0) ||
|
if (isfromsnap || (sd->parent_fromsnap_guid == 0 && istosnap)) {
|
||||||
(sd->parent_fromsnap_guid == 0 && sd->tosnap &&
|
|
||||||
strcmp(snapname, sd->tosnap) == 0)) {
|
|
||||||
sd->parent_fromsnap_guid = guid;
|
sd->parent_fromsnap_guid = guid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!sd->recursive) {
|
||||||
|
if (!sd->seenfrom && isfromsnap) {
|
||||||
|
sd->seenfrom = B_TRUE;
|
||||||
|
zfs_close(zhp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sd->seento || !sd->seenfrom) {
|
||||||
|
zfs_close(zhp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (istosnap)
|
||||||
|
sd->seento = B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VERIFY(0 == nvlist_add_uint64(sd->parent_snaps, snapname, guid));
|
||||||
|
|
||||||
VERIFY(0 == nvlist_alloc(&nv, NV_UNIQUE_NAME, 0));
|
VERIFY(0 == nvlist_alloc(&nv, NV_UNIQUE_NAME, 0));
|
||||||
send_iterate_prop(zhp, nv);
|
send_iterate_prop(zhp, nv);
|
||||||
VERIFY(0 == nvlist_add_nvlist(sd->snapprops, snapname, nv));
|
VERIFY(0 == nvlist_add_nvlist(sd->snapprops, snapname, nv));
|
||||||
|
Loading…
Reference in New Issue
Block a user