Update core ZFS code from build 121 to build 141.
[zfs.git] / cmd / zdb / zdb_il.c
index cc08ef5..a0ed985 100644 (file)
 
 extern uint8_t dump_opt[256];
 
+static char prefix[4] = "\t\t\t";
+
 static void
 print_log_bp(const blkptr_t *bp, const char *prefix)
 {
        char blkbuf[BP_SPRINTF_LEN];
 
-       sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, bp);
+       sprintf_blkptr(blkbuf, bp);
        (void) printf("%s%s\n", prefix, blkbuf);
 }
 
@@ -54,19 +56,29 @@ static void
 zil_prt_rec_create(zilog_t *zilog, int txtype, lr_create_t *lr)
 {
        time_t crtime = lr->lr_crtime[0];
-       char *name = (char *)(lr + 1);
-       char *link = name + strlen(name) + 1;
+       char *name, *link;
+       lr_attr_t *lrattr;
 
-       if (txtype == TX_SYMLINK)
-               (void) printf("\t\t\t%s -> %s\n", name, link);
-       else
-               (void) printf("\t\t\t%s\n", name);
+       name = (char *)(lr + 1);
+
+       if (lr->lr_common.lrc_txtype == TX_CREATE_ATTR ||
+           lr->lr_common.lrc_txtype == TX_MKDIR_ATTR) {
+               lrattr = (lr_attr_t *)(lr + 1);
+               name += ZIL_XVAT_SIZE(lrattr->lr_attr_masksize);
+       }
+
+       if (txtype == TX_SYMLINK) {
+               link = name + strlen(name) + 1;
+               (void) printf("%s%s -> %s\n", prefix, name, link);
+       } else if (txtype != TX_MKXATTR) {
+               (void) printf("%s%s\n", prefix, name);
+       }
 
-       (void) printf("\t\t\t%s", ctime(&crtime));
-       (void) printf("\t\t\tdoid %llu, foid %llu, mode %llo\n",
+       (void) printf("%s%s", prefix, ctime(&crtime));
+       (void) printf("%sdoid %llu, foid %llu, mode %llo\n", prefix,
            (u_longlong_t)lr->lr_doid, (u_longlong_t)lr->lr_foid,
            (longlong_t)lr->lr_mode);
-       (void) printf("\t\t\tuid %llu, gid %llu, gen %llu, rdev 0x%llx\n",
+       (void) printf("%suid %llu, gid %llu, gen %llu, rdev 0x%llx\n", prefix,
            (u_longlong_t)lr->lr_uid, (u_longlong_t)lr->lr_gid,
            (u_longlong_t)lr->lr_gen, (u_longlong_t)lr->lr_rdev);
 }
@@ -75,7 +87,7 @@ zil_prt_rec_create(zilog_t *zilog, int txtype, lr_create_t *lr)
 static void
 zil_prt_rec_remove(zilog_t *zilog, int txtype, lr_remove_t *lr)
 {
-       (void) printf("\t\t\tdoid %llu, name %s\n",
+       (void) printf("%sdoid %llu, name %s\n", prefix,
            (u_longlong_t)lr->lr_doid, (char *)(lr + 1));
 }
 
@@ -83,7 +95,7 @@ zil_prt_rec_remove(zilog_t *zilog, int txtype, lr_remove_t *lr)
 static void
 zil_prt_rec_link(zilog_t *zilog, int txtype, lr_link_t *lr)
 {
-       (void) printf("\t\t\tdoid %llu, link_obj %llu, name %s\n",
+       (void) printf("%sdoid %llu, link_obj %llu, name %s\n", prefix,
            (u_longlong_t)lr->lr_doid, (u_longlong_t)lr->lr_link_obj,
            (char *)(lr + 1));
 }
@@ -95,9 +107,9 @@ zil_prt_rec_rename(zilog_t *zilog, int txtype, lr_rename_t *lr)
        char *snm = (char *)(lr + 1);
        char *tnm = snm + strlen(snm) + 1;
 
-       (void) printf("\t\t\tsdoid %llu, tdoid %llu\n",
+       (void) printf("%ssdoid %llu, tdoid %llu\n", prefix,
            (u_longlong_t)lr->lr_sdoid, (u_longlong_t)lr->lr_tdoid);
-       (void) printf("\t\t\tsrc %s tgt %s\n", snm, tnm);
+       (void) printf("%ssrc %s tgt %s\n", prefix, snm, tnm);
 }
 
 /* ARGSUSED */
@@ -106,43 +118,48 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, lr_write_t *lr)
 {
        char *data, *dlimit;
        blkptr_t *bp = &lr->lr_blkptr;
+       zbookmark_t zb;
        char buf[SPA_MAXBLOCKSIZE];
        int verbose = MAX(dump_opt['d'], dump_opt['i']);
        int error;
 
-       (void) printf("\t\t\tfoid %llu, offset 0x%llx,"
-           " length 0x%llx, blkoff 0x%llx\n",
-           (u_longlong_t)lr->lr_foid, (longlong_t)lr->lr_offset,
-           (u_longlong_t)lr->lr_length, (u_longlong_t)lr->lr_blkoff);
+       (void) printf("%sfoid %llu, offset %llx, length %llx\n", prefix,
+           (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset,
+           (u_longlong_t)lr->lr_length);
 
-       if (verbose < 5)
+       if (txtype == TX_WRITE2 || verbose < 5)
                return;
 
        if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) {
-               (void) printf("\t\t\thas blkptr, %s\n",
+               (void) printf("%shas blkptr, %s\n", prefix,
                    bp->blk_birth >= spa_first_txg(zilog->zl_spa) ?
                    "will claim" : "won't claim");
-               print_log_bp(bp, "\t\t\t");
+               print_log_bp(bp, prefix);
+
+               if (BP_IS_HOLE(bp)) {
+                       (void) printf("\t\t\tLSIZE 0x%llx\n",
+                           (u_longlong_t)BP_GET_LSIZE(bp));
+               }
                if (bp->blk_birth == 0) {
                        bzero(buf, sizeof (buf));
-               } else {
-                       zbookmark_t zb;
-
-                       ASSERT3U(bp->blk_cksum.zc_word[ZIL_ZC_OBJSET], ==,
-                           dmu_objset_id(zilog->zl_os));
-
-                       zb.zb_objset = bp->blk_cksum.zc_word[ZIL_ZC_OBJSET];
-                       zb.zb_object = 0;
-                       zb.zb_level = -1;
-                       zb.zb_blkid = bp->blk_cksum.zc_word[ZIL_ZC_SEQ];
-
-                       error = zio_wait(zio_read(NULL, zilog->zl_spa,
-                           bp, buf, BP_GET_LSIZE(bp), NULL, NULL,
-                           ZIO_PRIORITY_SYNC_READ, ZIO_FLAG_CANFAIL, &zb));
-                       if (error)
-                               return;
+                       (void) printf("%s<hole>\n", prefix);
+                       return;
                }
-               data = buf + lr->lr_blkoff;
+               if (bp->blk_birth < zilog->zl_header->zh_claim_txg) {
+                       (void) printf("%s<block already committed>\n", prefix);
+                       return;
+               }
+
+               SET_BOOKMARK(&zb, dmu_objset_id(zilog->zl_os),
+                   lr->lr_foid, ZB_ZIL_LEVEL,
+                   lr->lr_offset / BP_GET_LSIZE(bp));
+
+               error = zio_wait(zio_read(NULL, zilog->zl_spa,
+                   bp, buf, BP_GET_LSIZE(bp), NULL, NULL,
+                   ZIO_PRIORITY_SYNC_READ, ZIO_FLAG_CANFAIL, &zb));
+               if (error)
+                       return;
+               data = buf;
        } else {
                data = (char *)(lr + 1);
        }
@@ -150,7 +167,7 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, lr_write_t *lr)
        dlimit = data + MIN(lr->lr_length,
            (verbose < 6 ? 20 : SPA_MAXBLOCKSIZE));
 
-       (void) printf("\t\t\t");
+       (void) printf("%s", prefix);
        while (data < dlimit) {
                if (isprint(*data))
                        (void) printf("%c ", *data);
@@ -165,7 +182,7 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, lr_write_t *lr)
 static void
 zil_prt_rec_truncate(zilog_t *zilog, int txtype, lr_truncate_t *lr)
 {
-       (void) printf("\t\t\tfoid %llu, offset 0x%llx, length 0x%llx\n",
+       (void) printf("%sfoid %llu, offset 0x%llx, length 0x%llx\n", prefix,
            (u_longlong_t)lr->lr_foid, (longlong_t)lr->lr_offset,
            (u_longlong_t)lr->lr_length);
 }
@@ -177,38 +194,38 @@ zil_prt_rec_setattr(zilog_t *zilog, int txtype, lr_setattr_t *lr)
        time_t atime = (time_t)lr->lr_atime[0];
        time_t mtime = (time_t)lr->lr_mtime[0];
 
-       (void) printf("\t\t\tfoid %llu, mask 0x%llx\n",
+       (void) printf("%sfoid %llu, mask 0x%llx\n", prefix,
            (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_mask);
 
        if (lr->lr_mask & AT_MODE) {
-               (void) printf("\t\t\tAT_MODE  %llo\n",
+               (void) printf("%sAT_MODE  %llo\n", prefix,
                    (longlong_t)lr->lr_mode);
        }
 
        if (lr->lr_mask & AT_UID) {
-               (void) printf("\t\t\tAT_UID   %llu\n",
+               (void) printf("%sAT_UID   %llu\n", prefix,
                    (u_longlong_t)lr->lr_uid);
        }
 
        if (lr->lr_mask & AT_GID) {
-               (void) printf("\t\t\tAT_GID   %llu\n",
+               (void) printf("%sAT_GID   %llu\n", prefix,
                    (u_longlong_t)lr->lr_gid);
        }
 
        if (lr->lr_mask & AT_SIZE) {
-               (void) printf("\t\t\tAT_SIZE  %llu\n",
+               (void) printf("%sAT_SIZE  %llu\n", prefix,
                    (u_longlong_t)lr->lr_size);
        }
 
        if (lr->lr_mask & AT_ATIME) {
-               (void) printf("\t\t\tAT_ATIME %llu.%09llu %s",
+               (void) printf("%sAT_ATIME %llu.%09llu %s", prefix,
                    (u_longlong_t)lr->lr_atime[0],
                    (u_longlong_t)lr->lr_atime[1],
                    ctime(&atime));
        }
 
        if (lr->lr_mask & AT_MTIME) {
-               (void) printf("\t\t\tAT_MTIME %llu.%09llu %s",
+               (void) printf("%sAT_MTIME %llu.%09llu %s", prefix,
                    (u_longlong_t)lr->lr_mtime[0],
                    (u_longlong_t)lr->lr_mtime[1],
                    ctime(&mtime));
@@ -219,7 +236,7 @@ zil_prt_rec_setattr(zilog_t *zilog, int txtype, lr_setattr_t *lr)
 static void
 zil_prt_rec_acl(zilog_t *zilog, int txtype, lr_acl_t *lr)
 {
-       (void) printf("\t\t\tfoid %llu, aclcnt %llu\n",
+       (void) printf("%sfoid %llu, aclcnt %llu\n", prefix,
            (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_aclcnt);
 }
 
@@ -251,10 +268,11 @@ static zil_rec_info_t zil_rec_info[TX_MAX_TYPE] = {
        {       zil_prt_rec_create,     "TX_MKDIR_ACL       " },
        {       zil_prt_rec_create,     "TX_MKDIR_ATTR      " },
        {       zil_prt_rec_create,     "TX_MKDIR_ACL_ATTR  " },
+       {       zil_prt_rec_write,      "TX_WRITE2          " },
 };
 
 /* ARGSUSED */
-static void
+static int
 print_log_record(zilog_t *zilog, lr_t *lr, void *arg, uint64_t claim_txg)
 {
        int txtype;
@@ -278,23 +296,24 @@ print_log_record(zilog_t *zilog, lr_t *lr, void *arg, uint64_t claim_txg)
 
        zil_rec_info[txtype].zri_count++;
        zil_rec_info[0].zri_count++;
+
+       return (0);
 }
 
 /* ARGSUSED */
-static void
+static int
 print_log_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
 {
-       char blkbuf[BP_SPRINTF_LEN];
+       char blkbuf[BP_SPRINTF_LEN + 10];
        int verbose = MAX(dump_opt['d'], dump_opt['i']);
        char *claim;
 
        if (verbose <= 3)
-               return;
+               return (0);
 
        if (verbose >= 5) {
                (void) strcpy(blkbuf, ", ");
-               sprintf_blkptr(blkbuf + strlen(blkbuf),
-                   BP_SPRINTF_LEN - strlen(blkbuf), bp);
+               sprintf_blkptr(blkbuf + strlen(blkbuf), bp);
        } else {
                blkbuf[0] = '\0';
        }
@@ -308,6 +327,8 @@ print_log_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
 
        (void) printf("\tBlock seqno %llu, %s%s\n",
            (u_longlong_t)bp->blk_cksum.zc_word[ZIL_ZC_SEQ], claim, blkbuf);
+
+       return (0);
 }
 
 static void
@@ -340,17 +361,17 @@ dump_intent_log(zilog_t *zilog)
        int verbose = MAX(dump_opt['d'], dump_opt['i']);
        int i;
 
-       if (zh->zh_log.blk_birth == 0 || verbose < 2)
+       if (zh->zh_log.blk_birth == 0 || verbose < 1)
                return;
 
-       (void) printf("\n    ZIL header: claim_txg %llu, claim_seq %llu",
-           (u_longlong_t)zh->zh_claim_txg, (u_longlong_t)zh->zh_claim_seq);
+       (void) printf("\n    ZIL header: claim_txg %llu, "
+           "claim_blk_seq %llu, claim_lr_seq %llu",
+           (u_longlong_t)zh->zh_claim_txg,
+           (u_longlong_t)zh->zh_claim_blk_seq,
+           (u_longlong_t)zh->zh_claim_lr_seq);
        (void) printf(" replay_seq %llu, flags 0x%llx\n",
            (u_longlong_t)zh->zh_replay_seq, (u_longlong_t)zh->zh_flags);
 
-       if (verbose >= 4)
-               print_log_bp(&zh->zh_log, "\n\tfirst block: ");
-
        for (i = 0; i < TX_MAX_TYPE; i++)
                zil_rec_info[i].zri_count = 0;