1495db6fbSLori Alt /* 2495db6fbSLori Alt * CDDL HEADER START 3495db6fbSLori Alt * 4495db6fbSLori Alt * The contents of this file are subject to the terms of the 5495db6fbSLori Alt * Common Development and Distribution License (the "License"). 6495db6fbSLori Alt * You may not use this file except in compliance with the License. 7495db6fbSLori Alt * 8495db6fbSLori Alt * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9495db6fbSLori Alt * or http://www.opensolaris.org/os/licensing. 10495db6fbSLori Alt * See the License for the specific language governing permissions 11495db6fbSLori Alt * and limitations under the License. 12495db6fbSLori Alt * 13495db6fbSLori Alt * When distributing Covered Code, include this CDDL HEADER in each 14495db6fbSLori Alt * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15495db6fbSLori Alt * If applicable, add the following below this CDDL HEADER, with the 16495db6fbSLori Alt * fields enclosed by brackets "[]" replaced with your own identifying 17495db6fbSLori Alt * information: Portions Copyright [yyyy] [name of copyright owner] 18495db6fbSLori Alt * 19495db6fbSLori Alt * CDDL HEADER END 20495db6fbSLori Alt */ 21495db6fbSLori Alt 22495db6fbSLori Alt /* 23495db6fbSLori Alt * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24495db6fbSLori Alt * Use is subject to license terms. 25495db6fbSLori Alt */ 26495db6fbSLori Alt 27495db6fbSLori Alt #include <libnvpair.h> 28495db6fbSLori Alt #include <stdio.h> 29495db6fbSLori Alt #include <stdlib.h> 30495db6fbSLori Alt #include <strings.h> 31495db6fbSLori Alt #include <unistd.h> 32495db6fbSLori Alt 33495db6fbSLori Alt #include <sys/dmu.h> 34495db6fbSLori Alt #include <sys/zfs_ioctl.h> 35495db6fbSLori Alt #include <zfs_fletcher.h> 36495db6fbSLori Alt 37495db6fbSLori Alt uint64_t drr_record_count[DRR_NUMTYPES]; 38495db6fbSLori Alt uint64_t total_write_size = 0; 39495db6fbSLori Alt uint64_t total_stream_len = 0; 40495db6fbSLori Alt FILE *send_stream = 0; 41495db6fbSLori Alt boolean_t do_byteswap = B_FALSE; 42495db6fbSLori Alt boolean_t do_cksum = B_TRUE; 43495db6fbSLori Alt #define INITIAL_BUFLEN (1<<20) 44495db6fbSLori Alt 45495db6fbSLori Alt static void 46495db6fbSLori Alt usage(void) 47495db6fbSLori Alt { 48495db6fbSLori Alt (void) fprintf(stderr, "usage: zstreamdump [-v] [-C] < file\n"); 49495db6fbSLori Alt (void) fprintf(stderr, "\t -v -- verbose\n"); 50495db6fbSLori Alt (void) fprintf(stderr, "\t -C -- suppress checksum verification\n"); 51495db6fbSLori Alt exit(1); 52495db6fbSLori Alt } 53495db6fbSLori Alt 54495db6fbSLori Alt /* 55495db6fbSLori Alt * ssread - send stream read. 56495db6fbSLori Alt * 57495db6fbSLori Alt * Read while computing incremental checksum 58495db6fbSLori Alt */ 59495db6fbSLori Alt 60495db6fbSLori Alt static size_t 61495db6fbSLori Alt ssread(void *buf, size_t len, zio_cksum_t *cksum) 62495db6fbSLori Alt { 63495db6fbSLori Alt size_t outlen; 64495db6fbSLori Alt 65495db6fbSLori Alt if ((outlen = fread(buf, len, 1, send_stream)) == 0) 66495db6fbSLori Alt return (0); 67495db6fbSLori Alt 68495db6fbSLori Alt if (do_cksum && cksum) { 69495db6fbSLori Alt if (do_byteswap) 70495db6fbSLori Alt fletcher_4_incremental_byteswap(buf, len, cksum); 71495db6fbSLori Alt else 72495db6fbSLori Alt fletcher_4_incremental_native(buf, len, cksum); 73495db6fbSLori Alt } 74495db6fbSLori Alt total_stream_len += len; 75495db6fbSLori Alt return (outlen); 76495db6fbSLori Alt } 77495db6fbSLori Alt 78495db6fbSLori Alt int 79495db6fbSLori Alt main(int argc, char *argv[]) 80495db6fbSLori Alt { 81495db6fbSLori Alt char *buf = malloc(INITIAL_BUFLEN); 82495db6fbSLori Alt dmu_replay_record_t thedrr; 83495db6fbSLori Alt dmu_replay_record_t *drr = &thedrr; 84495db6fbSLori Alt struct drr_begin *drrb = &thedrr.drr_u.drr_begin; 85495db6fbSLori Alt struct drr_end *drre = &thedrr.drr_u.drr_end; 86495db6fbSLori Alt struct drr_object *drro = &thedrr.drr_u.drr_object; 87495db6fbSLori Alt struct drr_freeobjects *drrfo = &thedrr.drr_u.drr_freeobjects; 88495db6fbSLori Alt struct drr_write *drrw = &thedrr.drr_u.drr_write; 89*9e69d7d0SLori Alt struct drr_write_byref *drrwbr = &thedrr.drr_u.drr_write_byref; 90495db6fbSLori Alt struct drr_free *drrf = &thedrr.drr_u.drr_free; 91495db6fbSLori Alt char c; 92495db6fbSLori Alt boolean_t verbose = B_FALSE; 93495db6fbSLori Alt boolean_t first = B_TRUE; 94495db6fbSLori Alt int i, err; 95495db6fbSLori Alt zio_cksum_t zc = { 0 }; 96495db6fbSLori Alt zio_cksum_t pcksum = { 0 }; 97495db6fbSLori Alt 98495db6fbSLori Alt while ((c = getopt(argc, argv, ":vC")) != -1) { 99495db6fbSLori Alt switch (c) { 100495db6fbSLori Alt case 'C': 101495db6fbSLori Alt do_cksum = B_FALSE; 102495db6fbSLori Alt break; 103495db6fbSLori Alt case 'v': 104495db6fbSLori Alt verbose = B_TRUE; 105495db6fbSLori Alt break; 106495db6fbSLori Alt case ':': 107495db6fbSLori Alt (void) fprintf(stderr, 108495db6fbSLori Alt "missing argument for '%c' option\n", optopt); 109495db6fbSLori Alt usage(); 110495db6fbSLori Alt break; 111495db6fbSLori Alt case '?': 112495db6fbSLori Alt (void) fprintf(stderr, "invalid option '%c'\n", 113495db6fbSLori Alt optopt); 114495db6fbSLori Alt usage(); 115495db6fbSLori Alt } 116495db6fbSLori Alt } 117495db6fbSLori Alt 118495db6fbSLori Alt if (isatty(STDIN_FILENO)) { 119495db6fbSLori Alt (void) fprintf(stderr, 120495db6fbSLori Alt "Error: Backup stream can not be read " 121495db6fbSLori Alt "from a terminal.\n" 122495db6fbSLori Alt "You must redirect standard input.\n"); 123495db6fbSLori Alt exit(1); 124495db6fbSLori Alt } 125495db6fbSLori Alt 126495db6fbSLori Alt send_stream = stdin; 127495db6fbSLori Alt pcksum = zc; 128495db6fbSLori Alt while (ssread(drr, sizeof (dmu_replay_record_t), &zc)) { 129495db6fbSLori Alt 130495db6fbSLori Alt if (first) { 131495db6fbSLori Alt if (drrb->drr_magic == BSWAP_64(DMU_BACKUP_MAGIC)) { 132495db6fbSLori Alt do_byteswap = B_TRUE; 133495db6fbSLori Alt if (do_cksum) { 134495db6fbSLori Alt ZIO_SET_CHECKSUM(&zc, 0, 0, 0, 0); 135495db6fbSLori Alt /* 136495db6fbSLori Alt * recalculate header checksum now 137495db6fbSLori Alt * that we know it needs to be 138495db6fbSLori Alt * byteswapped. 139495db6fbSLori Alt */ 140495db6fbSLori Alt fletcher_4_incremental_byteswap(drr, 141495db6fbSLori Alt sizeof (dmu_replay_record_t), &zc); 142495db6fbSLori Alt } 143495db6fbSLori Alt } else if (drrb->drr_magic != DMU_BACKUP_MAGIC) { 144495db6fbSLori Alt (void) fprintf(stderr, "Invalid stream " 145495db6fbSLori Alt "(bad magic number)\n"); 146495db6fbSLori Alt exit(1); 147495db6fbSLori Alt } 148495db6fbSLori Alt first = B_FALSE; 149495db6fbSLori Alt } 150495db6fbSLori Alt if (do_byteswap) { 151495db6fbSLori Alt drr->drr_type = BSWAP_32(drr->drr_type); 152495db6fbSLori Alt drr->drr_payloadlen = 153495db6fbSLori Alt BSWAP_32(drr->drr_payloadlen); 154495db6fbSLori Alt } 155495db6fbSLori Alt 156495db6fbSLori Alt /* 157495db6fbSLori Alt * At this point, the leading fields of the replay record 158495db6fbSLori Alt * (drr_type and drr_payloadlen) have been byte-swapped if 159495db6fbSLori Alt * necessary, but the rest of the data structure (the 160495db6fbSLori Alt * union of type-specific structures) is still in its 161495db6fbSLori Alt * original state. 162495db6fbSLori Alt */ 163495db6fbSLori Alt if (drr->drr_type >= DRR_NUMTYPES) { 164495db6fbSLori Alt (void) printf("INVALID record found: type 0x%x\n", 165495db6fbSLori Alt drr->drr_type); 166495db6fbSLori Alt (void) printf("Aborting.\n"); 167495db6fbSLori Alt exit(1); 168495db6fbSLori Alt } 169495db6fbSLori Alt 170495db6fbSLori Alt drr_record_count[drr->drr_type]++; 171495db6fbSLori Alt 172495db6fbSLori Alt switch (drr->drr_type) { 173495db6fbSLori Alt case DRR_BEGIN: 174495db6fbSLori Alt if (do_byteswap) { 175495db6fbSLori Alt drrb->drr_magic = BSWAP_64(drrb->drr_magic); 176*9e69d7d0SLori Alt drrb->drr_versioninfo = 177*9e69d7d0SLori Alt BSWAP_64(drrb->drr_versioninfo); 178495db6fbSLori Alt drrb->drr_creation_time = 179495db6fbSLori Alt BSWAP_64(drrb->drr_creation_time); 180495db6fbSLori Alt drrb->drr_type = BSWAP_32(drrb->drr_type); 181495db6fbSLori Alt drrb->drr_flags = BSWAP_32(drrb->drr_flags); 182495db6fbSLori Alt drrb->drr_toguid = BSWAP_64(drrb->drr_toguid); 183495db6fbSLori Alt drrb->drr_fromguid = 184495db6fbSLori Alt BSWAP_64(drrb->drr_fromguid); 185495db6fbSLori Alt } 186495db6fbSLori Alt 187495db6fbSLori Alt (void) printf("BEGIN record\n"); 188*9e69d7d0SLori Alt (void) printf("\thdrtype = %lld\n", 189*9e69d7d0SLori Alt DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo)); 190*9e69d7d0SLori Alt (void) printf("\tfeatures = %llx\n", 191*9e69d7d0SLori Alt DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo)); 192495db6fbSLori Alt (void) printf("\tmagic = %llx\n", 193495db6fbSLori Alt (u_longlong_t)drrb->drr_magic); 194495db6fbSLori Alt (void) printf("\tcreation_time = %llx\n", 195495db6fbSLori Alt (u_longlong_t)drrb->drr_creation_time); 196495db6fbSLori Alt (void) printf("\ttype = %u\n", drrb->drr_type); 197495db6fbSLori Alt (void) printf("\tflags = 0x%x\n", drrb->drr_flags); 198495db6fbSLori Alt (void) printf("\ttoguid = %llx\n", 199495db6fbSLori Alt (u_longlong_t)drrb->drr_toguid); 200495db6fbSLori Alt (void) printf("\tfromguid = %llx\n", 201495db6fbSLori Alt (u_longlong_t)drrb->drr_fromguid); 202495db6fbSLori Alt (void) printf("\ttoname = %s\n", drrb->drr_toname); 203495db6fbSLori Alt if (verbose) 204495db6fbSLori Alt (void) printf("\n"); 205495db6fbSLori Alt 206*9e69d7d0SLori Alt if ((DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo) == 207*9e69d7d0SLori Alt DMU_COMPOUNDSTREAM) && drr->drr_payloadlen != 0) { 208495db6fbSLori Alt nvlist_t *nv; 209495db6fbSLori Alt int sz = drr->drr_payloadlen; 210495db6fbSLori Alt 211495db6fbSLori Alt if (sz > 1<<20) { 212495db6fbSLori Alt free(buf); 213495db6fbSLori Alt buf = malloc(sz); 214495db6fbSLori Alt } 215495db6fbSLori Alt (void) ssread(buf, sz, &zc); 216495db6fbSLori Alt if (ferror(send_stream)) 217495db6fbSLori Alt perror("fread"); 218495db6fbSLori Alt err = nvlist_unpack(buf, sz, &nv, 0); 219495db6fbSLori Alt if (err) 220495db6fbSLori Alt perror(strerror(err)); 221495db6fbSLori Alt nvlist_print(stdout, nv); 222495db6fbSLori Alt nvlist_free(nv); 223495db6fbSLori Alt } 224495db6fbSLori Alt break; 225495db6fbSLori Alt 226495db6fbSLori Alt case DRR_END: 227495db6fbSLori Alt if (do_byteswap) { 228495db6fbSLori Alt drre->drr_checksum.zc_word[0] = 229495db6fbSLori Alt BSWAP_64(drre->drr_checksum.zc_word[0]); 230495db6fbSLori Alt drre->drr_checksum.zc_word[1] = 231495db6fbSLori Alt BSWAP_64(drre->drr_checksum.zc_word[1]); 232495db6fbSLori Alt drre->drr_checksum.zc_word[2] = 233495db6fbSLori Alt BSWAP_64(drre->drr_checksum.zc_word[2]); 234495db6fbSLori Alt drre->drr_checksum.zc_word[3] = 235495db6fbSLori Alt BSWAP_64(drre->drr_checksum.zc_word[3]); 236495db6fbSLori Alt } 237495db6fbSLori Alt /* 238495db6fbSLori Alt * We compare against the *previous* checksum 239495db6fbSLori Alt * value, because the stored checksum is of 240495db6fbSLori Alt * everything before the DRR_END record. 241495db6fbSLori Alt */ 242495db6fbSLori Alt if (do_cksum && !ZIO_CHECKSUM_EQUAL(drre->drr_checksum, 243495db6fbSLori Alt pcksum)) { 244495db6fbSLori Alt (void) printf("Expected checksum differs from " 245495db6fbSLori Alt "checksum in stream.\n"); 246495db6fbSLori Alt (void) printf("Expected checksum = " 247495db6fbSLori Alt "%llx/%llx/%llx/%llx\n", 248495db6fbSLori Alt pcksum.zc_word[0], 249495db6fbSLori Alt pcksum.zc_word[1], 250495db6fbSLori Alt pcksum.zc_word[2], 251495db6fbSLori Alt pcksum.zc_word[3]); 252495db6fbSLori Alt } 253495db6fbSLori Alt (void) printf("END checksum = %llx/%llx/%llx/%llx\n", 254495db6fbSLori Alt drre->drr_checksum.zc_word[0], 255495db6fbSLori Alt drre->drr_checksum.zc_word[1], 256495db6fbSLori Alt drre->drr_checksum.zc_word[2], 257495db6fbSLori Alt drre->drr_checksum.zc_word[3]); 258495db6fbSLori Alt 259495db6fbSLori Alt ZIO_SET_CHECKSUM(&zc, 0, 0, 0, 0); 260495db6fbSLori Alt break; 261495db6fbSLori Alt 262495db6fbSLori Alt case DRR_OBJECT: 263495db6fbSLori Alt if (do_byteswap) { 264495db6fbSLori Alt drro->drr_object = BSWAP_64(drro->drr_object); 265495db6fbSLori Alt drro->drr_type = BSWAP_32(drro->drr_type); 266495db6fbSLori Alt drro->drr_bonustype = 267495db6fbSLori Alt BSWAP_32(drro->drr_bonustype); 268495db6fbSLori Alt drro->drr_blksz = BSWAP_32(drro->drr_blksz); 269495db6fbSLori Alt drro->drr_bonuslen = 270495db6fbSLori Alt BSWAP_32(drro->drr_bonuslen); 271*9e69d7d0SLori Alt drro->drr_toguid = BSWAP_64(drro->drr_toguid); 272495db6fbSLori Alt } 273495db6fbSLori Alt if (verbose) { 274495db6fbSLori Alt (void) printf("OBJECT object = %llu type = %u " 275495db6fbSLori Alt "bonustype = %u blksz = %u bonuslen = %u\n", 276495db6fbSLori Alt (u_longlong_t)drro->drr_object, 277495db6fbSLori Alt drro->drr_type, 278495db6fbSLori Alt drro->drr_bonustype, 279495db6fbSLori Alt drro->drr_blksz, 280495db6fbSLori Alt drro->drr_bonuslen); 281495db6fbSLori Alt } 282495db6fbSLori Alt if (drro->drr_bonuslen > 0) { 283495db6fbSLori Alt (void) ssread(buf, P2ROUNDUP(drro->drr_bonuslen, 284495db6fbSLori Alt 8), &zc); 285495db6fbSLori Alt } 286495db6fbSLori Alt break; 287495db6fbSLori Alt 288495db6fbSLori Alt case DRR_FREEOBJECTS: 289495db6fbSLori Alt if (do_byteswap) { 290495db6fbSLori Alt drrfo->drr_firstobj = 291495db6fbSLori Alt BSWAP_64(drrfo->drr_firstobj); 292495db6fbSLori Alt drrfo->drr_numobjs = 293495db6fbSLori Alt BSWAP_64(drrfo->drr_numobjs); 294*9e69d7d0SLori Alt drrfo->drr_toguid = BSWAP_64(drrfo->drr_toguid); 295495db6fbSLori Alt } 296495db6fbSLori Alt if (verbose) { 297495db6fbSLori Alt (void) printf("FREEOBJECTS firstobj = %llu " 298495db6fbSLori Alt "numobjs = %llu\n", 299495db6fbSLori Alt (u_longlong_t)drrfo->drr_firstobj, 300495db6fbSLori Alt (u_longlong_t)drrfo->drr_numobjs); 301495db6fbSLori Alt } 302495db6fbSLori Alt break; 303495db6fbSLori Alt 304495db6fbSLori Alt case DRR_WRITE: 305495db6fbSLori Alt if (do_byteswap) { 306495db6fbSLori Alt drrw->drr_object = BSWAP_64(drrw->drr_object); 307495db6fbSLori Alt drrw->drr_type = BSWAP_32(drrw->drr_type); 308495db6fbSLori Alt drrw->drr_offset = BSWAP_64(drrw->drr_offset); 309495db6fbSLori Alt drrw->drr_length = BSWAP_64(drrw->drr_length); 310*9e69d7d0SLori Alt drrw->drr_toguid = BSWAP_64(drrw->drr_toguid); 311495db6fbSLori Alt } 312495db6fbSLori Alt if (verbose) { 313495db6fbSLori Alt (void) printf("WRITE object = %llu type = %u " 314495db6fbSLori Alt "offset = %llu length = %llu\n", 315495db6fbSLori Alt (u_longlong_t)drrw->drr_object, 316495db6fbSLori Alt drrw->drr_type, 317495db6fbSLori Alt (u_longlong_t)drrw->drr_offset, 318495db6fbSLori Alt (u_longlong_t)drrw->drr_length); 319495db6fbSLori Alt } 320495db6fbSLori Alt (void) ssread(buf, drrw->drr_length, &zc); 321495db6fbSLori Alt total_write_size += drrw->drr_length; 322495db6fbSLori Alt break; 323495db6fbSLori Alt 324*9e69d7d0SLori Alt case DRR_WRITE_BYREF: 325*9e69d7d0SLori Alt if (do_byteswap) { 326*9e69d7d0SLori Alt drrwbr->drr_object = 327*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_object); 328*9e69d7d0SLori Alt drrwbr->drr_offset = 329*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_offset); 330*9e69d7d0SLori Alt drrwbr->drr_length = 331*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_length); 332*9e69d7d0SLori Alt drrwbr->drr_toguid = 333*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_toguid); 334*9e69d7d0SLori Alt drrwbr->drr_refguid = 335*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_refguid); 336*9e69d7d0SLori Alt drrwbr->drr_refobject = 337*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_refobject); 338*9e69d7d0SLori Alt drrwbr->drr_refoffset = 339*9e69d7d0SLori Alt BSWAP_64(drrwbr->drr_refoffset); 340*9e69d7d0SLori Alt } 341*9e69d7d0SLori Alt if (verbose) { 342*9e69d7d0SLori Alt (void) printf("WRITE_BYREF object = %llu " 343*9e69d7d0SLori Alt "offset = %llu length = %llu\n" 344*9e69d7d0SLori Alt "toguid = %llx refguid = %llx\n" 345*9e69d7d0SLori Alt "refobject = %llu refoffset = %llu\n", 346*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_object, 347*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_offset, 348*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_length, 349*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_toguid, 350*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_refguid, 351*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_refobject, 352*9e69d7d0SLori Alt (u_longlong_t)drrwbr->drr_refoffset); 353*9e69d7d0SLori Alt } 354*9e69d7d0SLori Alt break; 355*9e69d7d0SLori Alt 356495db6fbSLori Alt case DRR_FREE: 357495db6fbSLori Alt if (do_byteswap) { 358495db6fbSLori Alt drrf->drr_object = BSWAP_64(drrf->drr_object); 359495db6fbSLori Alt drrf->drr_offset = BSWAP_64(drrf->drr_offset); 360495db6fbSLori Alt drrf->drr_length = BSWAP_64(drrf->drr_length); 361495db6fbSLori Alt } 362495db6fbSLori Alt if (verbose) { 363495db6fbSLori Alt (void) printf("FREE object = %llu " 364495db6fbSLori Alt "offset = %llu length = %lld\n", 365495db6fbSLori Alt (u_longlong_t)drrf->drr_object, 366495db6fbSLori Alt (u_longlong_t)drrf->drr_offset, 367495db6fbSLori Alt (longlong_t)drrf->drr_length); 368495db6fbSLori Alt } 369495db6fbSLori Alt break; 370495db6fbSLori Alt } 371495db6fbSLori Alt pcksum = zc; 372495db6fbSLori Alt } 373495db6fbSLori Alt free(buf); 374495db6fbSLori Alt 375495db6fbSLori Alt /* Print final summary */ 376495db6fbSLori Alt 377495db6fbSLori Alt (void) printf("SUMMARY:\n"); 378495db6fbSLori Alt (void) printf("\tTotal DRR_BEGIN records = %lld\n", 379495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_BEGIN]); 380495db6fbSLori Alt (void) printf("\tTotal DRR_END records = %lld\n", 381495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_END]); 382495db6fbSLori Alt (void) printf("\tTotal DRR_OBJECT records = %lld\n", 383495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_OBJECT]); 384495db6fbSLori Alt (void) printf("\tTotal DRR_FREEOBJECTS records = %lld\n", 385495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_FREEOBJECTS]); 386495db6fbSLori Alt (void) printf("\tTotal DRR_WRITE records = %lld\n", 387495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_WRITE]); 388495db6fbSLori Alt (void) printf("\tTotal DRR_FREE records = %lld\n", 389495db6fbSLori Alt (u_longlong_t)drr_record_count[DRR_FREE]); 390495db6fbSLori Alt (void) printf("\tTotal records = %lld\n", 391495db6fbSLori Alt (u_longlong_t)(drr_record_count[DRR_BEGIN] + 392495db6fbSLori Alt drr_record_count[DRR_OBJECT] + 393495db6fbSLori Alt drr_record_count[DRR_FREEOBJECTS] + 394495db6fbSLori Alt drr_record_count[DRR_WRITE] + 395495db6fbSLori Alt drr_record_count[DRR_FREE] + 396495db6fbSLori Alt drr_record_count[DRR_END])); 397495db6fbSLori Alt (void) printf("\tTotal write size = %lld (0x%llx)\n", 398495db6fbSLori Alt (u_longlong_t)total_write_size, (u_longlong_t)total_write_size); 399495db6fbSLori Alt (void) printf("\tTotal stream length = %lld (0x%llx)\n", 400495db6fbSLori Alt (u_longlong_t)total_stream_len, (u_longlong_t)total_stream_len); 401495db6fbSLori Alt return (0); 402495db6fbSLori Alt } 403