nilfs_fs.h revision 1.2 1 1.2 reinoud /* $NetBSD: nilfs_fs.h,v 1.2 2010/06/24 10:20:08 reinoud Exp $ */
2 1.1 reinoud
3 1.1 reinoud /*
4 1.1 reinoud * Copyright (c) 2008, 2009 Reinoud Zandijk
5 1.1 reinoud * All rights reserved.
6 1.1 reinoud *
7 1.1 reinoud * Redistribution and use in source and binary forms, with or without
8 1.1 reinoud * modification, are permitted provided that the following conditions
9 1.1 reinoud * are met:
10 1.1 reinoud * 1. Redistributions of source code must retain the above copyright
11 1.1 reinoud * notice, this list of conditions and the following disclaimer.
12 1.1 reinoud * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 reinoud * notice, this list of conditions and the following disclaimer in the
14 1.1 reinoud * documentation and/or other materials provided with the distribution.
15 1.1 reinoud *
16 1.1 reinoud * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1 reinoud * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 reinoud * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1 reinoud * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 reinoud * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 1.1 reinoud * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 1.1 reinoud * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 1.1 reinoud * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 1.1 reinoud * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 1.1 reinoud * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 1.1 reinoud *
27 1.1 reinoud * NilFS on disc structures
28 1.1 reinoud *
29 1.1 reinoud * Original definitions written by Koji Sato <koji (at) osrg.net>
30 1.1 reinoud * and Ryusuke Konishi <ryusuke (at) osrg.net>
31 1.1 reinoud */
32 1.1 reinoud
33 1.1 reinoud #ifndef _NILFS_FS_H
34 1.1 reinoud #define _NILFS_FS_H
35 1.1 reinoud
36 1.1 reinoud /*
37 1.1 reinoud * NiLFS stores ext2fs compatible flags in its Inode. NetBSD uses a comparable
38 1.1 reinoud * mechanism with file flags to be mutated with chflags(2).
39 1.1 reinoud *
40 1.1 reinoud * For completion, i mention all ext2-fs flags currently stored in NiLFS
41 1.1 reinoud * inodes.
42 1.1 reinoud */
43 1.1 reinoud #define NILFS_SECRM_FL 0x00000001 /* no mapping; delete securely */
44 1.1 reinoud #define NILFS_UNRM_FL 0x00000002 /* no mapping; allow undelete */
45 1.1 reinoud #define NILFS_SYNC_FL 0x00000008 /* no mapping; sychrone update */
46 1.1 reinoud #define NILFS_IMMUTABLE_FL 0x00000010 /* SF_IMMUTABLE | UF_IMMUTABLE */
47 1.1 reinoud #define NILFS_APPEND_FL 0x00000020 /* SF_APPEND | UF_APPEND */
48 1.1 reinoud #define NILFS_NODUMP_FL 0x00000040 /* UF_NODUMP */
49 1.1 reinoud #define NILFS_NOATIME_FL 0x00000080 /* no mapping; no atime update */
50 1.1 reinoud /* intermediate bits are reserved for compression settings */
51 1.1 reinoud #define NILFS_NOTAIL_FL 0x00008000 /* no mapping; dont merge tail */
52 1.1 reinoud #define NILFS_DIRSYNC_FL 0x00010000 /* no mapping; dirsync */
53 1.1 reinoud
54 1.1 reinoud #define NILFS_FL_USER_VISIBLE 0x0003DFFF /* flags visible to user */
55 1.1 reinoud #define NILFS_FL_USER_MODIFIABLE 0x000380FF /* flags modifiable by user */
56 1.1 reinoud
57 1.1 reinoud
58 1.1 reinoud
59 1.1 reinoud /*
60 1.1 reinoud * NiLFS stores files in hierarchical B-trees in tupels of (dkey, dptr).
61 1.1 reinoud * Entries in a level N btree point to a btree of level N-1. As dkey value the
62 1.1 reinoud * first block number to be found in the level N-1 btree is taken.
63 1.1 reinoud *
64 1.1 reinoud * To conserve disk space and to reduce an extra lookup, small B-tree's of
65 1.1 reinoud * level 0 consisting of only the first [0..NILFS_DIRECT_KEY_MAX> entries are
66 1.1 reinoud * stored directly into the inode without dkey. Otherwise the entries point to
67 1.1 reinoud * the B-tree's of level N-1.
68 1.1 reinoud *
69 1.1 reinoud * In all B-trees, but of the system DAT-file, the dptr values are virtual
70 1.1 reinoud * block numbers. The dptr values in the B-tree of the system DAT-file are
71 1.1 reinoud * physical block numbers since the DAT performs virtual to physical block
72 1.1 reinoud * mapping.
73 1.1 reinoud */
74 1.1 reinoud
75 1.1 reinoud #define NILFS_INODE_BMAP_SIZE 7
76 1.1 reinoud
77 1.1 reinoud #define NILFS_BMAP_SIZE (NILFS_INODE_BMAP_SIZE * sizeof(uint64_t))
78 1.1 reinoud #define NILFS_BMAP_INVALID_PTR 0
79 1.1 reinoud
80 1.1 reinoud #define NILFS_DIRECT_NBLOCKS (NILFS_BMAP_SIZE / sizeof(uint64_t) - 1)
81 1.1 reinoud #define NILFS_DIRECT_KEY_MIN 0
82 1.1 reinoud #define NILFS_DIRECT_KEY_MAX (NILFS_DIRECT_NBLOCKS - 1)
83 1.1 reinoud
84 1.1 reinoud #define NILFS_BMAP_SMALL_LOW NILFS_DIRECT_KEY_MIN
85 1.1 reinoud #define NILFS_BMAP_SMALL_HIGH NILFS_DIRECT_KEY_MAX
86 1.1 reinoud #define NILFS_BMAP_LARGE_LOW NILFS_BTREE_ROOT_NCHILDREN_MAX
87 1.1 reinoud #define NILFS_BMAP_LARGE_HIGH NILFS_BTREE_KEY_MAX
88 1.1 reinoud
89 1.1 reinoud
90 1.1 reinoud /*
91 1.1 reinoud * B-tree header found on all btree blocks and in the direct-entry. Its size
92 1.1 reinoud * should be 64 bits. In a direct entry, it is followed by 64 bits block
93 1.1 reinoud * numbers for the translation of block [0..NILFS_DIRECT_KEY_MAX>. In large
94 1.1 reinoud * bmaps its followed by pairs of 64 bit dkey and 64 bit dptr.
95 1.1 reinoud */
96 1.1 reinoud
97 1.1 reinoud struct nilfs_btree_node {
98 1.1 reinoud uint8_t bn_flags; /* btree flags */
99 1.1 reinoud uint8_t bn_level; /* level of btree */
100 1.1 reinoud uint16_t bn_nchildren; /* number of children in this record */
101 1.1 reinoud uint32_t bn_pad; /* pad to 64 bits */
102 1.1 reinoud };
103 1.1 reinoud
104 1.1 reinoud
105 1.1 reinoud /* btree flags stored in nilfs_btree_node->bn_flags */
106 1.1 reinoud #define NILFS_BTREE_NODE_ROOT 0x01
107 1.1 reinoud #define NILFS_BMAP_LARGE 0x01 /* equivalent to BTREE_NODE_ROOT */
108 1.1 reinoud
109 1.1 reinoud /* btree levels stored in nilfs_btree_node->bn_level */
110 1.1 reinoud #define NILFS_BTREE_LEVEL_DATA 0
111 1.1 reinoud #define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
112 1.1 reinoud #define NILFS_BTREE_LEVEL_MAX 14
113 1.1 reinoud
114 1.1 reinoud /*
115 1.1 reinoud * Calculate number of entries that fit into the `direct' space
116 1.1 reinoud */
117 1.1 reinoud #define NILFS_BTREE_ROOT_SIZE NILFS_BMAP_SIZE
118 1.1 reinoud #define NILFS_BTREE_ROOT_NCHILDREN_MAX \
119 1.1 reinoud ((NILFS_BTREE_ROOT_SIZE - sizeof(struct nilfs_btree_node)) / \
120 1.1 reinoud (sizeof(uint64_t /* dkey */) + sizeof(uint64_t /* dptr */)))
121 1.1 reinoud #define NILFS_BTREE_ROOT_NCHILDREN_MIN 0
122 1.1 reinoud
123 1.1 reinoud /*
124 1.1 reinoud * Calculate number of entries that fit into a non LEVEL_DATA nodes. Each of
125 1.1 reinoud * those nodes are padded with one extra 64 bit (extension?)
126 1.1 reinoud */
127 1.1 reinoud #define NILFS_BTREE_NODE_EXTRA_PAD_SIZE (sizeof(uint64_t))
128 1.1 reinoud #define NILFS_BTREE_NODE_NCHILDREN_MAX(nodesize) \
129 1.1 reinoud (((nodesize) - sizeof(struct nilfs_btree_node) - \
130 1.1 reinoud NILFS_BTREE_NODE_EXTRA_PAD_SIZE) / \
131 1.1 reinoud (sizeof(uint64_t /* dkey */) + sizeof(uint64_t /* dptr */)))
132 1.1 reinoud #define NILFS_BTREE_NODE_NCHILDREN_MIN(nodesize) \
133 1.1 reinoud ((NILFS_BTREE_NODE_NCHILDREN_MAX(nodesize) - 1) / 2 + 1)
134 1.1 reinoud #define NILFS_BTREE_KEY_MIN ( (uint64_t) 0)
135 1.1 reinoud #define NILFS_BTREE_KEY_MAX (~(uint64_t) 0)
136 1.1 reinoud
137 1.1 reinoud
138 1.1 reinoud /*
139 1.1 reinoud * NiLFS inode structure. There are a few dedicated inode numbers that are
140 1.1 reinoud * defined here first.
141 1.1 reinoud */
142 1.1 reinoud
143 1.1 reinoud #define NILFS_ROOT_INO 2 /* Root file inode */
144 1.1 reinoud #define NILFS_DAT_INO 3 /* DAT file */
145 1.1 reinoud #define NILFS_CPFILE_INO 4 /* checkpoint file */
146 1.1 reinoud #define NILFS_SUFILE_INO 5 /* segment usage file */
147 1.1 reinoud #define NILFS_IFILE_INO 6 /* ifile */
148 1.1 reinoud #define NILFS_ATIME_INO 7 /* Atime file (reserved) */
149 1.1 reinoud #define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */
150 1.1 reinoud #define NILFS_SKETCH_INO 10 /* Sketch file (obsolete) */
151 1.1 reinoud #define NILFS_USER_INO 11 /* First user's file inode number */
152 1.1 reinoud
153 1.1 reinoud struct nilfs_inode {
154 1.1 reinoud uint64_t i_blocks; /* size in device blocks */
155 1.1 reinoud uint64_t i_size; /* size in bytes */
156 1.1 reinoud uint64_t i_ctime; /* creation time in seconds part */
157 1.1 reinoud uint64_t i_mtime; /* modification time in seconds part */
158 1.1 reinoud uint32_t i_ctime_nsec; /* creation time nanoseconds part */
159 1.1 reinoud uint32_t i_mtime_nsec; /* modification time in nanoseconds */
160 1.1 reinoud uint32_t i_uid; /* user id */
161 1.1 reinoud uint32_t i_gid; /* group id */
162 1.1 reinoud uint16_t i_mode; /* file mode */
163 1.1 reinoud uint16_t i_links_count; /* number of references to the inode */
164 1.1 reinoud uint32_t i_flags; /* NILFS_*_FL flags */
165 1.1 reinoud uint64_t i_bmap[NILFS_INODE_BMAP_SIZE]; /* btree direct/large */
166 1.1 reinoud #define i_device_code i_bmap[0] /* 64 bits composed of major+minor */
167 1.1 reinoud uint64_t i_xattr; /* reserved for extended attributes */
168 1.1 reinoud uint32_t i_generation; /* file generation for NFS */
169 1.1 reinoud uint32_t i_pad; /* make it 64 bits aligned */
170 1.1 reinoud };
171 1.1 reinoud
172 1.1 reinoud
173 1.1 reinoud /*
174 1.1 reinoud * In NiLFS each checkpoint/snapshot has a super root.
175 1.1 reinoud *
176 1.1 reinoud * The super root holds the inodes of the three system files: `dat', `cp' and
177 1.1 reinoud * 'su' files. All other FS state is defined by those.
178 1.1 reinoud *
179 1.1 reinoud * It is crc checksum'ed and time stamped.
180 1.1 reinoud */
181 1.1 reinoud
182 1.1 reinoud struct nilfs_super_root {
183 1.1 reinoud uint32_t sr_sum; /* check-sum */
184 1.1 reinoud uint16_t sr_bytes; /* byte count of this structure */
185 1.1 reinoud uint16_t sr_flags; /* reserved for flags */
186 1.1 reinoud uint64_t sr_nongc_ctime; /* timestamp, not for cleaner(?) */
187 1.1 reinoud struct nilfs_inode sr_dat; /* DAT, virt->phys translation inode */
188 1.1 reinoud struct nilfs_inode sr_cpfile; /* CP, checkpoints inode */
189 1.1 reinoud struct nilfs_inode sr_sufile; /* SU, segment usage inode */
190 1.1 reinoud };
191 1.1 reinoud
192 1.1 reinoud #define NILFS_SR_MDT_OFFSET(inode_size, i) \
193 1.1 reinoud ((uint32_t)&((struct nilfs_super_root *)0)->sr_dat + \
194 1.1 reinoud (inode_size) * (i))
195 1.1 reinoud #define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0)
196 1.1 reinoud #define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1)
197 1.1 reinoud #define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2)
198 1.1 reinoud #define NILFS_SR_BYTES (sizeof(struct nilfs_super_root))
199 1.1 reinoud
200 1.1 reinoud
201 1.1 reinoud
202 1.1 reinoud /*
203 1.1 reinoud * NiLFS has a superblock that describes the basic structure and mount
204 1.1 reinoud * history. It also records some sizes of structures found on the disc for
205 1.1 reinoud * sanity checks.
206 1.1 reinoud *
207 1.1 reinoud * The superblock is stored at two places: NILFS_SB_OFFSET_BYTES and
208 1.1 reinoud * NILFS_SB2_OFFSET_BYTES.
209 1.1 reinoud */
210 1.1 reinoud
211 1.1 reinoud #define NILFS_DFL_MAX_MNT_COUNT 50 /* default 50 mounts before fsck */
212 1.1 reinoud #define NILFS_EIO_RETRY_COUNT 4 /* then give up, not used yet */
213 1.1 reinoud
214 1.1 reinoud /* File system states stored on disc in superblock's sbp->s_state */
215 1.1 reinoud #define NILFS_VALID_FS 0x0001 /* cleanly unmounted and all is ok */
216 1.1 reinoud #define NILFS_ERROR_FS 0x0002 /* there were errors detected, fsck */
217 1.1 reinoud #define NILFS_RESIZE_FS 0x0004 /* resize required, XXX unknown flag*/
218 1.1 reinoud #define NILFS_MOUNT_STATE_BITS "\20\1VALID_FS\2ERROR_FS\3RESIZE_FS"
219 1.1 reinoud
220 1.1 reinoud /* Mount option flags passed in Linux; Not used but here for reference */
221 1.1 reinoud #define NILFS_MOUNT_ERROR_MODE 0x0070 /* error mode mask */
222 1.1 reinoud #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* continue on errors */
223 1.1 reinoud #define NILFS_MOUNT_ERRORS_RO 0x0020 /* remount fs ro on errors */
224 1.1 reinoud #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* panic on errors */
225 1.1 reinoud #define NILFS_MOUNT_SNAPSHOT 0x0080 /* snapshot flag */
226 1.1 reinoud #define NILFS_MOUNT_BARRIER 0x1000 /* use block barriers XXX what is this? */
227 1.1 reinoud #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* apply strict in-order; */
228 1.1 reinoud /* semantics also for data */
229 1.1 reinoud
230 1.1 reinoud struct nilfs_super_block {
231 1.1 reinoud uint32_t s_rev_level; /* major disk format revision */
232 1.1 reinoud uint16_t s_minor_rev_level; /* minor disc format revision */
233 1.1 reinoud uint16_t s_magic; /* magic value for identification */
234 1.1 reinoud
235 1.1 reinoud uint16_t s_bytes; /* byte count of CRC calculation
236 1.1 reinoud for this structure. s_reserved
237 1.1 reinoud is excluded! */
238 1.1 reinoud uint16_t s_flags; /* linux mount flags, XXX can they
239 1.1 reinoud be ignored? */
240 1.1 reinoud uint32_t s_crc_seed; /* seed value of CRC calculation */
241 1.1 reinoud uint32_t s_sum; /* check sum of super block */
242 1.1 reinoud
243 1.1 reinoud /* Block size represented as follows
244 1.1 reinoud blocksize = 1 << (s_log_block_size + 10) */
245 1.1 reinoud uint32_t s_log_block_size;
246 1.1 reinoud uint64_t s_nsegments; /* number of segm. in filesystem */
247 1.1 reinoud uint64_t s_dev_size; /* block device size in bytes */
248 1.1 reinoud uint64_t s_first_data_block; /* 1st seg disk block number */
249 1.1 reinoud uint32_t s_blocks_per_segment; /* number of blocks per segment */
250 1.1 reinoud uint32_t s_r_segments_percentage; /* reserved segments percentage */
251 1.1 reinoud
252 1.1 reinoud uint64_t s_last_cno; /* last checkpoint number */
253 1.1 reinoud uint64_t s_last_pseg; /* addr part. segm. written last */
254 1.1 reinoud uint64_t s_last_seq; /* seq.number of seg written last */
255 1.1 reinoud uint64_t s_free_blocks_count; /* free blocks count */
256 1.1 reinoud
257 1.1 reinoud uint64_t s_ctime; /* creation time (execution time
258 1.1 reinoud of newfs) */
259 1.1 reinoud uint64_t s_mtime; /* mount time */
260 1.1 reinoud uint64_t s_wtime; /* write time */
261 1.1 reinoud uint16_t s_mnt_count; /* mount count */
262 1.1 reinoud uint16_t s_max_mnt_count; /* maximal mount count */
263 1.1 reinoud uint16_t s_state; /* file system state */
264 1.1 reinoud uint16_t s_errors; /* behaviour on detecting errors */
265 1.1 reinoud uint64_t s_lastcheck; /* time of last checked */
266 1.1 reinoud
267 1.1 reinoud uint32_t s_checkinterval; /* max. time between checks */
268 1.1 reinoud uint32_t s_creator_os; /* OS that created it */
269 1.1 reinoud uint16_t s_def_resuid; /* default uid for reserv. blocks */
270 1.1 reinoud uint16_t s_def_resgid; /* default gid for reserv. blocks */
271 1.1 reinoud uint32_t s_first_ino; /* first non-reserved inode */
272 1.1 reinoud
273 1.1 reinoud uint16_t s_inode_size; /* size of an inode */
274 1.1 reinoud uint16_t s_dat_entry_size; /* size of a dat entry */
275 1.1 reinoud uint16_t s_checkpoint_size; /* size of a checkpoint */
276 1.1 reinoud uint16_t s_segment_usage_size; /* size of a segment usage */
277 1.1 reinoud
278 1.1 reinoud uint8_t s_uuid[16]; /* 128-bit uuid for volume */
279 1.2 reinoud char s_volume_name[80]; /* volume name */
280 1.1 reinoud
281 1.1 reinoud uint32_t s_c_interval; /* commit interval of segment */
282 1.1 reinoud uint32_t s_c_block_max; /* threshold of data amount for
283 1.1 reinoud the segment construction */
284 1.1 reinoud uint32_t s_reserved[192]; /* padding to end of the block */
285 1.1 reinoud };
286 1.1 reinoud
287 1.1 reinoud #define NILFS_SUPER_MAGIC 0x3434 /* NILFS filesystem magic number */
288 1.1 reinoud #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */
289 1.1 reinoud #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)
290 1.1 reinoud
291 1.1 reinoud
292 1.1 reinoud /* codes for operating systems in superblock */
293 1.1 reinoud #define NILFS_OS_LINUX 0
294 1.1 reinoud #define NILFS_OS_UNK1 1 /* ext2 */
295 1.1 reinoud #define NILFS_OS_UNK2 2 /* ext2 */
296 1.1 reinoud #define NILFS_OS_UNK3 3 /* ext2 */
297 1.1 reinoud #define NILFS_OS_NETBSD 10 /* temp */
298 1.1 reinoud
299 1.1 reinoud /* NiLFS revision levels */
300 1.1 reinoud #define NILFS_CURRENT_REV 2 /* current major revision */
301 1.1 reinoud #define NILFS_MINOR_REV 0 /* minor revision */
302 1.1 reinoud
303 1.1 reinoud /* Bytes count of super_block for CRC-calculation */
304 1.1 reinoud #define NILFS_SB_BYTES \
305 1.1 reinoud ((uint32_t)&((struct nilfs_super_block *)0)->s_reserved)
306 1.1 reinoud
307 1.1 reinoud /* Maximal count of links to a file */
308 1.1 reinoud #define NILFS_LINK_MAX 32000
309 1.1 reinoud
310 1.1 reinoud
311 1.1 reinoud /*
312 1.1 reinoud * Structure of a directory entry, same as ext2.
313 1.1 reinoud *
314 1.1 reinoud * The `file_type' is chosen there since filenames are limited to 256 bytes
315 1.1 reinoud * and the name_len in ext2 is a two byter.
316 1.1 reinoud *
317 1.1 reinoud * Note that they can't span blocks; the rec_len fills out.
318 1.1 reinoud */
319 1.1 reinoud
320 1.1 reinoud #define NILFS_NAME_LEN 255
321 1.1 reinoud struct nilfs_dir_entry {
322 1.1 reinoud uint64_t inode; /* inode number */
323 1.1 reinoud uint16_t rec_len; /* directory entry length */
324 1.1 reinoud uint8_t name_len; /* name length */
325 1.1 reinoud uint8_t file_type;
326 1.1 reinoud char name[NILFS_NAME_LEN]; /* file name */
327 1.1 reinoud char pad;
328 1.1 reinoud };
329 1.1 reinoud
330 1.1 reinoud /*
331 1.1 reinoud * NILFS directory file types. Only the low 3 bits are used. The
332 1.1 reinoud * other bits are reserved for now.
333 1.1 reinoud */
334 1.1 reinoud enum {
335 1.1 reinoud NILFS_FT_UNKNOWN,
336 1.1 reinoud NILFS_FT_REG_FILE,
337 1.1 reinoud NILFS_FT_DIR,
338 1.1 reinoud NILFS_FT_CHRDEV,
339 1.1 reinoud NILFS_FT_BLKDEV,
340 1.1 reinoud NILFS_FT_FIFO,
341 1.1 reinoud NILFS_FT_SOCK,
342 1.1 reinoud NILFS_FT_SYMLINK,
343 1.1 reinoud NILFS_FT_MAX
344 1.1 reinoud };
345 1.1 reinoud
346 1.1 reinoud /*
347 1.1 reinoud * NILFS_DIR_PAD defines the directory entries boundaries
348 1.1 reinoud *
349 1.1 reinoud * NOTE: It must be a multiple of 8
350 1.1 reinoud */
351 1.1 reinoud #define NILFS_DIR_PAD 8
352 1.1 reinoud #define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)
353 1.1 reinoud #define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \
354 1.1 reinoud ~NILFS_DIR_ROUND)
355 1.1 reinoud
356 1.1 reinoud /*
357 1.1 reinoud * NiLFS devides the disc into fixed length segments. Each segment is filled
358 1.1 reinoud * with one or more partial segments of variable lengths.
359 1.1 reinoud *
360 1.1 reinoud * Each partial segment has a segment summary header followed by updates of
361 1.1 reinoud * files and optionally a super root.
362 1.1 reinoud */
363 1.1 reinoud
364 1.1 reinoud struct nilfs_finfo {
365 1.1 reinoud uint64_t fi_ino; /* inode number */
366 1.1 reinoud uint64_t fi_cno; /* checkpoint associated with this */
367 1.1 reinoud uint32_t fi_nblocks; /* size in blocks of this finfo */
368 1.1 reinoud uint32_t fi_ndatablk; /* number of data blocks */
369 1.1 reinoud /* For the DAT file */
370 1.1 reinoud /* fi_ndatablk * nilfs_binfo.bi_dat.bi_blkoff */
371 1.1 reinoud /* fi_nblocks - fi_ndatablks * nilfs_binfo.bi_dat */
372 1.1 reinoud /* Other files */
373 1.1 reinoud /* fi_ndatablk * nilfs_binfo.bi_v */
374 1.1 reinoud /* fi_nblocks - fi_ndatablks * nilfs_binfo.bi_v.bi_vblocknr */
375 1.1 reinoud };
376 1.1 reinoud
377 1.1 reinoud
378 1.1 reinoud /*
379 1.1 reinoud * Virtual to physical block translation information. For data blocks it maps
380 1.1 reinoud * logical block number bi_blkoff to virtual block nr bi_vblocknr. For non
381 1.1 reinoud * datablocks it is the virtual block number assigned to an inserted btree
382 1.1 reinoud * level and thus has no bi_blkoff. The physical block number is the next
383 1.1 reinoud * available data block in the partial segment after all the finfo's.
384 1.1 reinoud */
385 1.1 reinoud struct nilfs_binfo_v {
386 1.1 reinoud uint64_t bi_vblocknr; /* assigned virtual block number */
387 1.1 reinoud uint64_t bi_blkoff; /* for file's logical block number */
388 1.1 reinoud };
389 1.1 reinoud
390 1.1 reinoud
391 1.1 reinoud /*
392 1.1 reinoud * DAT allocation. For data blocks just the logical block number that maps on
393 1.1 reinoud * the next available data block in the partial segment after the finfo's.
394 1.1 reinoud * Intermediate btree blocks are looked up by their blkoffset dkey and their
395 1.1 reinoud * level and given the next available data block.
396 1.1 reinoud */
397 1.1 reinoud struct nilfs_binfo_dat {
398 1.1 reinoud uint64_t bi_blkoff; /* DAT file's logical block number */
399 1.1 reinoud uint8_t bi_level; /* btree level */
400 1.1 reinoud uint8_t bi_pad[7];
401 1.1 reinoud };
402 1.1 reinoud
403 1.1 reinoud
404 1.1 reinoud /* Convenience union for both types of binfo's */
405 1.1 reinoud union nilfs_binfo {
406 1.1 reinoud struct nilfs_binfo_v bi_v;
407 1.1 reinoud struct nilfs_binfo_dat bi_dat;
408 1.1 reinoud };
409 1.1 reinoud
410 1.1 reinoud
411 1.1 reinoud /* The (partial) segment summary itself */
412 1.1 reinoud struct nilfs_segment_summary {
413 1.1 reinoud uint32_t ss_datasum; /* CRC of complete data block */
414 1.1 reinoud uint32_t ss_sumsum; /* CRC of segment summary only */
415 1.1 reinoud uint32_t ss_magic; /* magic to identify segment summary */
416 1.1 reinoud uint16_t ss_bytes; /* size of segment summary structure */
417 1.1 reinoud uint16_t ss_flags; /* NILFS_SS_* flags */
418 1.1 reinoud uint64_t ss_seq; /* sequence number of this segm. sum */
419 1.1 reinoud uint64_t ss_create; /* creation timestamp in seconds */
420 1.1 reinoud uint64_t ss_next; /* blocknumber of next segment */
421 1.1 reinoud uint32_t ss_nblocks; /* number of blocks follow */
422 1.1 reinoud uint32_t ss_nfinfo; /* number of finfo structures follow */
423 1.1 reinoud uint32_t ss_sumbytes; /* total size of segment summary */
424 1.1 reinoud uint32_t ss_pad;
425 1.2 reinoud uint64_t ss_cno; /* latest checkpoint number known */
426 1.1 reinoud /* stream of finfo structures */
427 1.1 reinoud };
428 1.1 reinoud
429 1.1 reinoud #define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */
430 1.1 reinoud
431 1.1 reinoud /* Segment summary flags */
432 1.1 reinoud #define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */
433 1.1 reinoud #define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */
434 1.1 reinoud #define NILFS_SS_SR 0x0004 /* has super root */
435 1.1 reinoud #define NILFS_SS_SYNDT 0x0008 /* includes data only updates */
436 1.1 reinoud #define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */
437 1.1 reinoud #define NILFS_SS_FLAG_BITS "\20\1LOGBGN\2LOGEND\3SR\4SYNDT\5GC"
438 1.1 reinoud
439 1.1 reinoud /* Segment summary constrains */
440 1.1 reinoud #define NILFS_SEG_MIN_BLOCKS 16 /* minimum number of blocks in a
441 1.1 reinoud full segment */
442 1.1 reinoud #define NILFS_PSEG_MIN_BLOCKS 2 /* minimum number of blocks in a
443 1.1 reinoud partial segment */
444 1.1 reinoud #define NILFS_MIN_NRSVSEGS 8 /* minimum number of reserved
445 1.1 reinoud segments */
446 1.1 reinoud
447 1.1 reinoud /*
448 1.1 reinoud * Structure of DAT/inode file.
449 1.1 reinoud *
450 1.1 reinoud * A DAT file is devided into groups. The maximum number of groups is the
451 1.1 reinoud * number of block group descriptors that fit into one block; this descriptor
452 1.1 reinoud * only gives the number of free entries in the associated group.
453 1.1 reinoud *
454 1.1 reinoud * Each group has a block sized bitmap indicating if an entry is taken or
455 1.1 reinoud * empty. Each bit stands for a DAT entry.
456 1.1 reinoud *
457 1.1 reinoud * The inode file has exactly the same format only the entries are inode
458 1.1 reinoud * entries.
459 1.1 reinoud */
460 1.1 reinoud
461 1.1 reinoud struct nilfs_block_group_desc {
462 1.1 reinoud uint32_t bg_nfrees; /* num. free entries in block group */
463 1.1 reinoud };
464 1.1 reinoud
465 1.1 reinoud
466 1.1 reinoud /* DAT entry in a super root's DAT file */
467 1.1 reinoud struct nilfs_dat_entry {
468 1.1 reinoud uint64_t de_blocknr; /* block number */
469 1.1 reinoud uint64_t de_start; /* valid from checkpoint */
470 1.1 reinoud uint64_t de_end; /* valid till checkpoint */
471 1.1 reinoud uint64_t de_rsv; /* reserved for future use */
472 1.1 reinoud };
473 1.1 reinoud
474 1.1 reinoud
475 1.1 reinoud /*
476 1.1 reinoud * Structure of CP file.
477 1.1 reinoud *
478 1.1 reinoud * A snapshot is just a checkpoint only its protected against removal by the
479 1.1 reinoud * cleaner. The snapshots are kept on a double linked list of checkpoints.
480 1.1 reinoud */
481 1.1 reinoud
482 1.1 reinoud struct nilfs_snapshot_list {
483 1.1 reinoud uint64_t ssl_next; /* checkpoint nr. forward */
484 1.1 reinoud uint64_t ssl_prev; /* checkpoint nr. back */
485 1.1 reinoud };
486 1.1 reinoud
487 1.1 reinoud
488 1.1 reinoud /* checkpoint entry structure */
489 1.1 reinoud struct nilfs_checkpoint {
490 1.1 reinoud uint32_t cp_flags; /* NILFS_CHECKPOINT_* flags */
491 1.1 reinoud uint32_t cp_checkpoints_count; /* ZERO, not used anymore? */
492 1.1 reinoud struct nilfs_snapshot_list cp_snapshot_list; /* list of snapshots */
493 1.1 reinoud uint64_t cp_cno; /* checkpoint number */
494 1.1 reinoud uint64_t cp_create; /* creation timestamp */
495 1.1 reinoud uint64_t cp_nblk_inc; /* number of blocks incremented */
496 1.1 reinoud uint64_t cp_inodes_count; /* number of inodes in this cp. */
497 1.1 reinoud uint64_t cp_blocks_count; /* reserved (might be deleted) */
498 1.1 reinoud struct nilfs_inode cp_ifile_inode; /* inode file inode */
499 1.1 reinoud };
500 1.1 reinoud
501 1.1 reinoud /* checkpoint flags */
502 1.1 reinoud #define NILFS_CHECKPOINT_SNAPSHOT 1
503 1.1 reinoud #define NILFS_CHECKPOINT_INVALID 2
504 1.1 reinoud #define NILFS_CHECKPOINT_SKETCH 4
505 1.1 reinoud #define NILFS_CHECKPOINT_MINOR 8
506 1.1 reinoud #define NILFS_CHECKPOINT_BITS "\20\1SNAPSHOT\2INVALID\3SKETCH\4MINOR"
507 1.1 reinoud
508 1.1 reinoud
509 1.1 reinoud /* header of the checkpoint file */
510 1.1 reinoud struct nilfs_cpfile_header {
511 1.1 reinoud uint64_t ch_ncheckpoints; /* number of checkpoints */
512 1.1 reinoud uint64_t ch_nsnapshots; /* number of snapshots */
513 1.1 reinoud struct nilfs_snapshot_list ch_snapshot_list; /* snapshot list */
514 1.1 reinoud };
515 1.1 reinoud
516 1.1 reinoud /* to accomodate with the header */
517 1.1 reinoud #define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
518 1.1 reinoud ((sizeof(struct nilfs_cpfile_header) + \
519 1.1 reinoud sizeof(struct nilfs_checkpoint) - 1) / \
520 1.1 reinoud sizeof(struct nilfs_checkpoint))
521 1.1 reinoud
522 1.1 reinoud
523 1.1 reinoud /*
524 1.1 reinoud * Structure of SU file.
525 1.1 reinoud *
526 1.1 reinoud * The segment usage file sums up how each of the segments are used. They are
527 1.1 reinoud * indexed by their segment number.
528 1.1 reinoud */
529 1.1 reinoud
530 1.1 reinoud /* segment usage entry */
531 1.1 reinoud struct nilfs_segment_usage {
532 1.1 reinoud uint64_t su_lastmod; /* last modified timestamp */
533 1.1 reinoud uint32_t su_nblocks; /* number of blocks in segment */
534 1.1 reinoud uint32_t su_flags; /* NILFS_SEGMENT_USAGE_* flags */
535 1.1 reinoud };
536 1.1 reinoud
537 1.1 reinoud /* segment usage flag */
538 1.1 reinoud #define NILFS_SEGMENT_USAGE_ACTIVE 1
539 1.1 reinoud #define NILFS_SEGMENT_USAGE_DIRTY 2
540 1.1 reinoud #define NILFS_SEGMENT_USAGE_ERROR 4
541 1.1 reinoud #define NILFS_SEGMENT_USAGE_BITS "\20\1ACTIVE\2DIRTY\3ERROR"
542 1.1 reinoud
543 1.1 reinoud
544 1.1 reinoud /* header of the segment usage file */
545 1.1 reinoud struct nilfs_sufile_header {
546 1.1 reinoud uint64_t sh_ncleansegs; /* number of segments marked clean */
547 1.1 reinoud uint64_t sh_ndirtysegs; /* number of segments marked dirty */
548 1.1 reinoud uint64_t sh_last_alloc; /* last allocated segment number */
549 1.1 reinoud /* ... */
550 1.1 reinoud };
551 1.1 reinoud
552 1.1 reinoud /* to accomodate with the header */
553 1.1 reinoud #define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
554 1.1 reinoud ((sizeof(struct nilfs_sufile_header) + \
555 1.1 reinoud sizeof(struct nilfs_segment_usage) - 1) / \
556 1.1 reinoud sizeof(struct nilfs_segment_usage))
557 1.1 reinoud
558 1.1 reinoud
559 1.1 reinoud #endif
560 1.1 reinoud
561