HAMMER VFS - Bump the default hammer rev to 6
[dragonfly.git] / sys / vfs / hammer / hammer_disk.h
index 7de627a..d0fed5a 100644 (file)
@@ -91,6 +91,8 @@
 #define HAMMER_OFF_LONG_REC_MASK 0x0FFFFFFFFF000000ULL /* recovery boundary */
 #define HAMMER_RECOVERY_BND    0x0000000001000000ULL
 
+#define HAMMER_OFF_BAD         ((hammer_off_t)-1)
+
 /*
  * The current limit of volumes that can make up a HAMMER FS
  */
@@ -287,12 +289,20 @@ typedef struct hammer_blockmap_layer1 *hammer_blockmap_layer1_t;
 #define HAMMER_LAYER1_CRCSIZE  \
        offsetof(struct hammer_blockmap_layer1, layer1_crc)
 
+/*
+ * layer2 entry for 8MB bigblock.
+ *
+ * NOTE: bytes_free is signed and can legally go negative if/when data
+ *      de-dup occurs.  This field will never go higher than
+ *      HAMMER_LARGEBLOCK_SIZE.  If exactly HAMMER_LARGEBLOCK_SIZE
+ *      the big-block is completely free.
+ */
 struct hammer_blockmap_layer2 {
        u_int8_t        zone;           /* typed allocation zone */
        u_int8_t        unused01;
        u_int16_t       unused02;
        u_int32_t       append_off;     /* allocatable space index */
-       u_int32_t       bytes_free;     /* bytes free within this bigblock */
+       int32_t         bytes_free;     /* bytes free within this bigblock */
        hammer_crc_t    entry_crc;
 };
 
@@ -386,6 +396,11 @@ typedef struct hammer_blockmap_layer2 *hammer_blockmap_layer2_t;
  * (3) Data overwrite for nohistory operations covered by REDO records
  *     can be supported (instead of rolling a new block allocation),
  *     by rolling UNDO for the prior contents of the data.
+ *
+ *                             HAMMER VERSION 5 CHANGES
+ *
+ * Hammer version 5 contains a minor adjustment making layer2's bytes_free
+ * field signed, allowing dedup to push it into the negative domain.
  */
 #define HAMMER_HEAD_ONDISK_SIZE                32
 #define HAMMER_HEAD_ALIGN              8
@@ -494,6 +509,8 @@ struct hammer_fifo_redo {
        hammer_off_t            redo_offset;    /* logical offset in file */
        int32_t                 redo_data_bytes;
        u_int32_t               redo_flags;
+       u_int32_t               redo_localization;
+       u_int32_t               redo_reserved;
        u_int64_t               redo_mtime;     /* set mtime */
 };
 
@@ -628,14 +645,16 @@ typedef struct hammer_volume_ondisk *hammer_volume_ondisk_t;
         sizeof(hammer_crc_t))
 
 #define HAMMER_VOL_VERSION_MIN         1       /* minimum supported version */
-#define HAMMER_VOL_VERSION_DEFAULT     4       /* newfs default version */
-#define HAMMER_VOL_VERSION_WIP         5       /* version >= this is WIP */
-#define HAMMER_VOL_VERSION_MAX         4       /* maximum supported version */
+#define HAMMER_VOL_VERSION_DEFAULT     6       /* newfs default version */
+#define HAMMER_VOL_VERSION_WIP         7       /* version >= this is WIP */
+#define HAMMER_VOL_VERSION_MAX         6       /* maximum supported version */
 
 #define HAMMER_VOL_VERSION_ONE         1
 #define HAMMER_VOL_VERSION_TWO         2       /* new dirent layout (2.3+) */
 #define HAMMER_VOL_VERSION_THREE       3       /* new snapshot layout (2.5+) */
 #define HAMMER_VOL_VERSION_FOUR                4       /* new undo/flush (2.5+) */
+#define HAMMER_VOL_VERSION_FIVE                5       /* dedup (2.9+) */
+#define HAMMER_VOL_VERSION_SIX         6       /* DIRHASH_ALG1 */
 
 /*
  * Record types are fairly straightforward.  The B-Tree includes the record
@@ -798,6 +817,14 @@ struct hammer_symlink_data {
  *
  * sync_low_tid is not yet used but will represent the highest pruning
  * end-point, after which full history is available.
+ *
+ * We need to pack this structure making it equally sized on both 32-bit and
+ * 64-bit machines as it is part of struct hammer_ioc_mrecord_pfs which is
+ * send over the wire in hammer mirror operations. Only on 64-bit machines
+ * the size of this struct differ when packed or not. This leads us to the
+ * situation where old 64-bit systems (using the non-packed structure),
+ * which were never able to mirror to/from 32-bit systems, are now no longer
+ * able to mirror to/from newer 64-bit systems (using the packed structure).
  */
 struct hammer_pseudofs_data {
        hammer_tid_t    sync_low_tid;   /* full history beyond this point */
@@ -819,7 +846,7 @@ struct hammer_pseudofs_data {
        int32_t         prune_min;      /* do not prune recent history */
        int32_t         prune_max;      /* do not retain history beyond here */
        int32_t         reserved[16];
-};
+} __packed;
 
 typedef struct hammer_pseudofs_data *hammer_pseudofs_data_t;