hammer2 - initial mkdir skeleton
[dragonfly.git] / sys / vfs / hammer2 / hammer2_disk.h
1 /*
2  * Copyright (c) 2011-2012 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@dragonflybsd.org>
6  * by Venkatesh Srinivas <vsrinivas@dragonflybsd.org>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  * 3. Neither the name of The DragonFly Project nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific, prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 #ifndef VFS_HAMMER2_DISK_H_
36 #define VFS_HAMMER2_DISK_H_
37
38 /*
39  * The structures below represent the on-disk media structures for the HAMMER2
40  * filesystem.  Note that all fields for on-disk structures are naturally
41  * aligned.  The host endian format is typically used - compatibility is
42  * possible if the implementation detects reversed endian and adjusts accesses
43  * accordingly.
44  *
45  * HAMMER2 primarily revolves around the directory topology:  inodes,
46  * directory entries, and block tables.  Block device buffer cache buffers
47  * are always 64KB.  Logical file buffers are typically 16KB.  All data
48  * references utilize 64-bit byte offsets.
49  *
50  * Free block management is handled independently using blocks reserved by
51  * the media topology.
52  */
53
54 /*
55  * The data at the end of a file or directory may be a fragment in order
56  * to optimize storage efficiency.  The minimum fragment size is 64 bytes.
57  * Since allocations are in powers of 2 fragments must also be sized in
58  * powers of 2 (64, 128, 256, ... 65536).
59  *
60  * For the moment the maximum allocation size is HAMMER2_PBUFSIZE (64K),
61  * which is 2^16.  Larger extents may be supported in the future.
62  *
63  * A full indirect block uses supports 1024 x 64-byte blockrefs.
64  *
65  * A maximally sized file (2^64-1 bytes) requires 5 indirect block levels.
66  * The hammer2_blockset in the volume header or file inode has another 8
67  * entries, giving us 66+3 = 69 bits of address space.  However, some bits
68  * are taken up by (potentially) requests for redundant copies.  HAMMER2
69  * currently supports up to 8 copies, which brings the address space down
70  * to 66 bits and gives us 2 bits of leeway.
71  */
72 #define HAMMER2_MIN_ALLOC       64      /* minimum allocation size */
73 #define HAMMER2_MIN_RADIX       6       /* minimum allocation size 2^N */
74 #define HAMMER2_MAX_RADIX       16      /* maximum allocation size 2^N */
75 #define HAMMER2_IND1_RADIX      26      /* lowest full indirect block radix */
76 #define HAMMER2_IND2_RADIX      36
77 #define HAMMER2_IND3_RADIX      46
78 #define HAMMER2_IND4_RADIX      56
79 #define HAMMER2_IND5_RADIX      66      /* highest full indirect block radix */
80
81 /*
82  * HAMMER2 utilizes 64K physical buffers and 16K logical filesystem buffers.
83  * The smaller logical filesystem buffers reduce ram waste when the OS is
84  * caching lots of small files.
85  */
86 #define HAMMER2_PBUFRADIX       16      /* physical buf (1<<16) bytes */
87 #define HAMMER2_PBUFSIZE        65536   /* fixed physical device buffer size */
88 #define HAMMER2_LBUFSIZE        16384   /* vnode/logical file buffer size */
89
90 /*
91  * HAMMER2 processes blockrefs in sets of 8.  The set is fully associative,
92  * is not sorted, and may contain holes.
93  *
94  * A full indirect block supports 1024 blockrefs.
95  *
96  * An inode embeds one set of blockrefs but may also use the data area for
97  * up to 512 bytes of direct data.
98  */
99 #define HAMMER2_SET_COUNT       8       /* direct entries & associativity */
100 #define HAMMER2_SET_RADIX       3
101 #define HAMMER2_IND_COUNT       1024    /* 1 << HAMMER2_IND_RADIX */
102 #define HAMMER2_IND_RADIX       10
103 #define HAMMER2_EMBEDDED_BYTES  512
104 #define HAMMER2_EMBEDDED_RADIX  9
105
106 #define HAMMER2_PBUFMASK        (HAMMER2_PBUFSIZE - 1)
107 #define HAMMER2_LBUFMASK        (HAMMER2_LBUFSIZE - 1)
108
109 #define HAMMER2_PBUFSIZE64      ((hammer2_off_t)HAMMER2_PBUFSIZE)
110 #define HAMMER2_PBUFMASK64      ((hammer2_off_t)HAMMER2_PBUFMASK)
111 #define HAMMER2_LBUFMASK64      ((hammer2_off_t)HAMMER2_LBUFMASK)
112
113 #define HAMMER2_UUID_STRING     "5cbb9ad1-862d-11dc-a94d-01301bb8a9f5"
114
115 /*
116  * A HAMMER2 filesystem is always sized in multiples of 8MB.
117  *
118  * A 4MB segment is reserved at the beginning of each 2GB zone.  This segment
119  * contains the volume header, the free block table, and possibly other
120  * information in the future.  4MB = 64 x 64K blocks.
121  */
122 #define HAMMER2_VOLUME_ALIGN            (8 * 1024 * 1024)
123 #define HAMMER2_VOLUME_ALIGN64          ((hammer2_off_t)HAMMER2_VOLUME_ALIGN)
124 #define HAMMER2_VOLUME_ALIGNMASK        (HAMMER2_VOLUME_ALIGN - 1)
125 #define HAMMER2_VOLUME_ALIGNMASK64     ((hammer2_off_t)HAMMER2_VOLUME_ALIGNMASK)
126
127 #define HAMMER2_NEWFS_ALIGN             (HAMMER2_VOLUME_ALIGN)
128 #define HAMMER2_NEWFS_ALIGN64           ((hammer2_off_t)HAMMER2_VOLUME_ALIGN)
129 #define HAMMER2_NEWFS_ALIGNMASK         (HAMMER2_VOLUME_ALIGN - 1)
130 #define HAMMER2_NEWFS_ALIGNMASK64       ((hammer2_off_t)HAMMER2_NEWFS_ALIGNMASK)
131
132 #define HAMMER2_RESERVE_BYTES64         (2LLU * 1024 * 1024 * 1024)
133 #define HAMMER2_RESERVE_MASK64          (HAMMER2_RESERVE_BYTES64 - 1)
134 #define HAMMER2_RESERVE_SEG             (4 * 1024 * 1024)
135 #define HAMMER2_RESERVE_SEG64           ((hammer2_off_t)HAMMER2_RESERVE_SEG)
136 #define HAMMER2_RESERVE_BLOCKS          (HAMMER2_RESERVE_SEG / HAMMER2_PBUFSIZE)
137
138 /*
139  * Two linear areas can be reserved after the initial 2MB segment in the base
140  * zone (the one starting at offset 0).  These areas are NOT managed by the
141  * block allocator and do not fall under HAMMER2 crc checking rules based
142  * at the volume header (but can be self-CRCd internally, depending).
143  */
144 #define HAMMER2_BOOT_MIN_BYTES          HAMMER2_VOLUME_ALIGN
145 #define HAMMER2_BOOT_NOM_BYTES          (64*1024*1024)
146 #define HAMMER2_BOOT_MAX_BYTES          (256*1024*1024)
147
148 #define HAMMER2_REDO_MIN_BYTES          HAMMER2_VOLUME_ALIGN
149 #define HAMMER2_REDO_NOM_BYTES          (256*1024*1024)
150 #define HAMMER2_REDO_MAX_BYTES          (1024*1024*1024)
151
152 /*
153  * Most HAMMER2 types are implemented as unsigned 64-bit integers.
154  * Transaction ids are monotonic.
155  *
156  * We utilize 32-bit iSCSI CRCs.
157  */
158 typedef uint64_t hammer2_tid_t;
159 typedef uint64_t hammer2_off_t;
160 typedef uint64_t hammer2_key_t;
161 typedef uint32_t hammer2_crc32_t;
162
163 /*
164  * Miscellanious ranges (all are unsigned).
165  */
166 #define HAMMER2_MIN_TID         1ULL
167 #define HAMMER2_MAX_TID         0xFFFFFFFFFFFFFFFFULL
168 #define HAMMER2_MIN_KEY         0ULL
169 #define HAMMER2_MAX_KEY         0xFFFFFFFFFFFFFFFFULL
170 #define HAMMER2_MIN_OFFSET      0ULL
171 #define HAMMER2_MAX_OFFSET      0xFFFFFFFFFFFFFFFFULL
172
173 /*
174  * HAMMER2 data offset special cases and masking.
175  *
176  * All HAMMER2 data offsets have to be broken down into a 64K buffer base
177  * offset (HAMMER2_OFF_MASK_HI) and a 64K buffer index (HAMMER2_OFF_MASK_LO).
178  *
179  * Indexes into physical buffers are always 64-byte aligned.  The low 6 bits
180  * of the data offset field specifies how large the data chunk being pointed
181  * to as a power of 2.  This value typically ranges from HAMMER2_MIN_RADIX
182  * to HAMMER2_MAX_RADIX (6-16).  Larger values may be supported in the future
183  * to support file extents.
184  */
185 #define HAMMER2_OFF_BAD         ((hammer2_off_t)-1)
186 #define HAMMER2_OFF_MASK        0xFFFFFFFFFFFFFFC0ULL
187 #define HAMMER2_OFF_MASK_LO     (HAMMER2_OFF_MASK & HAMMER2_PBUFMASK64)
188 #define HAMMER2_OFF_MASK_HI     (~HAMMER2_PBUFMASK64)
189 #define HAMMER2_OFF_MASK_RADIX  0x000000000000003FULL
190 #define HAMMER2_MAX_COPIES      6
191
192 /*
193  * HAMMER2 directory support and pre-defined keys
194  */
195 #define HAMMER2_DIRHASH_VISIBLE 0x8000000000000000ULL
196 #define HAMMER2_DIRHASH_USERMSK 0x7FFFFFFFFFFFFFFFULL
197 #define HAMMER2_DIRHASH_LOMASK  0x0000000000007FFFULL
198 #define HAMMER2_DIRHASH_HIMASK  0xFFFFFFFFFFFF0000ULL
199 #define HAMMER2_DIRHASH_FORCED  0x0000000000008000ULL   /* bit forced on */
200
201 #define HAMMER2_SROOT_KEY       0x0000000000000000ULL   /* volume to sroot */
202
203 /*
204  * The media block reference structure.  This forms the core of the HAMMER2
205  * media topology recursion.  This 64-byte data structure is embedded in the
206  * volume header, in inodes (which are also directory entries), and in
207  * indirect blocks.
208  *
209  * A blockref references a single media item, which typically can be a
210  * directory entry (aka inode), indirect block, or data block.
211  *
212  * The primary feature a blockref represents is the ability to validate
213  * the entire tree underneath it via its check code.  Any modification to
214  * anything propagates up the blockref tree all the way to the root, replacing
215  * the related blocks.  Propagations can shortcut to the volume root to
216  * implement the 'fast syncing' feature but this only delays the eventual
217  * propagation.
218  *
219  * The check code can be a simple 32-bit iscsi code, a 64-bit crc,
220  * or as complex as a 192 bit cryptographic hash.  192 bits is the maximum
221  * supported check code size, which is not sufficient for unverified dedup
222  * UNLESS one doesn't mind once-in-a-blue-moon data corruption (such as when
223  * farming web data).  HAMMER2 has an unverified dedup feature for just this
224  * purpose.
225  */
226 struct hammer2_blockref {               /* MUST BE EXACTLY 64 BYTES */
227         uint8_t         type;           /* type of underlying item */
228         uint8_t         methods;        /* check method & compression method */
229         uint8_t         copyid;         /* specify which copy this is */
230         uint8_t         keybits;        /* #of keybits masked off 0=leaf */
231         uint8_t         vradix;         /* virtual data/meta-data size */
232         uint8_t         flags;          /* blockref flags */
233         uint8_t         reserved06;
234         uint8_t         reserved07;
235         hammer2_key_t   key;            /* key specification */
236         hammer2_tid_t   mirror_tid;     /* propagate for mirror scan */
237         hammer2_tid_t   modify_tid;     /* modifications sans propagation */
238         hammer2_off_t   data_off;       /* low 6 bits is phys size (radix)*/
239         union {                         /* check info */
240                 char    buf[24];
241                 struct {
242                         uint32_t value;
243                         uint32_t unused[5];
244                 } iscsi32;
245                 struct {
246                         uint64_t value;
247                         uint64_t unused[2];
248                 } crc64;
249                 struct {
250                         char data[24];
251                 } sha192;
252         } check;
253 };
254
255 typedef struct hammer2_blockref hammer2_blockref_t;
256
257 #define HAMMER2_BREF_SYNC1              0x01    /* modification synchronized */
258 #define HAMMER2_BREF_SYNC2              0x02    /* modification committed */
259 #define HAMMER2_BREF_DESYNCCHLD         0x04    /* desynchronize children */
260 #define HAMMER2_BREF_DELETED            0x80    /* indicates a deletion */
261
262 #define HAMMER2_BLOCKREF_BYTES          64      /* blockref struct in bytes */
263
264 #define HAMMER2_BREF_TYPE_EMPTY         0
265 #define HAMMER2_BREF_TYPE_INODE         1
266 #define HAMMER2_BREF_TYPE_INDIRECT      2
267 #define HAMMER2_BREF_TYPE_DATA          3
268 #define HAMMER2_BREF_TYPE_VOLUME        255     /* pseudo-type */
269
270 #define HAMMER2_ENC_COMPMETHOD(n)       (n)
271 #define HAMMER2_ENC_CHECKMETHOD(n)      ((n) << 4)
272 #define HAMMER2_DEC_COMPMETHOD(n)       ((n) & 15)
273 #define HAMMER2_DEC_CHECKMETHOD(n)      (((n) >> 4) & 15)
274
275 /*
276  * HAMMER2 block references are collected into sets of 8 blockrefs.  These
277  * sets are fully associative, meaning the elements making up a set are
278  * not sorted in any way and may contain duplicate entries, holes, or
279  * entries which shortcut multiple levels of indirection.  Sets are used
280  * in various ways:
281  *
282  * (1) When redundancy is desired a set may contain several duplicate
283  *     entries pointing to different copies of the same data.  Up to 8 copies
284  *     are supported but the set structure becomes a bit inefficient once
285  *     you go over 4.
286  *
287  * (2) The blockrefs in a set can shortcut multiple levels of indirections
288  *     within the bounds imposed by the parent of set.
289  *
290  * When a set fills up another level of indirection is inserted, moving
291  * some or all of the set's contents into indirect blocks placed under the
292  * set.  This is a top-down approach in that indirect blocks are not created
293  * until the set actually becomes full (that is, the entries in the set can
294  * shortcut the indirect blocks when the set is not full).  Depending on how
295  * things are filled multiple indirect blocks will eventually be created.
296  */
297 struct hammer2_blockset {
298         hammer2_blockref_t      blockref[HAMMER2_SET_COUNT];
299 };
300
301 typedef struct hammer2_blockset hammer2_blockset_t;
302
303 /*
304  * Catch programmer snafus
305  */
306 #if (1 << HAMMER2_IND_RADIX) != HAMMER2_IND_COUNT
307 #error "hammer2 indirect radix is incorrect"
308 #endif
309 #if (HAMMER2_IND_COUNT * 64) != HAMMER2_PBUFSIZE
310 #error "hammer2 indirect entries is incorrect"
311 #endif
312 #if (1 << HAMMER2_SET_RADIX) != HAMMER2_SET_COUNT
313 #error "hammer2 direct radix is incorrect"
314 #endif
315 #if (1 << HAMMER2_PBUFRADIX) != HAMMER2_PBUFSIZE
316 #error "HAMMER2_PBUFRADIX and HAMMER2_PBUFSIZE are inconsistent"
317 #endif
318 #if (1 << HAMMER2_MIN_RADIX) != HAMMER2_MIN_ALLOC
319 #error "HAMMER2_MIN_RADIX and HAMMER2_MIN_ALLOC are inconsistent"
320 #endif
321
322 /*
323  * The media indirect block structure.
324  */
325 struct hammer2_indblock_data {
326         hammer2_blockref_t blockref[HAMMER2_IND_COUNT];
327 };
328
329 typedef struct hammer2_indblock_data hammer2_indblock_data_t;
330
331 /*
332  * In HAMMER2 inodes ARE directory entries, with a special exception for
333  * hardlinks.  The inode number is stored in the inode rather than being
334  * based on the location of the inode (since the location moves every time
335  * the inode or anything underneath the inode is modified).
336  *
337  * The inode is 1024 bytes, made up of 256 bytes of meta-data, 256 bytes
338  * for the filename, and 512 bytes worth of direct file data OR an embedded
339  * blockset.
340  *
341  * Directories represent one inode per blockref.  Inodes are not laid out
342  * as a file but instead are represented by the related blockrefs.  The
343  * blockrefs, in turn, are indexed by the 64-bit directory hash key.  Remember
344  * that blocksets are fully associative, so a certain degree efficiency is
345  * achieved just from that.
346  *
347  * Up to 512 bytes of direct data can be embedded in an inode, and since
348  * inodes are essentially directory entries this also means that small data
349  * files end up simply being laid out linearly in the directory, resulting
350  * in fewer seeks and highly optimal access.
351  *
352  * The compression mode can be changed at any time in the inode and is
353  * recorded on a blockref-by-blockref basis.
354  *
355  * Hardlinks are supported via the inode map.  Essentially the way a hardlink
356  * works is that all individual directory entries representing the same file
357  * are special cased and specify the same inode number.  The actual file
358  * is placed in the nearest parent directory that is parent to all instances
359  * of the hardlink.  If all hardlinks to a file are in the same directory
360  * the actual file will also be placed in that directory.  This file uses
361  * the inode number as the directory entry key and is invisible to normal
362  * directory scans.  Real directory entry keys are differentiated from the
363  * inode number key via bit 63.  Access to the hardlink silently looks up
364  * the real file and forwards all operations to that file.  Removal of the
365  * last hardlink also removes the real file.
366  */
367 #define HAMMER2_INODE_BYTES             1024    /* (asserted by code) */
368 #define HAMMER2_INODE_MAXNAME           256     /* maximum name in bytes */
369 #define HAMMER2_INODE_VERSION_ONE       1
370
371 struct hammer2_inode_data {
372         uint16_t        version;        /* 0000 inode data version */
373         uint16_t        reserved02;     /* 0002 */
374         uint32_t        uflags;         /* 0004 chflags */
375         uint32_t        rmajor;         /* 0008 available for device nodes */
376         uint32_t        rminor;         /* 000C available for device nodes */
377         uint64_t        ctime;          /* 0010 inode change time */
378         uint64_t        mtime;          /* 0018 modified time */
379         uint64_t        atime;          /* 0020 access time (unsupported) */
380         uint64_t        btime;          /* 0028 birth time */
381         uuid_t          uid;            /* 0030 uid / degenerate unix uid */
382         uuid_t          gid;            /* 0040 gid / degenerate unix gid */
383
384         uint8_t         type;           /* 0050 object type */
385         uint8_t         op_flags;       /* 0051 operational flags */
386         uint16_t        cap_flags;      /* 0052 capability flags */
387         uint32_t        mode;           /* 0054 unix modes (typ low 16 bits) */
388
389         hammer2_tid_t   inum;           /* 0058 inode number */
390         hammer2_off_t   size;           /* 0060 size of file */
391         uint64_t        nlinks;         /* 0068 hard links (typ only dirs) */
392         hammer2_tid_t   iparent;        /* 0070 parent inum (recovery only) */
393         uint64_t        reserved78;     /* 0078 */
394
395         hammer2_off_t   data_quota;     /* 0080 subtree quota in bytes */
396         hammer2_off_t   data_count;     /* 0088 subtree byte count */
397         hammer2_off_t   inode_quota;    /* 0090 subtree quota inode count */
398         hammer2_off_t   inode_count;    /* 0098 subtree inode count */
399         uint16_t        name_len;       /* 00A0 filename length */
400         uint8_t         comp_algo;      /* 00A2 compression request & algo */
401         uint8_t         reservedA3;     /* 00A3 */
402         uint32_t        reservedA4;     /* 00A4 */
403         hammer2_key_t   name_key;       /* 00A8 full filename key */
404         uint8_t         copyids[8];     /* 00B0 request copies to (up to 8) */
405         uuid_t          pfsid;          /* 00B8 pfs uuid if PFSROOT */
406         uint64_t        pfsinum;        /* 00C8 pfs inum allocator */
407         uint64_t        reservedD0;     /* 00D0 */
408         uint64_t        reservedD8;     /* 00D8 */
409         uint64_t        reservedE0;     /* 00E0 */
410         uint64_t        reservedE8;     /* 00E8 */
411         uint64_t        reservedF0;     /* 00F0 */
412         uint64_t        reservedF8;     /* 00F8 */
413
414         unsigned char   filename[HAMMER2_INODE_MAXNAME];
415                                         /* 0100-01FF (256 char, unterminated) */
416         union {                         /* 0200-03FF (64x8 = 512 bytes) */
417                 struct hammer2_blockset blockset;
418                 char data[HAMMER2_EMBEDDED_BYTES];
419         } u;
420 };
421
422 typedef struct hammer2_inode_data hammer2_inode_data_t;
423
424 #define HAMMER2_OPFLAG_DIRECTDATA       0x01
425 #define HAMMER2_OPFLAG_PFSROOT          0x02
426
427 #define HAMMER2_OBJTYPE_UNKNOWN         0
428 #define HAMMER2_OBJTYPE_DIRECTORY       1
429 #define HAMMER2_OBJTYPE_REGFILE         2
430 #define HAMMER2_OBJTYPE_FIFO            4
431 #define HAMMER2_OBJTYPE_CDEV            5
432 #define HAMMER2_OBJTYPE_BDEV            6
433 #define HAMMER2_OBJTYPE_SOFTLINK        7
434 #define HAMMER2_OBJTYPE_HARDLINK        8
435 #define HAMMER2_OBJTYPE_SOCKET          9
436 #define HAMMER2_OBJTYPE_WHITEOUT        10
437
438 #define HAMMER2_COPYID_NONE             0
439 #define HAMMER2_COPYID_LOCAL            ((uint8_t)-1)
440
441 #define HAMMER2_COMP_NONE               0
442 #define HAMMER2_COMP_AUTOZERO           1
443
444 #define HAMMER2_CHECK_NONE              0
445 #define HAMMER2_CHECK_ICRC              1
446
447 /*
448  * The allocref structure represents the allocation table.  One 64K block
449  * is broken down into 4096 x 16 byte entries.  Each indirect block chops
450  * 11 bits off the 64-bit storage space, with leaf entries representing
451  * 64KB blocks.  So:  (12, 12, 12, 12, 16) = 64 bit storage space.
452  *
453  * Each 64K freemap block breaks the 4096 entries into a 64x64 tree with
454  * big_hint1 representing the top level every 64th entry and big_hint2
455  * representing the lower level in each entry.  These fields specify the
456  * largest contiguous radix (1-63) available for allocation in the related
457  * sub-tree.  The largest contiguous radix available for the entire block
458  * is saved in the parent (for the root this will be alloc_blockref in the
459  * volume header).  The hints may be larger than actual and will be corrected
460  * on the fly but must not be smaller.  The allocator uses the hints to
461  * very quickly locate nearby blocks of the desired size.
462  *
463  * In indirect blocks the 64-bit free[_or_mask] field stores the total free
464  * space for each of the 4096 sub-nodes in bytes.  The total free space
465  * represented by the indirect block is stored in its parent.
466  *
467  * Each leaf element represents a 64K block.  A bitmap replaces the free space
468  * count, giving us a 1KB allocation resolution.  A micro-allocation append
469  * offset replaces the icrc field.  The micro-allocation feature is not
470  * currently implemented and the field will be set to 65536.
471  *
472  * The allocation map uses reserved blocks so no data block reference is
473  * required, only a bit in the flags field to specify which of two possible
474  * reserved blocks to use.  This allows the allocation map to be flushed to
475  * disk with minimal synchronization.
476  */
477 struct hammer2_allocref {
478         uint32_t        icrc_or_app;    /* node: icrc, leaf: append offset */
479         uint16_t        flags;
480         uint8_t         big_hint1;      /* upper level hint */
481         uint8_t         big_hint2;      /* lower level hint */
482         uint64_t        free_or_mask;   /* node: free bytes, leaf: bitmask */
483 };
484
485 typedef struct hammer2_allocref hammer2_allocref_t;
486
487 /*
488  * WARNING - allocref size x entries must equate to the hammer buffer size,
489  *           and 12 bits per recursion is assumed by the allocator.
490  *
491  * ALTA-D       Since no data_offset is specified flags are needed to select
492  *              which sub-block to recurse down into for root & internal nodes.
493  *              (only ALTA and ALTB is currently supported).
494  *
495  * LEAF         Terminal entry, always set for leafs.  May be used to support
496  *              4MB extent allocations and early termination in the future.
497  *              (not required to shortcut allocation scans as the big_hint1/2
498  *              fields are used for this).
499  */
500 #define HAMMER2_ALLOCREF_BYTES          16      /* structure size */
501 #define HAMMER2_ALLOCREF_ENTRIES        4096    /* entries */
502 #define HAMMER2_ALLOCREF_RADIX          12      /* log2(entries) */
503
504 #if (HAMMER2_ALLOCREF_BYTES * HAMMER2_ALLOCREF_ENTRIES) != HAMMER2_PBUFSIZE
505 #error "allocref parameters do not fit in hammer buffer"
506 #endif
507 #if (1 << HAMMER2_ALLOCREF_RADIX) != HAMMER2_ALLOCREF_ENTRIES
508 #error "allocref parameters are inconsistent"
509 #endif
510
511 #define HAMMER2_ALLOCREF_ALTMASK        0x0003  /* select block for recurse */
512 #define HAMMER2_ALLOCREF_ALTA           0x0000
513 #define HAMMER2_ALLOCREF_ALTB           0x0001
514 #define HAMMER2_ALLOCREF_ALTC           0x0002  /* unsupported */
515 #define HAMMER2_ALLOCREF_ALTD           0x0003  /* unsupported */
516 #define HAMMER2_ALLOCREF_LEAF           0x0004
517
518 /*
519  * Copies information stored in the volume header.  Typically formatted
520  * e.g. like 'serno/A21343249.s1d'
521  *
522  * There are 8 copy_data[]'s in the volume header but up to 256 copyid's.
523  * When a copy is removed its copyid remains reserved in the copyid bitmap
524  * (copyexists[] bitmap in volume_data) until the copy references have
525  * been removed from the entire filesystem and cannot be reused until the
526  * removal is complete.  However, new copy entries with other ids can be
527  * instantly added, replacing the original copy_data[]... which is fine as
528  * long as the copyid does not conflict.
529  *
530  * This structure must be exactly 64 bytes long.
531  */
532 struct hammer2_copy_data {
533         uint8_t copyid;         /* 0-255 */
534         uint8_t flags;
535         uint8_t reserved02;
536         uint8_t reserved03;
537         uint8_t path[60];       /* up to 59-char string, nul-terminated */
538 };
539
540 typedef struct hammer2_copy_data hammer2_copy_data_t;
541
542 #define COPYDATAF_OUTOFSYNC     0x0001
543
544 /*
545  * The volume header eats a 64K block.  There is currently an issue where
546  * we want to try to fit all nominal filesystem updates in a 512-byte section
547  * but it may be a lost cause due to the need for a blockset.
548  *
549  * All information is stored in host byte order.  The volume header's magic
550  * number may be checked to determine the byte order.  If you wish to mount
551  * between machines w/ different endian modes you'll need filesystem code
552  * which acts on the media data consistently (either all one way or all the
553  * other).  Our code currently does not do that.
554  *
555  * A read-write mount may have to recover missing allocations by doing an
556  * incremental mirror scan looking for modifications made after alloc_tid.
557  * If alloc_tid == last_tid then no recovery operation is needed.  Recovery
558  * operations are usually very, very fast.
559  *
560  * Read-only mounts do not need to do any recovery, access to the filesystem
561  * topology is always consistent after a crash (is always consistent, period).
562  * However, there may be shortcutted blockref updates present from deep in
563  * the tree which are stored in the volumeh eader and must be tracked on
564  * the fly.
565  *
566  * COPIES: Multiple copies may be specified on the mount line AND/OR you
567  *         just specify one and the mount code tries to pick up the others
568  *         from copyinfo[].  The copyid field in the volume header along
569  *         with the fsid validates the copies.
570  *
571  * NOTE: root_blockref points to the super-root directory, not the root
572  *       directory.  The root directory will be a subdirectory under the
573  *       super-root.
574  *
575  *       The super-root directory contains all root directories and all
576  *       snapshots (readonly or writable).  It is possible to do a
577  *       null-mount of the super-root using special path constructions
578  *       relative to your mounted root.
579  *
580  * NOTE: HAMMER2 allows any subdirectory tree to be managed as if it were
581  *       a PFS, including mirroring and storage quota operations, and this is
582  *       prefered over creating discrete PFSs in the super-root.  Instead
583  *       the super-root is most typically used to create writable snapshots,
584  *       alternative roots, and so forth.  The super-root is also used by
585  *       the automatic snapshotting mechanism.
586  */
587 #define HAMMER2_VOLUME_ID_HBO   0x48414d3205172011LLU
588 #define HAMMER2_VOLUME_ID_ABO   0x11201705324d4148LLU
589
590 struct hammer2_volume_data {
591         /*
592          * 512-byte sector #0
593          */
594         uint64_t        magic;                  /* 0000 Signature */
595         hammer2_off_t   boot_beg;               /* 0008 Boot area (future) */
596         hammer2_off_t   boot_end;               /* 0010 (size = end - beg) */
597         hammer2_off_t   redo_beg;               /* 0018 Redo area (future) */
598         hammer2_off_t   redo_end;               /* 0020 (size = end - beg) */
599         hammer2_off_t   volu_size;              /* 0028 Volume size, bytes */
600
601         uint32_t        version;                /* 0030 */
602         uint32_t        flags;                  /* 0034 */
603         uint8_t         copyid;                 /* 0038 copyid of phys vol */
604         uint8_t         freemap_version;        /* 0039 freemap algorithm */
605         uint8_t         reserved003A;           /* 003A */
606         uint8_t         reserved003B;           /* 003B */
607         uint32_t        reserved003C;           /* 003C */
608
609         uuid_t          fsid;                   /* 0040 */
610         uuid_t          fstype;                 /* 0050 */
611
612         /*
613          * allocator_size is precalculated at newfs time and does not include
614          * reserved blocks, boot, or redo areas.
615          *
616          * Initial non-reserved-area allocations do not use the allocation
617          * map but instead adjust alloc_iterator.  Dynamic allocations take
618          * over starting at (allocator_beg).  This makes newfs_hammer2's
619          * job a lot easier and can also serve as a testing jig.
620          */
621         hammer2_off_t   allocator_size;         /* 0060 Total data space */
622         hammer2_off_t   allocator_free;         /* 0068 Free space */
623         hammer2_tid_t   allocator_beg;          /* 0070 Initial allocations */
624         hammer2_tid_t   last_tid;               /* 0078 Last transaction id */
625         hammer2_tid_t   alloc_tid;              /* 0080 Alloctable modify tid */
626         hammer2_blockref_t alloc_blockref;      /* 0088-00C7 */
627
628         /*
629          * Copyids are allocated dynamically from the copyexists bitmap.
630          * An id from the active copies set (up to 8, see copyinfo later on)
631          * may still exist after the copy set has been removed from the
632          * volume header and its bit will remain active in the bitmap and
633          * cannot be reused until it is 100% removed from the hierarchy.
634          */
635         uint32_t        copyexists[8];          /* 00C8-00E7 copy exists bmap */
636         char            reserved0140[248];      /* 00E8-01DF */
637
638         /*
639          * 32 bit CRC array at the end of the first 512 byte sector.
640          *
641          * icrc_sects[7] - First 512-4 bytes of volume header (including all
642          *                 the other icrc's except the last one).
643          *
644          * icrc_sects[6] - Second 512-4 bytes of volume header, which is
645          *                 the blockset for the root.
646          */
647         hammer2_crc32_t icrc_sects[8];          /* 01E0-01FF */
648
649         /*
650          * 512-byte sector #1
651          *
652          * The entire sector is used by a blockset.
653          */
654         hammer2_blockset_t sroot_blockset;      /* 0200 Superroot directory */
655
656         /*
657          * 512-byte sector #2-33
658          *
659          * Up to 256 copyinfo specifications can be configured.  Note that
660          * any given subdirectory tree can only use 8 of the 256.  Having
661          * up to 256 configurable in the volume header allows
662          *
663          * A specification takes 64 bytes.  Each specification typically
664          * configures a device path such as 'serno/<serial>.s1d'.
665          */
666         struct hammer2_copy_data copyinfo[256]; /* 0400-43FF copyinfo config */
667
668         /*
669          * Remaining sections are reserved for future use.
670          */
671         char            reserved0400[0xBBFC];   /* 4400-FFFB reserved */
672
673         /*
674          * icrc on entire volume header
675          */
676         hammer2_crc32_t icrc_volheader;         /* FFFC-FFFF full volume icrc*/
677 };
678
679 typedef struct hammer2_volume_data hammer2_volume_data_t;
680
681 /*
682  * Various parts of the volume header have their own iCRCs.
683  *
684  * The first 512 bytes has its own iCRC stored at the end of the 512 bytes
685  * and not included the icrc calculation.
686  *
687  * The second 512 bytes also has its own iCRC but it is stored in the first
688  * 512 bytes so it covers the entire second 512 bytes.
689  *
690  * The whole volume block (64KB) has an iCRC covering all but the last 4 bytes,
691  * which is where the iCRC for the whole volume is stored.  This is currently
692  * a catch-all for anything not individually iCRCd.
693  */
694 #define HAMMER2_VOL_ICRC_SECT0          7
695 #define HAMMER2_VOL_ICRC_SECT1          6
696
697 #define HAMMER2_VOLUME_BYTES            65536
698
699 #define HAMMER2_VOLUME_ICRC0_OFF        0
700 #define HAMMER2_VOLUME_ICRC1_OFF        512
701 #define HAMMER2_VOLUME_ICRCVH_OFF       0
702
703 #define HAMMER2_VOLUME_ICRC0_SIZE       (512 - 4)
704 #define HAMMER2_VOLUME_ICRC1_SIZE       (512)
705 #define HAMMER2_VOLUME_ICRCVH_SIZE      (65536 - 4)
706
707 #define HAMMER2_VOL_VERSION_MIN         1
708 #define HAMMER2_VOL_VERSION_DEFAULT     1
709 #define HAMMER2_VOL_VERSION_WIP         2
710
711 #define HAMMER2_NUM_VOLHDRS             4
712
713 union hammer2_media_data {
714         hammer2_inode_data_t    ipdata;
715         hammer2_indblock_data_t npdata;
716         char                    buf[HAMMER2_PBUFSIZE];
717 };
718
719 typedef union hammer2_media_data hammer2_media_data_t;
720
721 /*
722  * Prototypes for user & kernel functions.  Kernel-only prototypes are
723  * elsewhere.
724  */
725 uint32_t hammer2_icrc32(const void *buf, size_t size);
726 uint32_t hammer2_icrc32c(const void *buf, size_t size, uint32_t crc);
727
728 #endif