diff options
| author | Lori Alt <Lori.Alt@Sun.COM> | 2009-11-09 11:04:55 -0700 |
|---|---|---|
| committer | Lori Alt <Lori.Alt@Sun.COM> | 2009-11-09 11:04:55 -0700 |
| commit | 9e69d7d0feb2a0394435ca1d9746c4c3d7bf9b22 (patch) | |
| tree | cbdb5ce75ee3c1332210914bbbd7c59a2ac3d4ba /usr/src/cmd/zstreamdump | |
| parent | bb9b6b3f59b8820022416cea99b49c50fef6e391 (diff) | |
| download | illumos-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.c | 49 |
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); |
