summaryrefslogtreecommitdiff
path: root/usr/src/cmd/zstreamdump
diff options
context:
space:
mode:
authorLori Alt <Lori.Alt@Sun.COM>2009-11-09 11:04:55 -0700
committerLori Alt <Lori.Alt@Sun.COM>2009-11-09 11:04:55 -0700
commit9e69d7d0feb2a0394435ca1d9746c4c3d7bf9b22 (patch)
treecbdb5ce75ee3c1332210914bbbd7c59a2ac3d4ba /usr/src/cmd/zstreamdump
parentbb9b6b3f59b8820022416cea99b49c50fef6e391 (diff)
downloadillumos-joyent-9e69d7d0feb2a0394435ca1d9746c4c3d7bf9b22.tar.gz
PSARC/2009/557 ZFS send dedup
6812638 zfs send intra-stream dedup 6887817 want snapshot filtering for zfs send 6812603 zfs send can aggregate free records
Diffstat (limited to 'usr/src/cmd/zstreamdump')
-rw-r--r--usr/src/cmd/zstreamdump/zstreamdump.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/usr/src/cmd/zstreamdump/zstreamdump.c b/usr/src/cmd/zstreamdump/zstreamdump.c
index c862ac66a1..649d3e68bc 100644
--- a/usr/src/cmd/zstreamdump/zstreamdump.c
+++ b/usr/src/cmd/zstreamdump/zstreamdump.c
@@ -86,6 +86,7 @@ main(int argc, char *argv[])
struct drr_object *drro = &thedrr.drr_u.drr_object;
struct drr_freeobjects *drrfo = &thedrr.drr_u.drr_freeobjects;
struct drr_write *drrw = &thedrr.drr_u.drr_write;
+ struct drr_write_byref *drrwbr = &thedrr.drr_u.drr_write_byref;
struct drr_free *drrf = &thedrr.drr_u.drr_free;
char c;
boolean_t verbose = B_FALSE;
@@ -172,7 +173,8 @@ main(int argc, char *argv[])
case DRR_BEGIN:
if (do_byteswap) {
drrb->drr_magic = BSWAP_64(drrb->drr_magic);
- drrb->drr_version = BSWAP_64(drrb->drr_version);
+ drrb->drr_versioninfo =
+ BSWAP_64(drrb->drr_versioninfo);
drrb->drr_creation_time =
BSWAP_64(drrb->drr_creation_time);
drrb->drr_type = BSWAP_32(drrb->drr_type);
@@ -183,8 +185,10 @@ main(int argc, char *argv[])
}
(void) printf("BEGIN record\n");
- (void) printf("\tversion = %llx\n",
- (u_longlong_t)drrb->drr_version);
+ (void) printf("\thdrtype = %lld\n",
+ DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo));
+ (void) printf("\tfeatures = %llx\n",
+ DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo));
(void) printf("\tmagic = %llx\n",
(u_longlong_t)drrb->drr_magic);
(void) printf("\tcreation_time = %llx\n",
@@ -199,8 +203,8 @@ main(int argc, char *argv[])
if (verbose)
(void) printf("\n");
- if (drrb->drr_version == 2 &&
- drr->drr_payloadlen != 0) {
+ if ((DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo) ==
+ DMU_COMPOUNDSTREAM) && drr->drr_payloadlen != 0) {
nvlist_t *nv;
int sz = drr->drr_payloadlen;
@@ -264,6 +268,7 @@ main(int argc, char *argv[])
drro->drr_blksz = BSWAP_32(drro->drr_blksz);
drro->drr_bonuslen =
BSWAP_32(drro->drr_bonuslen);
+ drro->drr_toguid = BSWAP_64(drro->drr_toguid);
}
if (verbose) {
(void) printf("OBJECT object = %llu type = %u "
@@ -286,6 +291,7 @@ main(int argc, char *argv[])
BSWAP_64(drrfo->drr_firstobj);
drrfo->drr_numobjs =
BSWAP_64(drrfo->drr_numobjs);
+ drrfo->drr_toguid = BSWAP_64(drrfo->drr_toguid);
}
if (verbose) {
(void) printf("FREEOBJECTS firstobj = %llu "
@@ -301,6 +307,7 @@ main(int argc, char *argv[])
drrw->drr_type = BSWAP_32(drrw->drr_type);
drrw->drr_offset = BSWAP_64(drrw->drr_offset);
drrw->drr_length = BSWAP_64(drrw->drr_length);
+ drrw->drr_toguid = BSWAP_64(drrw->drr_toguid);
}
if (verbose) {
(void) printf("WRITE object = %llu type = %u "
@@ -314,6 +321,38 @@ main(int argc, char *argv[])
total_write_size += drrw->drr_length;
break;
+ case DRR_WRITE_BYREF:
+ if (do_byteswap) {
+ drrwbr->drr_object =
+ BSWAP_64(drrwbr->drr_object);
+ drrwbr->drr_offset =
+ BSWAP_64(drrwbr->drr_offset);
+ drrwbr->drr_length =
+ BSWAP_64(drrwbr->drr_length);
+ drrwbr->drr_toguid =
+ BSWAP_64(drrwbr->drr_toguid);
+ drrwbr->drr_refguid =
+ BSWAP_64(drrwbr->drr_refguid);
+ drrwbr->drr_refobject =
+ BSWAP_64(drrwbr->drr_refobject);
+ drrwbr->drr_refoffset =
+ BSWAP_64(drrwbr->drr_refoffset);
+ }
+ if (verbose) {
+ (void) printf("WRITE_BYREF object = %llu "
+ "offset = %llu length = %llu\n"
+ "toguid = %llx refguid = %llx\n"
+ "refobject = %llu refoffset = %llu\n",
+ (u_longlong_t)drrwbr->drr_object,
+ (u_longlong_t)drrwbr->drr_offset,
+ (u_longlong_t)drrwbr->drr_length,
+ (u_longlong_t)drrwbr->drr_toguid,
+ (u_longlong_t)drrwbr->drr_refguid,
+ (u_longlong_t)drrwbr->drr_refobject,
+ (u_longlong_t)drrwbr->drr_refoffset);
+ }
+ break;
+
case DRR_FREE:
if (do_byteswap) {
drrf->drr_object = BSWAP_64(drrf->drr_object);