]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Provide macros for setting and getting blkptr birth times
authorGeorge Wilson <george.wilson@delphix.com>
Mon, 25 Mar 2024 22:01:54 +0000 (18:01 -0400)
committerGitHub <noreply@github.com>
Mon, 25 Mar 2024 22:01:54 +0000 (15:01 -0700)
There exist a couple of macros that are used to update the blkptr birth
times but they can often be confusing. For example, the
BP_PHYSICAL_BIRTH() macro will provide either the physical birth time
if it is set or else return back the logical birth time. The
complement to this macro is BP_SET_BIRTH() which will set the logical
birth time and set the physical birth time if they are not the same.
Consumers may get confused when they are trying to get the physical
birth time and use the BP_PHYSICAL_BIRTH() macro only to find out that
the logical birth time is what is actually returned.

This change cleans up these macros and makes them symmetrical. The same
functionally is preserved but the name is changed. Instead of calling
BP_PHYSICAL_BIRTH(), consumer can now call BP_GET_BIRTH(). In
additional to cleaning up this naming conventions, two new sets of
macros are introduced -- BP_[SET|GET]_LOGICAL_BIRTH() and
BP_[SET|GET]_PHYSICAL_BIRTH.  These new macros allow the consumer to
get and set the specific birth time.

As part of the cleanup, the unused GRID macros have been removed and
that portion of the blkptr are currently unused.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Signed-off-by: George Wilson <gwilson@delphix.com>
Closes #15962

32 files changed:
cmd/zdb/zdb.c
cmd/zdb/zdb_il.c
cmd/zhack.c
include/sys/spa.h
include/sys/uberblock_impl.h
lib/libzdb/libzdb.c
module/zfs/arc.c
module/zfs/bpobj.c
module/zfs/brt.c
module/zfs/dbuf.c
module/zfs/ddt.c
module/zfs/dmu.c
module/zfs/dmu_recv.c
module/zfs/dmu_send.c
module/zfs/dmu_traverse.c
module/zfs/dnode.c
module/zfs/dsl_bookmark.c
module/zfs/dsl_dataset.c
module/zfs/dsl_deadlist.c
module/zfs/dsl_destroy.c
module/zfs/dsl_pool.c
module/zfs/dsl_scan.c
module/zfs/metaslab.c
module/zfs/spa.c
module/zfs/spa_errlog.c
module/zfs/spa_log_spacemap.c
module/zfs/uberblock.c
module/zfs/vdev_mirror.c
module/zfs/vdev_raidz.c
module/zfs/zil.c
module/zfs/zio.c
module/zfs/zio_checksum.c

index 4880c8048726882080935df9a12374b7239b4783..449b6bf2ccb3c68e54f7d26017eaaef0a99d0bbf 100644 (file)
@@ -199,7 +199,8 @@ sublivelist_verify_blkptr(void *arg, const blkptr_t *bp, boolean_t free,
                                        break;
                                sublivelist_verify_block_t svb = {
                                    .svb_dva = bp->blk_dva[i],
-                                   .svb_allocated_txg = bp->blk_birth
+                                   .svb_allocated_txg =
+                                   BP_GET_LOGICAL_BIRTH(bp)
                                };
 
                                if (zfs_btree_find(&sv->sv_leftover, &svb,
@@ -2340,7 +2341,7 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp,
                    (int)BPE_GET_ETYPE(bp),
                    (u_longlong_t)BPE_GET_LSIZE(bp),
                    (u_longlong_t)BPE_GET_PSIZE(bp),
-                   (u_longlong_t)bp->blk_birth);
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp));
                return;
        }
 
@@ -2358,7 +2359,7 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp,
                    buflen - strlen(blkbuf),
                    "%llxL B=%llu",
                    (u_longlong_t)BP_GET_LSIZE(bp),
-                   (u_longlong_t)bp->blk_birth);
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp));
        } else {
                (void) snprintf(blkbuf + strlen(blkbuf),
                    buflen - strlen(blkbuf),
@@ -2366,8 +2367,8 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp,
                    (u_longlong_t)BP_GET_LSIZE(bp),
                    (u_longlong_t)BP_GET_PSIZE(bp),
                    (u_longlong_t)BP_GET_FILL(bp),
-                   (u_longlong_t)bp->blk_birth,
-                   (u_longlong_t)BP_PHYSICAL_BIRTH(bp));
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp),
+                   (u_longlong_t)BP_GET_BIRTH(bp));
                if (bp_freed)
                        (void) snprintf(blkbuf + strlen(blkbuf),
                            buflen - strlen(blkbuf), " %s", "FREE");
@@ -2417,7 +2418,7 @@ visit_indirect(spa_t *spa, const dnode_phys_t *dnp,
 {
        int err = 0;
 
-       if (bp->blk_birth == 0)
+       if (BP_GET_LOGICAL_BIRTH(bp) == 0)
                return (0);
 
        print_indirect(spa, bp, zb, dnp);
@@ -2605,7 +2606,7 @@ dump_bptree_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
        (void) arg, (void) tx;
        char blkbuf[BP_SPRINTF_LEN];
 
-       if (bp->blk_birth != 0) {
+       if (BP_GET_LOGICAL_BIRTH(bp) != 0) {
                snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
                (void) printf("\t%s\n", blkbuf);
        }
@@ -2646,7 +2647,7 @@ dump_bpobj_cb(void *arg, const blkptr_t *bp, boolean_t bp_freed, dmu_tx_t *tx)
        (void) arg, (void) tx;
        char blkbuf[BP_SPRINTF_LEN];
 
-       ASSERT(bp->blk_birth != 0);
+       ASSERT(BP_GET_LOGICAL_BIRTH(bp) != 0);
        snprintf_blkptr_compact(blkbuf, sizeof (blkbuf), bp, bp_freed);
        (void) printf("\t%s\n", blkbuf);
        return (0);
@@ -5788,7 +5789,7 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
        if (zb->zb_level == ZB_DNODE_LEVEL)
                return (0);
 
-       if (dump_opt['b'] >= 5 && bp->blk_birth > 0) {
+       if (dump_opt['b'] >= 5 && BP_GET_LOGICAL_BIRTH(bp) > 0) {
                char blkbuf[BP_SPRINTF_LEN];
                snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
                (void) printf("objset %llu object %llu "
index 63d95ddedc3b0da1aae53d5073adf0d3e9cac2c7..e3caaeb70e14b798598d515035d8d002e8dde100 100644 (file)
@@ -173,8 +173,8 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, const void *arg)
 
        if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) {
                (void) printf("%shas blkptr, %s\n", tab_prefix,
-                   !BP_IS_HOLE(bp) &&
-                   bp->blk_birth >= spa_min_claim_txg(zilog->zl_spa) ?
+                   !BP_IS_HOLE(bp) && BP_GET_LOGICAL_BIRTH(bp) >=
+                   spa_min_claim_txg(zilog->zl_spa) ?
                    "will claim" : "won't claim");
                print_log_bp(bp, tab_prefix);
 
@@ -186,7 +186,7 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, const void *arg)
                        (void) printf("%s<hole>\n", tab_prefix);
                        return;
                }
-               if (bp->blk_birth < zilog->zl_header->zh_claim_txg) {
+               if (BP_GET_LOGICAL_BIRTH(bp) < zilog->zl_header->zh_claim_txg) {
                        (void) printf("%s<block already committed>\n",
                            tab_prefix);
                        return;
@@ -237,8 +237,8 @@ zil_prt_rec_write_enc(zilog_t *zilog, int txtype, const void *arg)
 
        if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) {
                (void) printf("%shas blkptr, %s\n", tab_prefix,
-                   !BP_IS_HOLE(bp) &&
-                   bp->blk_birth >= spa_min_claim_txg(zilog->zl_spa) ?
+                   !BP_IS_HOLE(bp) && BP_GET_LOGICAL_BIRTH(bp) >=
+                   spa_min_claim_txg(zilog->zl_spa) ?
                    "will claim" : "won't claim");
                print_log_bp(bp, tab_prefix);
        }
@@ -473,7 +473,7 @@ print_log_block(zilog_t *zilog, const blkptr_t *bp, void *arg,
 
        if (claim_txg != 0)
                claim = "already claimed";
-       else if (bp->blk_birth >= spa_min_claim_txg(zilog->zl_spa))
+       else if (BP_GET_LOGICAL_BIRTH(bp) >= spa_min_claim_txg(zilog->zl_spa))
                claim = "will claim";
        else
                claim = "won't claim";
index 44611887dd25e453465df16d173f603739fe5530..f15a6ece538cd743d58e788e7f6940cede8e7b17 100644 (file)
@@ -612,8 +612,8 @@ zhack_repair_undetach(uberblock_t *ub, nvlist_t *cfg, const int l)
         * Uberblock root block pointer has valid birth TXG.
         * Copying it to the label NVlist
         */
-       if (ub->ub_rootbp.blk_birth != 0) {
-               const uint64_t txg = ub->ub_rootbp.blk_birth;
+       if (BP_GET_LOGICAL_BIRTH(&ub->ub_rootbp) != 0) {
+               const uint64_t txg = BP_GET_LOGICAL_BIRTH(&ub->ub_rootbp);
                ub->ub_txg = txg;
 
                if (nvlist_remove_all(cfg, ZPOOL_CONFIG_CREATE_TXG) != 0) {
index cada3c8410371c88886aeae72f413648f3106a2e..fb4c93431a31379b566f876f0b3f2be6e6593b08 100644 (file)
@@ -125,15 +125,15 @@ typedef struct zio_cksum_salt {
  *
  *     64      56      48      40      32      24      16      8       0
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 0   |  pad  |         vdev1         | GRID  |         ASIZE         |
+ * 0   |  pad  |         vdev1         | pad   |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 1   |G|                      offset1                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 2   |  pad  |         vdev2         | GRID  |         ASIZE         |
+ * 2   |  pad  |         vdev2         | pad   |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 3   |G|                      offset2                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 4   |  pad  |         vdev3         | GRID  |         ASIZE         |
+ * 4   |  pad  |         vdev3         | pad   |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 5   |G|                      offset3                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
@@ -165,7 +165,6 @@ typedef struct zio_cksum_salt {
  * LSIZE       logical size
  * PSIZE       physical size (after compression)
  * ASIZE       allocated size (including RAID-Z parity and gang block headers)
- * GRID                RAID-Z layout information (reserved for future use)
  * cksum       checksum function
  * comp                compression function
  * G           gang block indicator
@@ -190,11 +189,11 @@ typedef struct zio_cksum_salt {
  *
  *     64      56      48      40      32      24      16      8       0
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 0   |               vdev1           | GRID  |         ASIZE         |
+ * 0   |               vdev1           | pad   |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 1   |G|                      offset1                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 2   |               vdev2           | GRID  |         ASIZE         |
+ * 2   |               vdev2           | pad   |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 3   |G|                      offset2                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
@@ -355,7 +354,7 @@ typedef enum bp_embedded_type {
 #define        BPE_NUM_WORDS 14
 #define        BPE_PAYLOAD_SIZE (BPE_NUM_WORDS * sizeof (uint64_t))
 #define        BPE_IS_PAYLOADWORD(bp, wp) \
-       ((wp) != &(bp)->blk_prop && (wp) != &(bp)->blk_birth)
+       ((wp) != &(bp)->blk_prop && (wp) != (&(bp)->blk_birth_word[1]))
 
 #define        SPA_BLKPTRSHIFT 7               /* blkptr_t is 128 bytes        */
 #define        SPA_DVAS_PER_BP 3               /* Number of DVAs in a bp       */
@@ -374,8 +373,7 @@ typedef struct blkptr {
        dva_t           blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */
        uint64_t        blk_prop;       /* size, compression, type, etc     */
        uint64_t        blk_pad[2];     /* Extra space for the future       */
-       uint64_t        blk_phys_birth; /* txg when block was allocated     */
-       uint64_t        blk_birth;      /* transaction group at birth       */
+       uint64_t        blk_birth_word[2];
        uint64_t        blk_fill;       /* fill count                       */
        zio_cksum_t     blk_cksum;      /* 256-bit checksum                 */
 } blkptr_t;
@@ -395,9 +393,6 @@ typedef struct blkptr {
        BF64_SET_SB((dva)->dva_word[0], 0, SPA_ASIZEBITS, \
        SPA_MINBLOCKSHIFT, 0, x)
 
-#define        DVA_GET_GRID(dva)       BF64_GET((dva)->dva_word[0], 24, 8)
-#define        DVA_SET_GRID(dva, x)    BF64_SET((dva)->dva_word[0], 24, 8, x)
-
 #define        DVA_GET_VDEV(dva)       BF64_GET((dva)->dva_word[0], 32, SPA_VDEVBITS)
 #define        DVA_SET_VDEV(dva, x)    \
        BF64_SET((dva)->dva_word[0], 32, SPA_VDEVBITS, x)
@@ -480,15 +475,23 @@ typedef struct blkptr {
 #define        BP_GET_FREE(bp)                 BF64_GET((bp)->blk_fill, 0, 1)
 #define        BP_SET_FREE(bp, x)              BF64_SET((bp)->blk_fill, 0, 1, x)
 
-#define        BP_PHYSICAL_BIRTH(bp)           \
-       (BP_IS_EMBEDDED(bp) ? 0 : \
-       (bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth)
+#define        BP_GET_LOGICAL_BIRTH(bp)        (bp)->blk_birth_word[1]
+#define        BP_SET_LOGICAL_BIRTH(bp, x)     ((bp)->blk_birth_word[1] = (x))
+
+#define        BP_GET_PHYSICAL_BIRTH(bp)       (bp)->blk_birth_word[0]
+#define        BP_SET_PHYSICAL_BIRTH(bp, x)    ((bp)->blk_birth_word[0] = (x))
+
+#define        BP_GET_BIRTH(bp)                                        \
+       (BP_IS_EMBEDDED(bp) ? 0 :                               \
+       BP_GET_PHYSICAL_BIRTH(bp) ? BP_GET_PHYSICAL_BIRTH(bp) : \
+       BP_GET_LOGICAL_BIRTH(bp))
 
 #define        BP_SET_BIRTH(bp, logical, physical)     \
 {                                              \
        ASSERT(!BP_IS_EMBEDDED(bp));            \
-       (bp)->blk_birth = (logical);            \
-       (bp)->blk_phys_birth = ((logical) == (physical) ? 0 : (physical)); \
+       BP_SET_LOGICAL_BIRTH(bp, logical);      \
+       BP_SET_PHYSICAL_BIRTH(bp,               \
+           ((logical) == (physical) ? 0 : (physical))); \
 }
 
 #define        BP_GET_FILL(bp)                         \
@@ -541,8 +544,8 @@ typedef struct blkptr {
        (dva1)->dva_word[0] == (dva2)->dva_word[0])
 
 #define        BP_EQUAL(bp1, bp2)      \
-       (BP_PHYSICAL_BIRTH(bp1) == BP_PHYSICAL_BIRTH(bp2) &&    \
-       (bp1)->blk_birth == (bp2)->blk_birth &&                 \
+       (BP_GET_BIRTH(bp1) == BP_GET_BIRTH(bp2) &&      \
+       BP_GET_LOGICAL_BIRTH(bp1) == BP_GET_LOGICAL_BIRTH(bp2) &&       \
        DVA_EQUAL(&(bp1)->blk_dva[0], &(bp2)->blk_dva[0]) &&    \
        DVA_EQUAL(&(bp1)->blk_dva[1], &(bp2)->blk_dva[1]) &&    \
        DVA_EQUAL(&(bp1)->blk_dva[2], &(bp2)->blk_dva[2]))
@@ -581,8 +584,8 @@ typedef struct blkptr {
        (bp)->blk_prop = 0;                     \
        (bp)->blk_pad[0] = 0;                   \
        (bp)->blk_pad[1] = 0;                   \
-       (bp)->blk_phys_birth = 0;               \
-       (bp)->blk_birth = 0;                    \
+       (bp)->blk_birth_word[0] = 0;            \
+       (bp)->blk_birth_word[1] = 0;            \
        (bp)->blk_fill = 0;                     \
        ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \
 }
@@ -631,7 +634,7 @@ typedef struct blkptr {
                    (u_longlong_t)BP_GET_LEVEL(bp),                     \
                    type,                                               \
                    (u_longlong_t)BP_GET_LSIZE(bp),                     \
-                   (u_longlong_t)bp->blk_birth);                       \
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp));            \
        } else if (BP_IS_EMBEDDED(bp)) {                                \
                len = func(buf + len, size - len,                       \
                    "EMBEDDED [L%llu %s] et=%u %s "                     \
@@ -642,14 +645,14 @@ typedef struct blkptr {
                    compress,                                           \
                    (u_longlong_t)BPE_GET_LSIZE(bp),                    \
                    (u_longlong_t)BPE_GET_PSIZE(bp),                    \
-                   (u_longlong_t)bp->blk_birth);                       \
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp));            \
        } else if (BP_IS_REDACTED(bp)) {                                \
                len += func(buf + len, size - len,                      \
                    "REDACTED [L%llu %s] size=%llxL birth=%lluL",       \
                    (u_longlong_t)BP_GET_LEVEL(bp),                     \
                    type,                                               \
                    (u_longlong_t)BP_GET_LSIZE(bp),                     \
-                   (u_longlong_t)bp->blk_birth);                       \
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp));            \
        } else {                                                        \
                for (int d = 0; d < BP_GET_NDVAS(bp); d++) {            \
                        const dva_t *dva = &bp->blk_dva[d];             \
@@ -691,8 +694,8 @@ typedef struct blkptr {
                    ws,                                                 \
                    (u_longlong_t)BP_GET_LSIZE(bp),                     \
                    (u_longlong_t)BP_GET_PSIZE(bp),                     \
-                   (u_longlong_t)bp->blk_birth,                        \
-                   (u_longlong_t)BP_PHYSICAL_BIRTH(bp),                \
+                   (u_longlong_t)BP_GET_LOGICAL_BIRTH(bp),             \
+                   (u_longlong_t)BP_GET_BIRTH(bp),                     \
                    (u_longlong_t)BP_GET_FILL(bp),                      \
                    ws,                                                 \
                    (u_longlong_t)bp->blk_cksum.zc_word[0],             \
@@ -1142,9 +1145,9 @@ extern const char *spa_state_to_name(spa_t *spa);
 /* error handling */
 struct zbookmark_phys;
 extern void spa_log_error(spa_t *spa, const zbookmark_phys_t *zb,
-    const uint64_t *birth);
+    const uint64_t birth);
 extern void spa_remove_error(spa_t *spa, zbookmark_phys_t *zb,
-    const uint64_t *birth);
+    uint64_t birth);
 extern int zfs_ereport_post(const char *clazz, spa_t *spa, vdev_t *vd,
     const zbookmark_phys_t *zb, zio_t *zio, uint64_t state);
 extern boolean_t zfs_ereport_is_valid(const char *clazz, spa_t *spa, vdev_t *vd,
index d3a71cc8f84b5c713bb4d5d23c0286cd46b79143..1736b32cd3c63ccbba4ed5c5b99ef915783d06b9 100644 (file)
@@ -165,7 +165,7 @@ struct uberblock {
         * pool from a checkpointed uberblock [see spa_ld_select_uberblock()],
         * the value of the field is used to determine which ZIL blocks have
         * been allocated according to the ms_sm when we are rewinding to a
-        * checkpoint. Specifically, if blk_birth > ub_checkpoint_txg, then
+        * checkpoint. Specifically, if logical birth > ub_checkpoint_txg,then
         * the ZIL block is not allocated [see uses of spa_min_claim_txg()].
         */
        uint64_t        ub_checkpoint_txg;
index 9989fa1eb80f8e858cf7d7908605a057e78ec71a..12144dc65e75d57ab50d5413ea07b9aedc4e03ea 100644 (file)
@@ -93,9 +93,9 @@ livelist_compare(const void *larg, const void *rarg)
         * Since we're storing blkptrs without cancelling FREE/ALLOC pairs,
         * it's possible the offsets are equal. In that case, sort by txg
         */
-       if (l->blk_birth < r->blk_birth) {
+       if (BP_GET_LOGICAL_BIRTH(l) < BP_GET_LOGICAL_BIRTH(r)) {
                return (-1);
-       } else if (l->blk_birth > r->blk_birth) {
+       } else if (BP_GET_LOGICAL_BIRTH(l) > BP_GET_LOGICAL_BIRTH(r)) {
                return (+1);
        }
        return (0);
index 3bcffb3c7edefa43c88c62371fa6e90f2ab69282..b1bcac6c44bc9f9e82870c7e96ed17270dc1d157 100644 (file)
@@ -1014,7 +1014,7 @@ static arc_buf_hdr_t *
 buf_hash_find(uint64_t spa, const blkptr_t *bp, kmutex_t **lockp)
 {
        const dva_t *dva = BP_IDENTITY(bp);
-       uint64_t birth = BP_PHYSICAL_BIRTH(bp);
+       uint64_t birth = BP_GET_BIRTH(bp);
        uint64_t idx = BUF_HASH_INDEX(spa, dva, birth);
        kmutex_t *hash_lock = BUF_HASH_LOCK(idx);
        arc_buf_hdr_t *hdr;
@@ -2183,7 +2183,7 @@ arc_untransform(arc_buf_t *buf, spa_t *spa, const zbookmark_phys_t *zb,
                 * (and generate an ereport) before leaving the ARC.
                 */
                ret = SET_ERROR(EIO);
-               spa_log_error(spa, zb, &buf->b_hdr->b_birth);
+               spa_log_error(spa, zb, buf->b_hdr->b_birth);
                (void) zfs_ereport_post(FM_EREPORT_ZFS_AUTHENTICATION,
                    spa, NULL, zb, NULL, 0);
        }
@@ -5251,7 +5251,7 @@ arc_read_done(zio_t *zio)
        if (HDR_IN_HASH_TABLE(hdr)) {
                arc_buf_hdr_t *found;
 
-               ASSERT3U(hdr->b_birth, ==, BP_PHYSICAL_BIRTH(zio->io_bp));
+               ASSERT3U(hdr->b_birth, ==, BP_GET_BIRTH(zio->io_bp));
                ASSERT3U(hdr->b_dva.dva_word[0], ==,
                    BP_IDENTITY(zio->io_bp)->dva_word[0]);
                ASSERT3U(hdr->b_dva.dva_word[1], ==,
@@ -5354,7 +5354,7 @@ arc_read_done(zio_t *zio)
                        error = SET_ERROR(EIO);
                        if ((zio->io_flags & ZIO_FLAG_SPECULATIVE) == 0) {
                                spa_log_error(zio->io_spa, &acb->acb_zb,
-                                   &zio->io_bp->blk_birth);
+                                   BP_GET_LOGICAL_BIRTH(zio->io_bp));
                                (void) zfs_ereport_post(
                                    FM_EREPORT_ZFS_AUTHENTICATION,
                                    zio->io_spa, NULL, &acb->acb_zb, zio, 0);
@@ -5639,7 +5639,7 @@ top:
                                 */
                                rc = SET_ERROR(EIO);
                                if ((zio_flags & ZIO_FLAG_SPECULATIVE) == 0) {
-                                       spa_log_error(spa, zb, &hdr->b_birth);
+                                       spa_log_error(spa, zb, hdr->b_birth);
                                        (void) zfs_ereport_post(
                                            FM_EREPORT_ZFS_AUTHENTICATION,
                                            spa, NULL, zb, NULL, 0);
@@ -5686,12 +5686,12 @@ top:
                         * embedded data.
                         */
                        arc_buf_hdr_t *exists = NULL;
-                       hdr = arc_hdr_alloc(spa_load_guid(spa), psize, lsize,
+                       hdr = arc_hdr_alloc(guid, psize, lsize,
                            BP_IS_PROTECTED(bp), BP_GET_COMPRESS(bp), 0, type);
 
                        if (!embedded_bp) {
                                hdr->b_dva = *BP_IDENTITY(bp);
-                               hdr->b_birth = BP_PHYSICAL_BIRTH(bp);
+                               hdr->b_birth = BP_GET_BIRTH(bp);
                                exists = buf_hash_insert(hdr, &hash_lock);
                        }
                        if (exists != NULL) {
@@ -6557,7 +6557,7 @@ arc_write_done(zio_t *zio)
                        buf_discard_identity(hdr);
                } else {
                        hdr->b_dva = *BP_IDENTITY(zio->io_bp);
-                       hdr->b_birth = BP_PHYSICAL_BIRTH(zio->io_bp);
+                       hdr->b_birth = BP_GET_BIRTH(zio->io_bp);
                }
        } else {
                ASSERT(HDR_EMPTY(hdr));
index e772caead29bd84fa06e852306981cfb4ae85ce6..96e1601c4e9c80ca77289a96d5844074dbf34edc 100644 (file)
@@ -893,7 +893,7 @@ bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, boolean_t bp_freed,
                 */
                memset(&stored_bp, 0, sizeof (stored_bp));
                stored_bp.blk_prop = bp->blk_prop;
-               stored_bp.blk_birth = bp->blk_birth;
+               BP_SET_LOGICAL_BIRTH(&stored_bp, BP_GET_LOGICAL_BIRTH(bp));
        } else if (!BP_GET_DEDUP(bp)) {
                /* The bpobj will compress better without the checksum */
                memset(&stored_bp.blk_cksum, 0, sizeof (stored_bp.blk_cksum));
@@ -953,7 +953,8 @@ space_range_cb(void *arg, const blkptr_t *bp, boolean_t bp_freed, dmu_tx_t *tx)
        (void) bp_freed, (void) tx;
        struct space_range_arg *sra = arg;
 
-       if (bp->blk_birth > sra->mintxg && bp->blk_birth <= sra->maxtxg) {
+       if (BP_GET_LOGICAL_BIRTH(bp) > sra->mintxg &&
+           BP_GET_LOGICAL_BIRTH(bp) <= sra->maxtxg) {
                if (dsl_pool_sync_context(spa_get_dsl(sra->spa)))
                        sra->used += bp_get_dsize_sync(sra->spa, bp);
                else
@@ -985,7 +986,7 @@ bpobj_space(bpobj_t *bpo, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp)
 
 /*
  * Return the amount of space in the bpobj which is:
- * mintxg < blk_birth <= maxtxg
+ * mintxg < logical birth <= maxtxg
  */
 int
 bpobj_space_range(bpobj_t *bpo, uint64_t mintxg, uint64_t maxtxg,
index 416caeb11c7ef1aa4922da42998058b9a26cfa41..0b5a09df372483f1e61e681baad746906213cc9d 100644 (file)
@@ -1384,8 +1384,7 @@ brt_pending_entry_compare(const void *x1, const void *x2)
                cmp = TREE_CMP(DVA_GET_OFFSET(&bp1->blk_dva[0]),
                    DVA_GET_OFFSET(&bp2->blk_dva[0]));
                if (unlikely(cmp == 0)) {
-                       cmp = TREE_CMP(BP_PHYSICAL_BIRTH(bp1),
-                           BP_PHYSICAL_BIRTH(bp2));
+                       cmp = TREE_CMP(BP_GET_BIRTH(bp1), BP_GET_BIRTH(bp2));
                }
        }
 
index 6798fc2d5bdcc6fcd4c8d5a08cbd38faa314a33e..4e190c131e1dde2f9977573071d597f11b9c1b28 100644 (file)
@@ -1217,7 +1217,7 @@ dbuf_verify(dmu_buf_impl_t *db)
                                        ASSERT0(bp->blk_pad[1]);
                                        ASSERT(!BP_IS_EMBEDDED(bp));
                                        ASSERT(BP_IS_HOLE(bp));
-                                       ASSERT0(bp->blk_phys_birth);
+                                       ASSERT0(BP_GET_PHYSICAL_BIRTH(bp));
                                }
                        }
                }
@@ -1457,7 +1457,7 @@ dbuf_handle_indirect_hole(dmu_buf_impl_t *db, dnode_t *dn, blkptr_t *dbbp)
                    dn->dn_datablksz : BP_GET_LSIZE(dbbp));
                BP_SET_TYPE(bp, BP_GET_TYPE(dbbp));
                BP_SET_LEVEL(bp, BP_GET_LEVEL(dbbp) - 1);
-               BP_SET_BIRTH(bp, dbbp->blk_birth, 0);
+               BP_SET_BIRTH(bp, BP_GET_LOGICAL_BIRTH(dbbp), 0);
        }
 }
 
@@ -1486,7 +1486,7 @@ dbuf_read_hole(dmu_buf_impl_t *db, dnode_t *dn, blkptr_t *bp)
                memset(db->db.db_data, 0, db->db.db_size);
 
                if (bp != NULL && db->db_level > 0 && BP_IS_HOLE(bp) &&
-                   bp->blk_birth != 0) {
+                   BP_GET_LOGICAL_BIRTH(bp) != 0) {
                        dbuf_handle_indirect_hole(db, dn, bp);
                }
                db->db_state = DB_CACHED;
@@ -1633,7 +1633,8 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
         * If this is not true it indicates tampering and we report an error.
         */
        if (db->db_objset->os_encrypted && !BP_USES_CRYPT(bpp)) {
-               spa_log_error(db->db_objset->os_spa, &zb, &bpp->blk_birth);
+               spa_log_error(db->db_objset->os_spa, &zb,
+                   BP_GET_LOGICAL_BIRTH(bpp));
                err = SET_ERROR(EIO);
                goto early_unlock;
        }
@@ -2832,7 +2833,7 @@ dbuf_override_impl(dmu_buf_impl_t *db, const blkptr_t *bp, dmu_tx_t *tx)
        dl = &dr->dt.dl;
        dl->dr_overridden_by = *bp;
        dl->dr_override_state = DR_OVERRIDDEN;
-       dl->dr_overridden_by.blk_birth = dr->dr_txg;
+       BP_SET_LOGICAL_BIRTH(&dl->dr_overridden_by, dr->dr_txg);
 }
 
 boolean_t
@@ -2909,7 +2910,7 @@ dmu_buf_write_embedded(dmu_buf_t *dbuf, void *data,
        BP_SET_BYTEORDER(&dl->dr_overridden_by, byteorder);
 
        dl->dr_override_state = DR_OVERRIDDEN;
-       dl->dr_overridden_by.blk_birth = dr->dr_txg;
+       BP_SET_LOGICAL_BIRTH(&dl->dr_overridden_by, dr->dr_txg);
 }
 
 void
@@ -4712,7 +4713,7 @@ dbuf_write_ready(zio_t *zio, arc_buf_t *buf, void *vdb)
        dnode_diduse_space(dn, delta - zio->io_prev_space_delta);
        zio->io_prev_space_delta = delta;
 
-       if (bp->blk_birth != 0) {
+       if (BP_GET_LOGICAL_BIRTH(bp) != 0) {
                ASSERT((db->db_blkid != DMU_SPILL_BLKID &&
                    BP_GET_TYPE(bp) == dn->dn_type) ||
                    (db->db_blkid == DMU_SPILL_BLKID &&
@@ -4999,7 +5000,7 @@ dbuf_remap_impl(dnode_t *dn, blkptr_t *bp, krwlock_t *rw, dmu_tx_t *tx)
        ASSERT(dsl_pool_sync_context(spa_get_dsl(spa)));
 
        drica.drica_os = dn->dn_objset;
-       drica.drica_blk_birth = bp->blk_birth;
+       drica.drica_blk_birth = BP_GET_LOGICAL_BIRTH(bp);
        drica.drica_tx = tx;
        if (spa_remap_blkptr(spa, &bp_copy, dbuf_remap_impl_callback,
            &drica)) {
@@ -5014,7 +5015,8 @@ dbuf_remap_impl(dnode_t *dn, blkptr_t *bp, krwlock_t *rw, dmu_tx_t *tx)
                if (dn->dn_objset != spa_meta_objset(spa)) {
                        dsl_dataset_t *ds = dmu_objset_ds(dn->dn_objset);
                        if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) &&
-                           bp->blk_birth > ds->ds_dir->dd_origin_txg) {
+                           BP_GET_LOGICAL_BIRTH(bp) >
+                           ds->ds_dir->dd_origin_txg) {
                                ASSERT(!BP_IS_EMBEDDED(bp));
                                ASSERT(dsl_dir_is_clone(ds->ds_dir));
                                ASSERT(spa_feature_is_enabled(spa,
@@ -5136,7 +5138,7 @@ dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, dmu_tx_t *tx)
        }
 
        ASSERT(db->db_level == 0 || data == db->db_buf);
-       ASSERT3U(db->db_blkptr->blk_birth, <=, txg);
+       ASSERT3U(BP_GET_LOGICAL_BIRTH(db->db_blkptr), <=, txg);
        ASSERT(pio);
 
        SET_BOOKMARK(&zb, os->os_dsl_dataset ?
index de8640e58a2c9e6b2229c702903971c47ea13838..4c53cb0a2f9b54366ccd7436760f9ad34aba16f8 100644 (file)
@@ -437,7 +437,7 @@ ddt_phys_fill(ddt_phys_t *ddp, const blkptr_t *bp)
 
        for (int d = 0; d < SPA_DVAS_PER_BP; d++)
                ddp->ddp_dva[d] = bp->blk_dva[d];
-       ddp->ddp_phys_birth = BP_PHYSICAL_BIRTH(bp);
+       ddp->ddp_phys_birth = BP_GET_BIRTH(bp);
 }
 
 void
@@ -485,7 +485,7 @@ ddt_phys_select(const ddt_entry_t *dde, const blkptr_t *bp)
 
        for (int p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
                if (DVA_EQUAL(BP_IDENTITY(bp), &ddp->ddp_dva[0]) &&
-                   BP_PHYSICAL_BIRTH(bp) == ddp->ddp_phys_birth)
+                   BP_GET_BIRTH(bp) == ddp->ddp_phys_birth)
                        return (ddp);
        }
        return (NULL);
index 8986f55e792a2b19f933c3f8fab23cf8f5b42464..b88cf447d2967f4f07686b18d3336ddc7104d436 100644 (file)
@@ -1627,7 +1627,7 @@ dmu_sync_done(zio_t *zio, arc_buf_t *buf, void *varg)
                 * it's an old style hole.
                 */
                if (BP_IS_HOLE(&dr->dt.dl.dr_overridden_by) &&
-                   dr->dt.dl.dr_overridden_by.blk_birth == 0)
+                   BP_GET_LOGICAL_BIRTH(&dr->dt.dl.dr_overridden_by) == 0)
                        BP_ZERO(&dr->dt.dl.dr_overridden_by);
        } else {
                dr->dt.dl.dr_override_state = DR_NOT_OVERRIDDEN;
@@ -1658,7 +1658,7 @@ dmu_sync_late_arrival_done(zio_t *zio)
                        blkptr_t *bp_orig __maybe_unused = &zio->io_bp_orig;
                        ASSERT(!(zio->io_flags & ZIO_FLAG_NOPWRITE));
                        ASSERT(BP_IS_HOLE(bp_orig) || !BP_EQUAL(bp, bp_orig));
-                       ASSERT(zio->io_bp->blk_birth == zio->io_txg);
+                       ASSERT(BP_GET_LOGICAL_BIRTH(zio->io_bp) == zio->io_txg);
                        ASSERT(zio->io_txg > spa_syncing_txg(zio->io_spa));
                        zio_free(zio->io_spa, zio->io_txg, zio->io_bp);
                }
@@ -2285,11 +2285,11 @@ dmu_read_l0_bps(objset_t *os, uint64_t object, uint64_t offset, uint64_t length,
                 * operation into ZIL, or it may be impossible to replay, since
                 * the block may appear not yet allocated at that point.
                 */
-               if (BP_PHYSICAL_BIRTH(bp) > spa_freeze_txg(os->os_spa)) {
+               if (BP_GET_BIRTH(bp) > spa_freeze_txg(os->os_spa)) {
                        error = SET_ERROR(EINVAL);
                        goto out;
                }
-               if (BP_PHYSICAL_BIRTH(bp) > spa_last_synced_txg(os->os_spa)) {
+               if (BP_GET_BIRTH(bp) > spa_last_synced_txg(os->os_spa)) {
                        error = SET_ERROR(EAGAIN);
                        goto out;
                }
@@ -2364,13 +2364,14 @@ dmu_brt_clone(objset_t *os, uint64_t object, uint64_t offset, uint64_t length,
                dl->dr_brtwrite = B_TRUE;
                dl->dr_override_state = DR_OVERRIDDEN;
                if (BP_IS_HOLE(bp)) {
-                       dl->dr_overridden_by.blk_birth = 0;
-                       dl->dr_overridden_by.blk_phys_birth = 0;
+                       BP_SET_LOGICAL_BIRTH(&dl->dr_overridden_by, 0);
+                       BP_SET_PHYSICAL_BIRTH(&dl->dr_overridden_by, 0);
                } else {
-                       dl->dr_overridden_by.blk_birth = dr->dr_txg;
+                       BP_SET_LOGICAL_BIRTH(&dl->dr_overridden_by,
+                           dr->dr_txg);
                        if (!BP_IS_EMBEDDED(bp)) {
-                               dl->dr_overridden_by.blk_phys_birth =
-                                   BP_PHYSICAL_BIRTH(bp);
+                               BP_SET_PHYSICAL_BIRTH(&dl->dr_overridden_by,
+                                   BP_GET_BIRTH(bp));
                        }
                }
 
index 9f1c25f866f707c9f08dabe14b678ff442fba2a6..680aed4513bc2cc587e1c7c2e8d4a7159e3283d7 100644 (file)
@@ -1352,8 +1352,10 @@ corrective_read_done(zio_t *zio)
 {
        cr_cb_data_t *data = zio->io_private;
        /* Corruption corrected; update error log if needed */
-       if (zio->io_error == 0)
-               spa_remove_error(data->spa, &data->zb, &zio->io_bp->blk_birth);
+       if (zio->io_error == 0) {
+               spa_remove_error(data->spa, &data->zb,
+                   BP_GET_LOGICAL_BIRTH(zio->io_bp));
+       }
        kmem_free(data, sizeof (cr_cb_data_t));
        abd_free(zio->io_abd);
 }
@@ -1480,8 +1482,9 @@ do_corrective_recv(struct receive_writer_arg *rwa, struct drr_write *drrw,
        }
        rrd->abd = abd;
 
-       io = zio_rewrite(NULL, rwa->os->os_spa, bp->blk_birth, bp, abd,
-           BP_GET_PSIZE(bp), NULL, NULL, ZIO_PRIORITY_SYNC_WRITE, flags, &zb);
+       io = zio_rewrite(NULL, rwa->os->os_spa, BP_GET_LOGICAL_BIRTH(bp), bp,
+           abd, BP_GET_PSIZE(bp), NULL, NULL, ZIO_PRIORITY_SYNC_WRITE, flags,
+           &zb);
 
        ASSERT(abd_get_size(abd) == BP_GET_LSIZE(bp) ||
            abd_get_size(abd) == BP_GET_PSIZE(bp));
index 37c68528bf95d18a8719cbc1f6f05837ba9caa03..b6cc2f0a5e912daa5e308e6bba384970b77f6404 100644 (file)
@@ -619,7 +619,7 @@ dump_spill(dmu_send_cookie_t *dscp, const blkptr_t *bp, uint64_t object,
 
        /* See comment in dump_dnode() for full details */
        if (zfs_send_unmodified_spill_blocks &&
-           (bp->blk_birth <= dscp->dsc_fromtxg)) {
+           (BP_GET_LOGICAL_BIRTH(bp) <= dscp->dsc_fromtxg)) {
                drrs->drr_flags |= DRR_SPILL_UNMODIFIED;
        }
 
@@ -804,7 +804,7 @@ dump_dnode(dmu_send_cookie_t *dscp, const blkptr_t *bp, uint64_t object,
         */
        if (zfs_send_unmodified_spill_blocks &&
            (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) &&
-           (DN_SPILL_BLKPTR(dnp)->blk_birth <= dscp->dsc_fromtxg)) {
+           (BP_GET_LOGICAL_BIRTH(DN_SPILL_BLKPTR(dnp)) <= dscp->dsc_fromtxg)) {
                struct send_range record;
                blkptr_t *bp = DN_SPILL_BLKPTR(dnp);
 
@@ -1123,7 +1123,7 @@ send_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
         */
        if (sta->os->os_encrypted &&
            !BP_IS_HOLE(bp) && !BP_USES_CRYPT(bp)) {
-               spa_log_error(spa, zb, &bp->blk_birth);
+               spa_log_error(spa, zb, BP_GET_LOGICAL_BIRTH(bp));
                return (SET_ERROR(EIO));
        }
 
index 809f7f6165f9ac499c2509a8a3f79786d1c41503..15cc2885e8058eb8f2148af2886e3783a944799b 100644 (file)
@@ -83,7 +83,8 @@ traverse_zil_block(zilog_t *zilog, const blkptr_t *bp, void *arg,
        if (BP_IS_HOLE(bp))
                return (0);
 
-       if (claim_txg == 0 && bp->blk_birth >= spa_min_claim_txg(td->td_spa))
+       if (claim_txg == 0 &&
+           BP_GET_LOGICAL_BIRTH(bp) >= spa_min_claim_txg(td->td_spa))
                return (-1);
 
        SET_BOOKMARK(&zb, td->td_objset, ZB_ZIL_OBJECT, ZB_ZIL_LEVEL,
@@ -108,7 +109,7 @@ traverse_zil_record(zilog_t *zilog, const lr_t *lrc, void *arg,
                if (BP_IS_HOLE(bp))
                        return (0);
 
-               if (claim_txg == 0 || bp->blk_birth < claim_txg)
+               if (claim_txg == 0 || BP_GET_LOGICAL_BIRTH(bp) < claim_txg)
                        return (0);
 
                ASSERT3U(BP_GET_LSIZE(bp), !=, 0);
@@ -192,7 +193,7 @@ traverse_prefetch_metadata(traverse_data_t *td, const dnode_phys_t *dnp,
         */
        if (resume_skip_check(td, dnp, zb) != RESUME_SKIP_NONE)
                return (B_FALSE);
-       if (BP_IS_HOLE(bp) || bp->blk_birth <= td->td_min_txg)
+       if (BP_IS_HOLE(bp) || BP_GET_LOGICAL_BIRTH(bp) <= td->td_min_txg)
                return (B_FALSE);
        if (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE)
                return (B_FALSE);
@@ -235,7 +236,7 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
                ASSERT(0);
        }
 
-       if (bp->blk_birth == 0) {
+       if (BP_GET_LOGICAL_BIRTH(bp) == 0) {
                /*
                 * Since this block has a birth time of 0 it must be one of
                 * two things: a hole created before the
@@ -263,7 +264,7 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
                    zb->zb_object == DMU_META_DNODE_OBJECT) &&
                    td->td_hole_birth_enabled_txg <= td->td_min_txg)
                        return (0);
-       } else if (bp->blk_birth <= td->td_min_txg) {
+       } else if (BP_GET_LOGICAL_BIRTH(bp) <= td->td_min_txg) {
                return (0);
        }
 
index ba28aa06a91f9c66e46e621c639feaa3d7287745..a703fd414f8794bc59987d823c67307b2a5de80b 100644 (file)
@@ -2557,7 +2557,7 @@ dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
        }
 
        if (db != NULL && txg != 0 && (db->db_blkptr == NULL ||
-           db->db_blkptr->blk_birth <= txg ||
+           BP_GET_LOGICAL_BIRTH(db->db_blkptr) <= txg ||
            BP_IS_HOLE(db->db_blkptr))) {
                /*
                 * This can only happen when we are searching up the tree
@@ -2605,7 +2605,7 @@ dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
                    i >= 0 && i < epb; i += inc) {
                        if (BP_GET_FILL(&bp[i]) >= minfill &&
                            BP_GET_FILL(&bp[i]) <= maxfill &&
-                           (hole || bp[i].blk_birth > txg))
+                           (hole || BP_GET_LOGICAL_BIRTH(&bp[i]) > txg))
                                break;
                        if (inc > 0 || *offset > 0)
                                *offset += inc;
index 4faefecbadbb2088a2aaf5e1e52b418e7fd52849..5fd8bc2a2682a841f1d8482f9ae55149498d0702 100644 (file)
@@ -1520,7 +1520,8 @@ dsl_bookmark_block_killed(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
                 * If the block was live (referenced) at the time of this
                 * bookmark, add its space to the bookmark's FBN.
                 */
-               if (bp->blk_birth <= dbn->dbn_phys.zbm_creation_txg &&
+               if (BP_GET_LOGICAL_BIRTH(bp) <=
+                   dbn->dbn_phys.zbm_creation_txg &&
                    (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN)) {
                        mutex_enter(&dbn->dbn_lock);
                        dbn->dbn_phys.zbm_referenced_freed_before_next_snap +=
index 62a1649d3786412da6e00176e1ea0845a275ddbf..b4de0e7ff0735e1bade6b4fdab781adbe0df504c 100644 (file)
@@ -156,7 +156,8 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
                return;
        }
 
-       ASSERT3U(bp->blk_birth, >, dsl_dataset_phys(ds)->ds_prev_snap_txg);
+       ASSERT3U(BP_GET_LOGICAL_BIRTH(bp), >,
+           dsl_dataset_phys(ds)->ds_prev_snap_txg);
        dmu_buf_will_dirty(ds->ds_dbuf, tx);
        mutex_enter(&ds->ds_lock);
        delta = parent_delta(ds, used);
@@ -190,7 +191,7 @@ dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
         * they do not need to be freed.
         */
        if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) &&
-           bp->blk_birth > ds->ds_dir->dd_origin_txg &&
+           BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg &&
            !(BP_IS_EMBEDDED(bp))) {
                ASSERT(dsl_dir_is_clone(ds->ds_dir));
                ASSERT(spa_feature_is_enabled(spa,
@@ -236,7 +237,7 @@ dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev, uint64_t offset,
                mutex_exit(&ds->ds_remap_deadlist_lock);
 
                BP_ZERO(&fakebp);
-               fakebp.blk_birth = birth;
+               BP_SET_LOGICAL_BIRTH(&fakebp, birth);
                DVA_SET_VDEV(dva, vdev);
                DVA_SET_OFFSET(dva, offset);
                DVA_SET_ASIZE(dva, size);
@@ -259,7 +260,7 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
                return (0);
 
        ASSERT(dmu_tx_is_syncing(tx));
-       ASSERT(bp->blk_birth <= tx->tx_txg);
+       ASSERT(BP_GET_LOGICAL_BIRTH(bp) <= tx->tx_txg);
 
        if (ds == NULL) {
                dsl_free(tx->tx_pool, tx->tx_txg, bp);
@@ -277,7 +278,7 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
         * they do not need to be freed.
         */
        if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) &&
-           bp->blk_birth > ds->ds_dir->dd_origin_txg &&
+           BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg &&
            !(BP_IS_EMBEDDED(bp))) {
                ASSERT(dsl_dir_is_clone(ds->ds_dir));
                ASSERT(spa_feature_is_enabled(spa,
@@ -285,7 +286,7 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
                bplist_append(&ds->ds_dir->dd_pending_frees, bp);
        }
 
-       if (bp->blk_birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) {
+       if (BP_GET_LOGICAL_BIRTH(bp) > dsl_dataset_phys(ds)->ds_prev_snap_txg) {
                int64_t delta;
 
                dprintf_bp(bp, "freeing ds=%llu", (u_longlong_t)ds->ds_object);
@@ -317,16 +318,16 @@ dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
                ASSERT3U(ds->ds_prev->ds_object, ==,
                    dsl_dataset_phys(ds)->ds_prev_snap_obj);
                ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_num_children > 0);
-               /* if (bp->blk_birth > prev prev snap txg) prev unique += bs */
+               /* if (logical birth > prev prev snap txg) prev unique += bs */
                if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj ==
-                   ds->ds_object && bp->blk_birth >
+                   ds->ds_object && BP_GET_LOGICAL_BIRTH(bp) >
                    dsl_dataset_phys(ds->ds_prev)->ds_prev_snap_txg) {
                        dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
                        mutex_enter(&ds->ds_prev->ds_lock);
                        dsl_dataset_phys(ds->ds_prev)->ds_unique_bytes += used;
                        mutex_exit(&ds->ds_prev->ds_lock);
                }
-               if (bp->blk_birth > ds->ds_dir->dd_origin_txg) {
+               if (BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg) {
                        dsl_dir_transfer_space(ds->ds_dir, used,
                            DD_USED_HEAD, DD_USED_SNAP, tx);
                }
@@ -2895,7 +2896,7 @@ dsl_dataset_modified_since_snap(dsl_dataset_t *ds, dsl_dataset_t *snap)
        if (snap == NULL)
                return (B_FALSE);
        rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
-       birth = dsl_dataset_get_blkptr(ds)->blk_birth;
+       birth = BP_GET_LOGICAL_BIRTH(dsl_dataset_get_blkptr(ds));
        rrw_exit(&ds->ds_bp_rwlock, FTAG);
        if (birth > dsl_dataset_phys(snap)->ds_creation_txg) {
                objset_t *os, *os_snap;
index e6c8d4be13b422e2dd9da1b140ec55dc668bc59c..eff1f7de773104fec22ea692971eb15d3302990b 100644 (file)
@@ -474,7 +474,7 @@ dsl_deadlist_insert(dsl_deadlist_t *dl, const blkptr_t *bp, boolean_t bp_freed,
        dl->dl_phys->dl_comp += sign * BP_GET_PSIZE(bp);
        dl->dl_phys->dl_uncomp += sign * BP_GET_UCSIZE(bp);
 
-       dle_tofind.dle_mintxg = bp->blk_birth;
+       dle_tofind.dle_mintxg = BP_GET_LOGICAL_BIRTH(bp);
        dle = avl_find(&dl->dl_tree, &dle_tofind, &where);
        if (dle == NULL)
                dle = avl_nearest(&dl->dl_tree, where, AVL_BEFORE);
@@ -483,7 +483,7 @@ dsl_deadlist_insert(dsl_deadlist_t *dl, const blkptr_t *bp, boolean_t bp_freed,
 
        if (dle == NULL) {
                zfs_panic_recover("blkptr at %p has invalid BLK_BIRTH %llu",
-                   bp, (longlong_t)bp->blk_birth);
+                   bp, (longlong_t)BP_GET_LOGICAL_BIRTH(bp));
                dle = avl_first(&dl->dl_tree);
        }
 
@@ -1039,8 +1039,7 @@ dsl_livelist_iterate(void *arg, const blkptr_t *bp, boolean_t bp_freed,
                ASSERT3U(BP_GET_PSIZE(bp), ==, BP_GET_PSIZE(&found->le_bp));
                ASSERT3U(BP_GET_CHECKSUM(bp), ==,
                    BP_GET_CHECKSUM(&found->le_bp));
-               ASSERT3U(BP_PHYSICAL_BIRTH(bp), ==,
-                   BP_PHYSICAL_BIRTH(&found->le_bp));
+               ASSERT3U(BP_GET_BIRTH(bp), ==, BP_GET_BIRTH(&found->le_bp));
        }
        if (bp_freed) {
                if (found == NULL) {
index d9d88a981e056f15460a4047a8439d7b1bc7e7b7..d4a6e5b6e9fd998934aa1d4a0bc053ef43672aad 100644 (file)
@@ -132,10 +132,11 @@ process_old_cb(void *arg, const blkptr_t *bp, boolean_t bp_freed, dmu_tx_t *tx)
 
        ASSERT(!BP_IS_HOLE(bp));
 
-       if (bp->blk_birth <= dsl_dataset_phys(poa->ds)->ds_prev_snap_txg) {
+       if (BP_GET_LOGICAL_BIRTH(bp) <=
+           dsl_dataset_phys(poa->ds)->ds_prev_snap_txg) {
                dsl_deadlist_insert(&poa->ds->ds_deadlist, bp, bp_freed, tx);
                if (poa->ds_prev && !poa->after_branch_point &&
-                   bp->blk_birth >
+                   BP_GET_LOGICAL_BIRTH(bp) >
                    dsl_dataset_phys(poa->ds_prev)->ds_prev_snap_txg) {
                        dsl_dataset_phys(poa->ds_prev)->ds_unique_bytes +=
                            bp_get_dsize_sync(dp->dp_spa, bp);
@@ -313,7 +314,8 @@ dsl_destroy_snapshot_sync_impl(dsl_dataset_t *ds, boolean_t defer, dmu_tx_t *tx)
 
        ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock));
        rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
-       ASSERT3U(dsl_dataset_phys(ds)->ds_bp.blk_birth, <=, tx->tx_txg);
+       ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=,
+           tx->tx_txg);
        rrw_exit(&ds->ds_bp_rwlock, FTAG);
        ASSERT(zfs_refcount_is_zero(&ds->ds_longholds));
 
@@ -727,7 +729,7 @@ kill_blkptr(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
                dsl_free(ka->tx->tx_pool, ka->tx->tx_txg, bp);
        } else {
                ASSERT(zilog == NULL);
-               ASSERT3U(bp->blk_birth, >,
+               ASSERT3U(BP_GET_LOGICAL_BIRTH(bp), >,
                    dsl_dataset_phys(ka->ds)->ds_prev_snap_txg);
                (void) dsl_dataset_block_kill(ka->ds, bp, tx, B_FALSE);
        }
@@ -1017,7 +1019,8 @@ dsl_destroy_head_sync_impl(dsl_dataset_t *ds, dmu_tx_t *tx)
        ASSERT(ds->ds_prev == NULL ||
            dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj != ds->ds_object);
        rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
-       ASSERT3U(dsl_dataset_phys(ds)->ds_bp.blk_birth, <=, tx->tx_txg);
+       ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=,
+           tx->tx_txg);
        rrw_exit(&ds->ds_bp_rwlock, FTAG);
        ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock));
 
index 370c6a010dcad74332876cceef51f36111405a46..342ec5c15c798122fba182c92a5942ab4409dd10 100644 (file)
@@ -1047,7 +1047,7 @@ upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
                 * will be wrong.
                 */
                rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
-               ASSERT0(dsl_dataset_phys(prev)->ds_bp.blk_birth);
+               ASSERT0(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(prev)->ds_bp));
                rrw_exit(&ds->ds_bp_rwlock, FTAG);
 
                /* The origin doesn't get attached to itself */
index 060a5cc36d703c5c622e0a0595fbe8ecf388ab6a..55e89b89f06ae38d5cf2b5be72200c74fdaa62ae 100644 (file)
@@ -429,8 +429,8 @@ sio2bp(const scan_io_t *sio, blkptr_t *bp)
 {
        memset(bp, 0, sizeof (*bp));
        bp->blk_prop = sio->sio_blk_prop;
-       bp->blk_phys_birth = sio->sio_phys_birth;
-       bp->blk_birth = sio->sio_birth;
+       BP_SET_PHYSICAL_BIRTH(bp, sio->sio_phys_birth);
+       BP_SET_LOGICAL_BIRTH(bp, sio->sio_birth);
        bp->blk_fill = 1;       /* we always only work with data pointers */
        bp->blk_cksum = sio->sio_cksum;
 
@@ -444,8 +444,8 @@ static inline void
 bp2sio(const blkptr_t *bp, scan_io_t *sio, int dva_i)
 {
        sio->sio_blk_prop = bp->blk_prop;
-       sio->sio_phys_birth = bp->blk_phys_birth;
-       sio->sio_birth = bp->blk_birth;
+       sio->sio_phys_birth = BP_GET_PHYSICAL_BIRTH(bp);
+       sio->sio_birth = BP_GET_LOGICAL_BIRTH(bp);
        sio->sio_cksum = bp->blk_cksum;
        sio->sio_nr_dvas = BP_GET_NDVAS(bp);
 
@@ -1721,7 +1721,8 @@ dsl_scan_zil_block(zilog_t *zilog, const blkptr_t *bp, void *arg,
        zbookmark_phys_t zb;
 
        ASSERT(!BP_IS_REDACTED(bp));
-       if (BP_IS_HOLE(bp) || bp->blk_birth <= scn->scn_phys.scn_cur_min_txg)
+       if (BP_IS_HOLE(bp) ||
+           BP_GET_LOGICAL_BIRTH(bp) <= scn->scn_phys.scn_cur_min_txg)
                return (0);
 
        /*
@@ -1730,7 +1731,8 @@ dsl_scan_zil_block(zilog_t *zilog, const blkptr_t *bp, void *arg,
         * (on-disk) even if it hasn't been claimed (even though for
         * scrub there's nothing to do to it).
         */
-       if (claim_txg == 0 && bp->blk_birth >= spa_min_claim_txg(dp->dp_spa))
+       if (claim_txg == 0 &&
+           BP_GET_LOGICAL_BIRTH(bp) >= spa_min_claim_txg(dp->dp_spa))
                return (0);
 
        SET_BOOKMARK(&zb, zh->zh_log.blk_cksum.zc_word[ZIL_ZC_OBJSET],
@@ -1756,7 +1758,7 @@ dsl_scan_zil_record(zilog_t *zilog, const lr_t *lrc, void *arg,
 
                ASSERT(!BP_IS_REDACTED(bp));
                if (BP_IS_HOLE(bp) ||
-                   bp->blk_birth <= scn->scn_phys.scn_cur_min_txg)
+                   BP_GET_LOGICAL_BIRTH(bp) <= scn->scn_phys.scn_cur_min_txg)
                        return (0);
 
                /*
@@ -1764,7 +1766,7 @@ dsl_scan_zil_record(zilog_t *zilog, const lr_t *lrc, void *arg,
                 * already txg sync'ed (but this log block contains
                 * other records that are not synced)
                 */
-               if (claim_txg == 0 || bp->blk_birth < claim_txg)
+               if (claim_txg == 0 || BP_GET_LOGICAL_BIRTH(bp) < claim_txg)
                        return (0);
 
                ASSERT3U(BP_GET_LSIZE(bp), !=, 0);
@@ -1903,7 +1905,8 @@ dsl_scan_prefetch(scan_prefetch_ctx_t *spc, blkptr_t *bp, zbookmark_phys_t *zb)
        if (zfs_no_scrub_prefetch || BP_IS_REDACTED(bp))
                return;
 
-       if (BP_IS_HOLE(bp) || bp->blk_birth <= scn->scn_phys.scn_cur_min_txg ||
+       if (BP_IS_HOLE(bp) ||
+           BP_GET_LOGICAL_BIRTH(bp) <= scn->scn_phys.scn_cur_min_txg ||
            (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE &&
            BP_GET_TYPE(bp) != DMU_OT_OBJSET))
                return;
@@ -2174,7 +2177,7 @@ dsl_scan_recurse(dsl_scan_t *scn, dsl_dataset_t *ds, dmu_objset_type_t ostype,
        if (dnp != NULL &&
            dnp->dn_bonuslen > DN_MAX_BONUS_LEN(dnp)) {
                scn->scn_phys.scn_errors++;
-               spa_log_error(spa, zb, &bp->blk_birth);
+               spa_log_error(spa, zb, BP_GET_LOGICAL_BIRTH(bp));
                return (SET_ERROR(EINVAL));
        }
 
@@ -2270,7 +2273,7 @@ dsl_scan_recurse(dsl_scan_t *scn, dsl_dataset_t *ds, dmu_objset_type_t ostype,
                 * by arc_read() for the cases above.
                 */
                scn->scn_phys.scn_errors++;
-               spa_log_error(spa, zb, &bp->blk_birth);
+               spa_log_error(spa, zb, BP_GET_LOGICAL_BIRTH(bp));
                return (SET_ERROR(EINVAL));
        }
 
@@ -2347,7 +2350,7 @@ dsl_scan_visitbp(const blkptr_t *bp, const zbookmark_phys_t *zb,
        if (f != SPA_FEATURE_NONE)
                ASSERT(dsl_dataset_feature_is_active(ds, f));
 
-       if (bp->blk_birth <= scn->scn_phys.scn_cur_min_txg) {
+       if (BP_GET_LOGICAL_BIRTH(bp) <= scn->scn_phys.scn_cur_min_txg) {
                scn->scn_lt_min_this_txg++;
                return;
        }
@@ -2373,7 +2376,7 @@ dsl_scan_visitbp(const blkptr_t *bp, const zbookmark_phys_t *zb,
         * Don't scan it now unless we need to because something
         * under it was modified.
         */
-       if (BP_PHYSICAL_BIRTH(bp) > scn->scn_phys.scn_cur_max_txg) {
+       if (BP_GET_BIRTH(bp) > scn->scn_phys.scn_cur_max_txg) {
                scn->scn_gt_max_this_txg++;
                return;
        }
@@ -4714,7 +4717,7 @@ dsl_scan_scrub_cb(dsl_pool_t *dp,
 {
        dsl_scan_t *scn = dp->dp_scan;
        spa_t *spa = dp->dp_spa;
-       uint64_t phys_birth = BP_PHYSICAL_BIRTH(bp);
+       uint64_t phys_birth = BP_GET_BIRTH(bp);
        size_t psize = BP_GET_PSIZE(bp);
        boolean_t needs_io = B_FALSE;
        int zio_flags = ZIO_FLAG_SCAN_THREAD | ZIO_FLAG_RAW | ZIO_FLAG_CANFAIL;
index 7237fa8eeb5917859cbc3c884ae44471731f3edd..c4aa98ced433b16f5ce66e142f5466942a2e14ff 100644 (file)
@@ -5495,8 +5495,9 @@ remap_blkptr_cb(uint64_t inner_offset, vdev_t *vd, uint64_t offset,
        vdev_t *oldvd = vdev_lookup_top(vd->vdev_spa,
            DVA_GET_VDEV(&bp->blk_dva[0]));
        vdev_indirect_births_t *vib = oldvd->vdev_indirect_births;
-       bp->blk_phys_birth = vdev_indirect_births_physbirth(vib,
+       uint64_t physical_birth = vdev_indirect_births_physbirth(vib,
            DVA_GET_OFFSET(&bp->blk_dva[0]), DVA_GET_ASIZE(&bp->blk_dva[0]));
+       BP_SET_PHYSICAL_BIRTH(bp, physical_birth);
 
        DVA_SET_VDEV(&bp->blk_dva[0], vd->vdev_id);
        DVA_SET_OFFSET(&bp->blk_dva[0], offset);
@@ -5845,8 +5846,8 @@ metaslab_alloc(spa_t *spa, metaslab_class_t *mc, uint64_t psize, blkptr_t *bp,
        dva_t *hintdva = (hintbp != NULL) ? hintbp->blk_dva : NULL;
        int error = 0;
 
-       ASSERT(bp->blk_birth == 0);
-       ASSERT(BP_PHYSICAL_BIRTH(bp) == 0);
+       ASSERT0(BP_GET_LOGICAL_BIRTH(bp));
+       ASSERT0(BP_GET_PHYSICAL_BIRTH(bp));
 
        spa_config_enter(spa, SCL_ALLOC, FTAG, RW_READER);
 
@@ -5900,7 +5901,7 @@ metaslab_free(spa_t *spa, const blkptr_t *bp, uint64_t txg, boolean_t now)
        int ndvas = BP_GET_NDVAS(bp);
 
        ASSERT(!BP_IS_HOLE(bp));
-       ASSERT(!now || bp->blk_birth >= spa_syncing_txg(spa));
+       ASSERT(!now || BP_GET_LOGICAL_BIRTH(bp) >= spa_syncing_txg(spa));
 
        /*
         * If we have a checkpoint for the pool we need to make sure that
@@ -5918,7 +5919,7 @@ metaslab_free(spa_t *spa, const blkptr_t *bp, uint64_t txg, boolean_t now)
         * normally as they will be referenced by the checkpointed uberblock.
         */
        boolean_t checkpoint = B_FALSE;
-       if (bp->blk_birth <= spa->spa_checkpoint_txg &&
+       if (BP_GET_LOGICAL_BIRTH(bp) <= spa->spa_checkpoint_txg &&
            spa_syncing_txg(spa) > spa->spa_checkpoint_txg) {
                /*
                 * At this point, if the block is part of the checkpoint
index b144d065293077e830eaef5684eafba1397e7f6b..30c528a53049935b20b893fdc067c6682d017058 100644 (file)
@@ -2655,8 +2655,8 @@ spa_claim_notify(zio_t *zio)
                return;
 
        mutex_enter(&spa->spa_props_lock);      /* any mutex will do */
-       if (spa->spa_claim_max_txg < zio->io_bp->blk_birth)
-               spa->spa_claim_max_txg = zio->io_bp->blk_birth;
+       if (spa->spa_claim_max_txg < BP_GET_LOGICAL_BIRTH(zio->io_bp))
+               spa->spa_claim_max_txg = BP_GET_LOGICAL_BIRTH(zio->io_bp);
        mutex_exit(&spa->spa_props_lock);
 }
 
@@ -6266,7 +6266,8 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
        nvlist_t *nvl;
 
        if (props == NULL ||
-           nvlist_lookup_string(props, "tname", &poolname) != 0)
+           nvlist_lookup_string(props,
+           zpool_prop_to_name(ZPOOL_PROP_TNAME), &poolname) != 0)
                poolname = (char *)pool;
 
        /*
@@ -9801,7 +9802,7 @@ spa_sync_iterate_to_convergence(spa_t *spa, dmu_tx_t *tx)
                 * don't want to rely on that here).
                 */
                if (pass == 1 &&
-                   spa->spa_uberblock.ub_rootbp.blk_birth < txg &&
+                   BP_GET_LOGICAL_BIRTH(&spa->spa_uberblock.ub_rootbp) < txg &&
                    !dmu_objset_is_dirty(mos, txg)) {
                        /*
                         * Nothing changed on the first pass, therefore this
index 244b4d26421292ed903bb2429942a504b9f63a29..62d7b4fa2df238884fa901fb64302075016d1a66 100644 (file)
@@ -180,7 +180,7 @@ static int get_head_ds(spa_t *spa, uint64_t dsobj, uint64_t *head_ds)
  * during spa_errlog_sync().
  */
 void
-spa_log_error(spa_t *spa, const zbookmark_phys_t *zb, const uint64_t *birth)
+spa_log_error(spa_t *spa, const zbookmark_phys_t *zb, const uint64_t birth)
 {
        spa_error_entry_t search;
        spa_error_entry_t *new;
@@ -223,13 +223,7 @@ spa_log_error(spa_t *spa, const zbookmark_phys_t *zb, const uint64_t *birth)
                new->se_zep.zb_object = zb->zb_object;
                new->se_zep.zb_level = zb->zb_level;
                new->se_zep.zb_blkid = zb->zb_blkid;
-
-               /*
-                * birth may end up being NULL, e.g. in zio_done(). We
-                * will handle this in process_error_block().
-                */
-               if (birth != NULL)
-                       new->se_zep.zb_birth = *birth;
+               new->se_zep.zb_birth = birth;
        }
 
        avl_insert(tree, new, where);
@@ -258,7 +252,7 @@ find_birth_txg(dsl_dataset_t *ds, zbookmark_err_phys_t *zep,
        if (error == 0 && BP_IS_HOLE(&bp))
                error = SET_ERROR(ENOENT);
 
-       *birth_txg = bp.blk_birth;
+       *birth_txg = BP_GET_LOGICAL_BIRTH(&bp);
        rw_exit(&dn->dn_struct_rwlock);
        dnode_rele(dn, FTAG);
        return (error);
@@ -535,7 +529,7 @@ process_error_block(spa_t *spa, uint64_t head_ds, zbookmark_err_phys_t *zep,
                 */
                zbookmark_phys_t zb;
                zep_to_zb(head_ds, zep, &zb);
-               spa_remove_error(spa, &zb, &zep->zb_birth);
+               spa_remove_error(spa, &zb, zep->zb_birth);
        }
 
        return (error);
@@ -563,7 +557,7 @@ spa_get_last_errlog_size(spa_t *spa)
  */
 static void
 spa_add_healed_error(spa_t *spa, uint64_t obj, zbookmark_phys_t *healed_zb,
-    const uint64_t *birth)
+    const uint64_t birth)
 {
        char name[NAME_MAX_LEN];
 
@@ -618,11 +612,7 @@ spa_add_healed_error(spa_t *spa, uint64_t obj, zbookmark_phys_t *healed_zb,
        healed_zep.zb_object = healed_zb->zb_object;
        healed_zep.zb_level = healed_zb->zb_level;
        healed_zep.zb_blkid = healed_zb->zb_blkid;
-
-       if (birth != NULL)
-               healed_zep.zb_birth = *birth;
-       else
-               healed_zep.zb_birth = 0;
+       healed_zep.zb_birth = birth;
 
        errphys_to_name(&healed_zep, name, sizeof (name));
 
@@ -742,7 +732,7 @@ spa_remove_healed_errors(spa_t *spa, avl_tree_t *s, avl_tree_t *l, dmu_tx_t *tx)
  * later in spa_remove_healed_errors().
  */
 void
-spa_remove_error(spa_t *spa, zbookmark_phys_t *zb, const uint64_t *birth)
+spa_remove_error(spa_t *spa, zbookmark_phys_t *zb, uint64_t birth)
 {
        spa_add_healed_error(spa, spa->spa_errlog_last, zb, birth);
        spa_add_healed_error(spa, spa->spa_errlog_scrub, zb, birth);
@@ -890,7 +880,7 @@ sync_upgrade_errlog(spa_t *spa, uint64_t spa_err_obj, uint64_t *newobj,
                if (error == EACCES)
                        error = 0;
                else if (!error)
-                       zep.zb_birth = bp.blk_birth;
+                       zep.zb_birth = BP_GET_LOGICAL_BIRTH(&bp);
 
                rw_exit(&dn->dn_struct_rwlock);
                dnode_rele(dn, FTAG);
index 873089a53e3417891a68d2061f8f552618adcd6c..32158e8c592ced324887e7f744f96ce8d272835d 100644 (file)
@@ -783,7 +783,7 @@ spa_flush_metaslabs(spa_t *spa, dmu_tx_t *tx)
         * request of flushing everything before we attempt to return
         * immediately.
         */
-       if (spa->spa_uberblock.ub_rootbp.blk_birth < txg &&
+       if (BP_GET_LOGICAL_BIRTH(&spa->spa_uberblock.ub_rootbp) < txg &&
            !dmu_objset_is_dirty(spa_meta_objset(spa), txg) &&
            !spa_flush_all_logs_requested(spa))
                return;
index 1921be1076603c7929ac10fae9b809401cef5871..22ee8036c47389ab4129f449155a011e937f431e 100644 (file)
@@ -70,5 +70,5 @@ uberblock_update(uberblock_t *ub, vdev_t *rvd, uint64_t txg, uint64_t mmp_delay)
        }
        ub->ub_checkpoint_txg = 0;
 
-       return (ub->ub_rootbp.blk_birth == txg);
+       return (BP_GET_LOGICAL_BIRTH(&ub->ub_rootbp) == txg);
 }
index f9a01c9f53f4e000f509d979f699bdb2e834373d..102eacb0334997b58d09f97caecdda362b21cd6e 100644 (file)
@@ -531,7 +531,7 @@ vdev_mirror_child_select(zio_t *zio)
        uint64_t txg = zio->io_txg;
        int c, lowest_load;
 
-       ASSERT(zio->io_bp == NULL || BP_PHYSICAL_BIRTH(zio->io_bp) == txg);
+       ASSERT(zio->io_bp == NULL || BP_GET_BIRTH(zio->io_bp) == txg);
 
        lowest_load = INT_MAX;
        mm->mm_preferred_cnt = 0;
index 9d0b8763f16f349e6a8e35d69b867e47f1806d03..b03331ec69c62457b40e2284d882f0d6d91aa93e 100644 (file)
@@ -2190,12 +2190,11 @@ vdev_raidz_close(vdev_t *vd)
 
 /*
  * Return the logical width to use, given the txg in which the allocation
- * happened.  Note that BP_PHYSICAL_BIRTH() is usually the txg in which the
+ * happened.  Note that BP_GET_BIRTH() is usually the txg in which the
  * BP was allocated.  Remapped BP's (that were relocated due to device
- * removal, see remap_blkptr_cb()), will have a more recent
- * BP_PHYSICAL_BIRTH() which reflects when the BP was relocated, but we can
- * ignore these because they can't be on RAIDZ (device removal doesn't
- * support RAIDZ).
+ * removal, see remap_blkptr_cb()), will have a more recent physical birth
+ * which reflects when the BP was relocated, but we can ignore these because
+ * they can't be on RAIDZ (device removal doesn't support RAIDZ).
  */
 static uint64_t
 vdev_raidz_get_logical_width(vdev_raidz_t *vdrz, uint64_t txg)
@@ -2295,7 +2294,7 @@ vdev_raidz_io_verify(zio_t *zio, raidz_map_t *rm, raidz_row_t *rr, int col)
        logical_rs.rs_start = rr->rr_offset;
        logical_rs.rs_end = logical_rs.rs_start +
            vdev_raidz_asize(zio->io_vd, rr->rr_size,
-           BP_PHYSICAL_BIRTH(zio->io_bp));
+           BP_GET_BIRTH(zio->io_bp));
 
        raidz_col_t *rc = &rr->rr_col[col];
        vdev_t *cvd = zio->io_vd->vdev_child[rc->rc_devidx];
@@ -2518,7 +2517,7 @@ vdev_raidz_io_start(zio_t *zio)
        raidz_map_t *rm;
 
        uint64_t logical_width = vdev_raidz_get_logical_width(vdrz,
-           BP_PHYSICAL_BIRTH(zio->io_bp));
+           BP_GET_BIRTH(zio->io_bp));
        if (logical_width != vdrz->vd_physical_width) {
                zfs_locked_range_t *lr = NULL;
                uint64_t synced_offset = UINT64_MAX;
index e549e1895f397929c0ad6522dd86a0431f7ec603..1af357c58006998dba0a9cb9344b9c9c72d4b909 100644 (file)
@@ -557,7 +557,7 @@ zil_clear_log_block(zilog_t *zilog, const blkptr_t *bp, void *tx,
         * that we rewind to is invalid. Thus, we return -1 so
         * zil_parse() doesn't attempt to read it.
         */
-       if (bp->blk_birth >= first_txg)
+       if (BP_GET_LOGICAL_BIRTH(bp) >= first_txg)
                return (-1);
 
        if (zil_bp_tree_add(zilog, bp) != 0)
@@ -583,7 +583,7 @@ zil_claim_log_block(zilog_t *zilog, const blkptr_t *bp, void *tx,
         * Claim log block if not already committed and not already claimed.
         * If tx == NULL, just verify that the block is claimable.
         */
-       if (BP_IS_HOLE(bp) || bp->blk_birth < first_txg ||
+       if (BP_IS_HOLE(bp) || BP_GET_LOGICAL_BIRTH(bp) < first_txg ||
            zil_bp_tree_add(zilog, bp) != 0)
                return (0);
 
@@ -608,7 +608,7 @@ zil_claim_write(zilog_t *zilog, const lr_t *lrc, void *tx, uint64_t first_txg)
         * waited for all writes to be stable first), so it is semantically
         * correct to declare this the end of the log.
         */
-       if (lr->lr_blkptr.blk_birth >= first_txg) {
+       if (BP_GET_LOGICAL_BIRTH(&lr->lr_blkptr) >= first_txg) {
                error = zil_read_log_data(zilog, lr, NULL);
                if (error != 0)
                        return (error);
@@ -655,7 +655,7 @@ zil_claim_clone_range(zilog_t *zilog, const lr_t *lrc, void *tx,
                 * just in case lets be safe and just stop here now instead of
                 * corrupting the pool.
                 */
-               if (BP_PHYSICAL_BIRTH(bp) >= first_txg)
+               if (BP_GET_BIRTH(bp) >= first_txg)
                        return (SET_ERROR(ENOENT));
 
                /*
@@ -710,8 +710,8 @@ zil_free_write(zilog_t *zilog, const lr_t *lrc, void *tx, uint64_t claim_txg)
        /*
         * If we previously claimed it, we need to free it.
         */
-       if (bp->blk_birth >= claim_txg && zil_bp_tree_add(zilog, bp) == 0 &&
-           !BP_IS_HOLE(bp)) {
+       if (BP_GET_LOGICAL_BIRTH(bp) >= claim_txg &&
+           zil_bp_tree_add(zilog, bp) == 0 && !BP_IS_HOLE(bp)) {
                zio_free(zilog->zl_spa, dmu_tx_get_txg(tx), bp);
        }
 
@@ -1965,7 +1965,7 @@ next_lwb:
                    &slog);
        }
        if (error == 0) {
-               ASSERT3U(bp->blk_birth, ==, txg);
+               ASSERT3U(BP_GET_LOGICAL_BIRTH(bp), ==, txg);
                BP_SET_CHECKSUM(bp, nlwb->lwb_slim ? ZIO_CHECKSUM_ZILOG2 :
                    ZIO_CHECKSUM_ZILOG);
                bp->blk_cksum = lwb->lwb_blk.blk_cksum;
index 213fe5c483f2280a58e622686d1a8b11d4bc0425..e96bbda35a047e19ee8579239d089eb6cb7043d8 100644 (file)
@@ -613,7 +613,7 @@ error:
                zio->io_error = SET_ERROR(EIO);
                if ((zio->io_flags & ZIO_FLAG_SPECULATIVE) == 0) {
                        spa_log_error(spa, &zio->io_bookmark,
-                           &zio->io_bp->blk_birth);
+                           BP_GET_LOGICAL_BIRTH(zio->io_bp));
                        (void) zfs_ereport_post(FM_EREPORT_ZFS_AUTHENTICATION,
                            spa, NULL, &zio->io_bookmark, zio, 0);
                }
@@ -1052,8 +1052,8 @@ zfs_blkptr_verify_log(spa_t *spa, const blkptr_t *bp,
            (long long)bp->blk_prop,
            (long long)bp->blk_pad[0],
            (long long)bp->blk_pad[1],
-           (long long)bp->blk_phys_birth,
-           (long long)bp->blk_birth,
+           (long long)BP_GET_PHYSICAL_BIRTH(bp),
+           (long long)BP_GET_LOGICAL_BIRTH(bp),
            (long long)bp->blk_fill,
            (long long)bp->blk_cksum.zc_word[0],
            (long long)bp->blk_cksum.zc_word[1],
@@ -1156,10 +1156,11 @@ zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp,
        /*
         * Pool-specific checks.
         *
-        * Note: it would be nice to verify that the blk_birth and
-        * BP_PHYSICAL_BIRTH() are not too large.  However, spa_freeze()
-        * allows the birth time of log blocks (and dmu_sync()-ed blocks
-        * that are in the log) to be arbitrarily large.
+        * Note: it would be nice to verify that the logical birth
+        * and physical birth are not too large.  However,
+        * spa_freeze() allows the birth time of log blocks (and
+        * dmu_sync()-ed blocks that are in the log) to be arbitrarily
+        * large.
         */
        for (int i = 0; i < BP_GET_NDVAS(bp); i++) {
                const dva_t *dva = &bp->blk_dva[i];
@@ -1246,7 +1247,7 @@ zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp,
 {
        zio_t *zio;
 
-       zio = zio_create(pio, spa, BP_PHYSICAL_BIRTH(bp), bp,
+       zio = zio_create(pio, spa, BP_GET_BIRTH(bp), bp,
            data, size, size, done, private,
            ZIO_TYPE_READ, priority, flags, NULL, 0, zb,
            ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
@@ -1435,7 +1436,7 @@ zio_claim(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
         * starts allocating blocks -- so that nothing is allocated twice.
         * If txg == 0 we just verify that the block is claimable.
         */
-       ASSERT3U(spa->spa_uberblock.ub_rootbp.blk_birth, <,
+       ASSERT3U(BP_GET_LOGICAL_BIRTH(&spa->spa_uberblock.ub_rootbp), <,
            spa_min_claim_txg(spa));
        ASSERT(txg == spa_min_claim_txg(spa) || txg == 0);
        ASSERT(!BP_GET_DEDUP(bp) || !spa_writeable(spa));       /* zdb(8) */
@@ -1731,7 +1732,7 @@ zio_write_bp_init(zio_t *zio)
                blkptr_t *bp = zio->io_bp;
                zio_prop_t *zp = &zio->io_prop;
 
-               ASSERT(bp->blk_birth != zio->io_txg);
+               ASSERT(BP_GET_LOGICAL_BIRTH(bp) != zio->io_txg);
 
                *bp = *zio->io_bp_override;
                zio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
@@ -1819,7 +1820,7 @@ zio_write_compress(zio_t *zio)
        ASSERT(zio->io_child_type != ZIO_CHILD_DDT);
        ASSERT(zio->io_bp_override == NULL);
 
-       if (!BP_IS_HOLE(bp) && bp->blk_birth == zio->io_txg) {
+       if (!BP_IS_HOLE(bp) && BP_GET_LOGICAL_BIRTH(bp) == zio->io_txg) {
                /*
                 * We're rewriting an existing block, which means we're
                 * working on behalf of spa_sync().  For spa_sync() to
@@ -1866,7 +1867,7 @@ zio_write_compress(zio_t *zio)
                        BP_SET_TYPE(bp, zio->io_prop.zp_type);
                        BP_SET_LEVEL(bp, zio->io_prop.zp_level);
                        zio_buf_free(cbuf, lsize);
-                       bp->blk_birth = zio->io_txg;
+                       BP_SET_LOGICAL_BIRTH(bp, zio->io_txg);
                        zio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
                        ASSERT(spa_feature_is_active(spa,
                            SPA_FEATURE_EMBEDDED_DATA));
@@ -1947,7 +1948,7 @@ zio_write_compress(zio_t *zio)
         * spa_sync() to allocate new blocks, but force rewrites after that.
         * There should only be a handful of blocks after pass 1 in any case.
         */
-       if (!BP_IS_HOLE(bp) && bp->blk_birth == zio->io_txg &&
+       if (!BP_IS_HOLE(bp) && BP_GET_LOGICAL_BIRTH(bp) == zio->io_txg &&
            BP_GET_PSIZE(bp) == psize &&
            pass >= zfs_sync_pass_rewrite) {
                VERIFY3U(psize, !=, 0);
@@ -1961,7 +1962,7 @@ zio_write_compress(zio_t *zio)
        }
 
        if (psize == 0) {
-               if (zio->io_bp_orig.blk_birth != 0 &&
+               if (BP_GET_LOGICAL_BIRTH(&zio->io_bp_orig) != 0 &&
                    spa_feature_is_active(spa, SPA_FEATURE_HOLE_BIRTH)) {
                        BP_SET_LSIZE(bp, lsize);
                        BP_SET_TYPE(bp, zp->zp_type);
@@ -3539,7 +3540,7 @@ zio_ddt_write(zio_t *zio)
                else
                        ddt_phys_addref(ddp);
        } else if (zio->io_bp_override) {
-               ASSERT(bp->blk_birth == txg);
+               ASSERT(BP_GET_LOGICAL_BIRTH(bp) == txg);
                ASSERT(BP_EQUAL(bp, zio->io_bp_override));
                ddt_phys_fill(ddp, bp);
                ddt_phys_addref(ddp);
@@ -3810,11 +3811,13 @@ zio_dva_claim(zio_t *zio)
 static void
 zio_dva_unallocate(zio_t *zio, zio_gang_node_t *gn, blkptr_t *bp)
 {
-       ASSERT(bp->blk_birth == zio->io_txg || BP_IS_HOLE(bp));
+       ASSERT(BP_GET_LOGICAL_BIRTH(bp) == zio->io_txg || BP_IS_HOLE(bp));
        ASSERT(zio->io_bp_override == NULL);
 
-       if (!BP_IS_HOLE(bp))
-               metaslab_free(zio->io_spa, bp, bp->blk_birth, B_TRUE);
+       if (!BP_IS_HOLE(bp)) {
+               metaslab_free(zio->io_spa, bp, BP_GET_LOGICAL_BIRTH(bp),
+                   B_TRUE);
+       }
 
        if (gn != NULL) {
                for (int g = 0; g < SPA_GBH_NBLKPTRS; g++) {
@@ -4555,8 +4558,8 @@ zio_ready(zio_t *zio)
 
        if (zio->io_ready) {
                ASSERT(IO_IS_ALLOCATING(zio));
-               ASSERT(bp->blk_birth == zio->io_txg || BP_IS_HOLE(bp) ||
-                   (zio->io_flags & ZIO_FLAG_NOPWRITE));
+               ASSERT(BP_GET_LOGICAL_BIRTH(bp) == zio->io_txg ||
+                   BP_IS_HOLE(bp) || (zio->io_flags & ZIO_FLAG_NOPWRITE));
                ASSERT(zio->io_children[ZIO_CHILD_GANG][ZIO_WAIT_READY] == 0);
 
                zio->io_ready(zio);
@@ -4852,7 +4855,7 @@ zio_done(zio_t *zio)
                         * error and generate a logical data ereport.
                         */
                        spa_log_error(zio->io_spa, &zio->io_bookmark,
-                           &zio->io_bp->blk_birth);
+                           BP_GET_LOGICAL_BIRTH(zio->io_bp));
                        (void) zfs_ereport_post(FM_EREPORT_ZFS_DATA,
                            zio->io_spa, NULL, &zio->io_bookmark, zio, 0);
                }
index e511b31fee6d092569ad631f260b1cd5681e5498..ce6772a40c8b0ac632cd6e99cd71aaa21240627c 100644 (file)
@@ -272,7 +272,7 @@ static void
 zio_checksum_gang_verifier(zio_cksum_t *zcp, const blkptr_t *bp)
 {
        const dva_t *dva = BP_IDENTITY(bp);
-       uint64_t txg = BP_PHYSICAL_BIRTH(bp);
+       uint64_t txg = BP_GET_BIRTH(bp);
 
        ASSERT(BP_IS_GANG(bp));