]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/spa.h
Provide macros for setting and getting blkptr birth times
[mirror_zfs.git] / include / sys / spa.h
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,