mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
DLPX-40252 integrate EP-476 compressed zfs send/receive
Authored by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Tom Caputi <tcaputi@datto.com> Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov> Ported by: David Quigley <david.quigley@intel.com> Issue #5078
This commit is contained in:
committed by
Brian Behlendorf
parent
d3c2ae1c08
commit
2aa34383b9
@@ -352,8 +352,10 @@ cksummer(void *arg)
|
||||
{
|
||||
struct drr_write *drrw = &drr->drr_u.drr_write;
|
||||
dataref_t dataref;
|
||||
uint64_t payload_size;
|
||||
|
||||
(void) ssread(buf, drrw->drr_length, ofp);
|
||||
payload_size = DRR_WRITE_PAYLOAD_SIZE(drrw);
|
||||
(void) ssread(buf, payload_size, ofp);
|
||||
|
||||
/*
|
||||
* Use the existing checksum if it's dedup-capable,
|
||||
@@ -366,7 +368,7 @@ cksummer(void *arg)
|
||||
zio_cksum_t tmpsha256;
|
||||
|
||||
zio_checksum_SHA256(buf,
|
||||
drrw->drr_length, &tmpsha256);
|
||||
payload_size, &tmpsha256);
|
||||
|
||||
drrw->drr_key.ddk_cksum.zc_word[0] =
|
||||
BE_64(tmpsha256.zc_word[0]);
|
||||
@@ -396,7 +398,7 @@ cksummer(void *arg)
|
||||
|
||||
wbr_drrr->drr_object = drrw->drr_object;
|
||||
wbr_drrr->drr_offset = drrw->drr_offset;
|
||||
wbr_drrr->drr_length = drrw->drr_length;
|
||||
wbr_drrr->drr_length = drrw->drr_logical_size;
|
||||
wbr_drrr->drr_toguid = drrw->drr_toguid;
|
||||
wbr_drrr->drr_refguid = dataref.ref_guid;
|
||||
wbr_drrr->drr_refobject =
|
||||
@@ -418,7 +420,7 @@ cksummer(void *arg)
|
||||
goto out;
|
||||
} else {
|
||||
/* block not previously seen */
|
||||
if (dump_record(drr, buf, drrw->drr_length,
|
||||
if (dump_record(drr, buf, payload_size,
|
||||
&stream_cksum, outfd) != 0)
|
||||
goto out;
|
||||
}
|
||||
@@ -836,7 +838,7 @@ typedef struct send_dump_data {
|
||||
uint64_t prevsnap_obj;
|
||||
boolean_t seenfrom, seento, replicate, doall, fromorigin;
|
||||
boolean_t verbose, dryrun, parsable, progress, embed_data, std_out;
|
||||
boolean_t large_block;
|
||||
boolean_t large_block, compress;
|
||||
int outfd;
|
||||
boolean_t err;
|
||||
nvlist_t *fss;
|
||||
@@ -852,7 +854,7 @@ typedef struct send_dump_data {
|
||||
|
||||
static int
|
||||
estimate_ioctl(zfs_handle_t *zhp, uint64_t fromsnap_obj,
|
||||
boolean_t fromorigin, uint64_t *sizep)
|
||||
boolean_t fromorigin, enum lzc_send_flags flags, uint64_t *sizep)
|
||||
{
|
||||
zfs_cmd_t zc = {"\0"};
|
||||
libzfs_handle_t *hdl = zhp->zfs_hdl;
|
||||
@@ -865,6 +867,7 @@ estimate_ioctl(zfs_handle_t *zhp, uint64_t fromsnap_obj,
|
||||
zc.zc_sendobj = zfs_prop_get_int(zhp, ZFS_PROP_OBJSETID);
|
||||
zc.zc_fromobj = fromsnap_obj;
|
||||
zc.zc_guid = 1; /* estimate flag */
|
||||
zc.zc_flags = flags;
|
||||
|
||||
if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_SEND, &zc) != 0) {
|
||||
char errbuf[1024];
|
||||
@@ -1103,6 +1106,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
||||
progress_arg_t pa = { 0 };
|
||||
pthread_t tid;
|
||||
char *thissnap;
|
||||
enum lzc_send_flags flags = 0;
|
||||
int err;
|
||||
boolean_t isfromsnap, istosnap, fromorigin;
|
||||
boolean_t exclude = B_FALSE;
|
||||
@@ -1131,6 +1135,13 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
||||
if (istosnap)
|
||||
sdd->seento = B_TRUE;
|
||||
|
||||
if (sdd->large_block)
|
||||
flags |= LZC_SEND_FLAG_LARGE_BLOCK;
|
||||
if (sdd->embed_data)
|
||||
flags |= LZC_SEND_FLAG_EMBED_DATA;
|
||||
if (sdd->compress)
|
||||
flags |= LZC_SEND_FLAG_COMPRESS;
|
||||
|
||||
if (!sdd->doall && !isfromsnap && !istosnap) {
|
||||
if (sdd->replicate) {
|
||||
char *snapname;
|
||||
@@ -1177,7 +1188,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
||||
if (sdd->verbose) {
|
||||
uint64_t size = 0;
|
||||
(void) estimate_ioctl(zhp, sdd->prevsnap_obj,
|
||||
fromorigin, &size);
|
||||
fromorigin, flags, &size);
|
||||
|
||||
send_print_verbose(fout, zhp->zfs_name,
|
||||
sdd->prevsnap[0] ? sdd->prevsnap : NULL,
|
||||
@@ -1202,12 +1213,6 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
enum lzc_send_flags flags = 0;
|
||||
if (sdd->large_block)
|
||||
flags |= LZC_SEND_FLAG_LARGE_BLOCK;
|
||||
if (sdd->embed_data)
|
||||
flags |= LZC_SEND_FLAG_EMBED_DATA;
|
||||
|
||||
err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj,
|
||||
fromorigin, sdd->outfd, flags, sdd->debugnv);
|
||||
|
||||
@@ -1513,8 +1518,12 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
||||
fromguid = 0;
|
||||
(void) nvlist_lookup_uint64(resume_nvl, "fromguid", &fromguid);
|
||||
|
||||
if (flags->largeblock || nvlist_exists(resume_nvl, "largeblockok"))
|
||||
lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK;
|
||||
if (flags->embed_data || nvlist_exists(resume_nvl, "embedok"))
|
||||
lzc_flags |= LZC_SEND_FLAG_EMBED_DATA;
|
||||
if (flags->compress || nvlist_exists(resume_nvl, "compressok"))
|
||||
lzc_flags |= LZC_SEND_FLAG_COMPRESS;
|
||||
|
||||
if (guid_to_name(hdl, toname, toguid, B_FALSE, name) != 0) {
|
||||
if (zfs_dataset_exists(hdl, toname, ZFS_TYPE_DATASET)) {
|
||||
@@ -1547,7 +1556,8 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
||||
|
||||
if (flags->verbose) {
|
||||
uint64_t size = 0;
|
||||
error = lzc_send_space(zhp->zfs_name, fromname, &size);
|
||||
error = lzc_send_space(zhp->zfs_name, fromname,
|
||||
lzc_flags, &size);
|
||||
if (error == 0)
|
||||
size = MAX(0, (int64_t)(size - bytes));
|
||||
send_print_verbose(stderr, zhp->zfs_name, fromname,
|
||||
@@ -1776,6 +1786,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
|
||||
sdd.dryrun = flags->dryrun;
|
||||
sdd.large_block = flags->largeblock;
|
||||
sdd.embed_data = flags->embed_data;
|
||||
sdd.compress = flags->compress;
|
||||
sdd.filter_cb = filter_func;
|
||||
sdd.filter_cb_arg = cb_arg;
|
||||
if (debugnvp)
|
||||
@@ -2871,11 +2882,17 @@ recv_skip(libzfs_handle_t *hdl, int fd, boolean_t byteswap)
|
||||
|
||||
case DRR_WRITE:
|
||||
if (byteswap) {
|
||||
drr->drr_u.drr_write.drr_length =
|
||||
BSWAP_64(drr->drr_u.drr_write.drr_length);
|
||||
drr->drr_u.drr_write.drr_logical_size =
|
||||
BSWAP_64(
|
||||
drr->drr_u.drr_write.drr_logical_size);
|
||||
drr->drr_u.drr_write.drr_compressed_size =
|
||||
BSWAP_64(
|
||||
drr->drr_u.drr_write.drr_compressed_size);
|
||||
}
|
||||
uint64_t payload_size =
|
||||
DRR_WRITE_PAYLOAD_SIZE(&drr->drr_u.drr_write);
|
||||
(void) recv_read(hdl, fd, buf,
|
||||
drr->drr_u.drr_write.drr_length, B_FALSE, NULL);
|
||||
payload_size, B_FALSE, NULL);
|
||||
break;
|
||||
case DRR_SPILL:
|
||||
if (byteswap) {
|
||||
|
||||
Reference in New Issue
Block a user