1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_F2FS_FS_H
12#define _LINUX_F2FS_FS_H
13
14#include <linux/pagemap.h>
15#include <linux/types.h>
16
17#define F2FS_SUPER_OFFSET 1024
18#define F2FS_MIN_LOG_SECTOR_SIZE 9
19#define F2FS_MAX_LOG_SECTOR_SIZE 12
20#define F2FS_LOG_SECTORS_PER_BLOCK 3
21#define F2FS_BLKSIZE 4096
22#define F2FS_BLKSIZE_BITS 12
23#define F2FS_MAX_EXTENSION 64
24#define F2FS_BLK_ALIGN(x) (((x) + F2FS_BLKSIZE - 1) / F2FS_BLKSIZE)
25
26#define NULL_ADDR ((block_t)0)
27#define NEW_ADDR ((block_t)-1)
28
29#define F2FS_BYTES_TO_BLK(bytes) ((bytes) >> F2FS_BLKSIZE_BITS)
30#define F2FS_BLK_TO_BYTES(blk) ((blk) << F2FS_BLKSIZE_BITS)
31
32
33#define F2FS_RESERVED_NODE_NUM 3
34
35#define F2FS_ROOT_INO(sbi) (sbi->root_ino_num)
36#define F2FS_NODE_INO(sbi) (sbi->node_ino_num)
37#define F2FS_META_INO(sbi) (sbi->meta_ino_num)
38
39
40#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO)
41#define GFP_F2FS_HIGH_ZERO (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM)
42
43
44
45
46
47
48
49#define MAX_ACTIVE_LOGS 16
50#define MAX_ACTIVE_NODE_LOGS 8
51#define MAX_ACTIVE_DATA_LOGS 8
52
53#define VERSION_LEN 256
54
55
56
57
58struct f2fs_super_block {
59 __le32 magic;
60 __le16 major_ver;
61 __le16 minor_ver;
62 __le32 log_sectorsize;
63 __le32 log_sectors_per_block;
64 __le32 log_blocksize;
65 __le32 log_blocks_per_seg;
66 __le32 segs_per_sec;
67 __le32 secs_per_zone;
68 __le32 checksum_offset;
69 __le64 block_count;
70 __le32 section_count;
71 __le32 segment_count;
72 __le32 segment_count_ckpt;
73 __le32 segment_count_sit;
74 __le32 segment_count_nat;
75 __le32 segment_count_ssa;
76 __le32 segment_count_main;
77 __le32 segment0_blkaddr;
78 __le32 cp_blkaddr;
79 __le32 sit_blkaddr;
80 __le32 nat_blkaddr;
81 __le32 ssa_blkaddr;
82 __le32 main_blkaddr;
83 __le32 root_ino;
84 __le32 node_ino;
85 __le32 meta_ino;
86 __u8 uuid[16];
87 __le16 volume_name[512];
88 __le32 extension_count;
89 __u8 extension_list[F2FS_MAX_EXTENSION][8];
90 __le32 cp_payload;
91 __u8 version[VERSION_LEN];
92 __u8 init_version[VERSION_LEN];
93 __le32 feature;
94 __u8 encryption_level;
95 __u8 encrypt_pw_salt[16];
96 __u8 reserved[871];
97} __packed;
98
99
100
101
102#define CP_FASTBOOT_FLAG 0x00000020
103#define CP_FSCK_FLAG 0x00000010
104#define CP_ERROR_FLAG 0x00000008
105#define CP_COMPACT_SUM_FLAG 0x00000004
106#define CP_ORPHAN_PRESENT_FLAG 0x00000002
107#define CP_UMOUNT_FLAG 0x00000001
108
109#define F2FS_CP_PACKS 2
110
111struct f2fs_checkpoint {
112 __le64 checkpoint_ver;
113 __le64 user_block_count;
114 __le64 valid_block_count;
115 __le32 rsvd_segment_count;
116 __le32 overprov_segment_count;
117 __le32 free_segment_count;
118
119
120 __le32 cur_node_segno[MAX_ACTIVE_NODE_LOGS];
121 __le16 cur_node_blkoff[MAX_ACTIVE_NODE_LOGS];
122
123 __le32 cur_data_segno[MAX_ACTIVE_DATA_LOGS];
124 __le16 cur_data_blkoff[MAX_ACTIVE_DATA_LOGS];
125 __le32 ckpt_flags;
126 __le32 cp_pack_total_block_count;
127 __le32 cp_pack_start_sum;
128 __le32 valid_node_count;
129 __le32 valid_inode_count;
130 __le32 next_free_nid;
131 __le32 sit_ver_bitmap_bytesize;
132 __le32 nat_ver_bitmap_bytesize;
133 __le32 checksum_offset;
134 __le64 elapsed_time;
135
136 unsigned char alloc_type[MAX_ACTIVE_LOGS];
137
138
139 unsigned char sit_nat_version_bitmap[1];
140} __packed;
141
142
143
144
145#define F2FS_ORPHANS_PER_BLOCK 1020
146
147#define GET_ORPHAN_BLOCKS(n) ((n + F2FS_ORPHANS_PER_BLOCK - 1) / \
148 F2FS_ORPHANS_PER_BLOCK)
149
150struct f2fs_orphan_block {
151 __le32 ino[F2FS_ORPHANS_PER_BLOCK];
152 __le32 reserved;
153 __le16 blk_addr;
154 __le16 blk_count;
155 __le32 entry_count;
156 __le32 check_sum;
157} __packed;
158
159
160
161
162struct f2fs_extent {
163 __le32 fofs;
164 __le32 blk;
165 __le32 len;
166} __packed;
167
168#define F2FS_NAME_LEN 255
169#define F2FS_INLINE_XATTR_ADDRS 50
170#define DEF_ADDRS_PER_INODE 923
171#define DEF_NIDS_PER_INODE 5
172#define ADDRS_PER_INODE(fi) addrs_per_inode(fi)
173#define ADDRS_PER_BLOCK 1018
174#define NIDS_PER_BLOCK 1018
175
176#define ADDRS_PER_PAGE(page, fi) \
177 (IS_INODE(page) ? ADDRS_PER_INODE(fi) : ADDRS_PER_BLOCK)
178
179#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1)
180#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2)
181#define NODE_IND1_BLOCK (DEF_ADDRS_PER_INODE + 3)
182#define NODE_IND2_BLOCK (DEF_ADDRS_PER_INODE + 4)
183#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5)
184
185#define F2FS_INLINE_XATTR 0x01
186#define F2FS_INLINE_DATA 0x02
187#define F2FS_INLINE_DENTRY 0x04
188#define F2FS_DATA_EXIST 0x08
189#define F2FS_INLINE_DOTS 0x10
190
191#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
192 F2FS_INLINE_XATTR_ADDRS - 1))
193
194struct f2fs_inode {
195 __le16 i_mode;
196 __u8 i_advise;
197 __u8 i_inline;
198 __le32 i_uid;
199 __le32 i_gid;
200 __le32 i_links;
201 __le64 i_size;
202 __le64 i_blocks;
203 __le64 i_atime;
204 __le64 i_ctime;
205 __le64 i_mtime;
206 __le32 i_atime_nsec;
207 __le32 i_ctime_nsec;
208 __le32 i_mtime_nsec;
209 __le32 i_generation;
210 __le32 i_current_depth;
211 __le32 i_xattr_nid;
212 __le32 i_flags;
213 __le32 i_pino;
214 __le32 i_namelen;
215 __u8 i_name[F2FS_NAME_LEN];
216 __u8 i_dir_level;
217
218 struct f2fs_extent i_ext;
219
220 __le32 i_addr[DEF_ADDRS_PER_INODE];
221
222 __le32 i_nid[DEF_NIDS_PER_INODE];
223
224} __packed;
225
226struct direct_node {
227 __le32 addr[ADDRS_PER_BLOCK];
228} __packed;
229
230struct indirect_node {
231 __le32 nid[NIDS_PER_BLOCK];
232} __packed;
233
234enum {
235 COLD_BIT_SHIFT = 0,
236 FSYNC_BIT_SHIFT,
237 DENT_BIT_SHIFT,
238 OFFSET_BIT_SHIFT
239};
240
241#define OFFSET_BIT_MASK (0x07)
242
243struct node_footer {
244 __le32 nid;
245 __le32 ino;
246 __le32 flag;
247 __le64 cp_ver;
248 __le32 next_blkaddr;
249} __packed;
250
251struct f2fs_node {
252
253 union {
254 struct f2fs_inode i;
255 struct direct_node dn;
256 struct indirect_node in;
257 };
258 struct node_footer footer;
259} __packed;
260
261
262
263
264#define NAT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_nat_entry))
265
266struct f2fs_nat_entry {
267 __u8 version;
268 __le32 ino;
269 __le32 block_addr;
270} __packed;
271
272struct f2fs_nat_block {
273 struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK];
274} __packed;
275
276
277
278
279
280
281
282
283#define SIT_VBLOCK_MAP_SIZE 64
284#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry))
285
286
287
288
289
290
291#define SIT_VBLOCKS_SHIFT 10
292#define SIT_VBLOCKS_MASK ((1 << SIT_VBLOCKS_SHIFT) - 1)
293#define GET_SIT_VBLOCKS(raw_sit) \
294 (le16_to_cpu((raw_sit)->vblocks) & SIT_VBLOCKS_MASK)
295#define GET_SIT_TYPE(raw_sit) \
296 ((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \
297 >> SIT_VBLOCKS_SHIFT)
298
299struct f2fs_sit_entry {
300 __le16 vblocks;
301 __u8 valid_map[SIT_VBLOCK_MAP_SIZE];
302 __le64 mtime;
303} __packed;
304
305struct f2fs_sit_block {
306 struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK];
307} __packed;
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324#define ENTRIES_IN_SUM 512
325#define SUMMARY_SIZE (7)
326#define SUM_FOOTER_SIZE (5)
327#define SUM_ENTRY_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM)
328
329
330struct f2fs_summary {
331 __le32 nid;
332 union {
333 __u8 reserved[3];
334 struct {
335 __u8 version;
336 __le16 ofs_in_node;
337 } __packed;
338 };
339} __packed;
340
341
342#define SUM_TYPE_NODE (1)
343#define SUM_TYPE_DATA (0)
344
345struct summary_footer {
346 unsigned char entry_type;
347 __u32 check_sum;
348} __packed;
349
350#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\
351 SUM_ENTRY_SIZE)
352#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
353 sizeof(struct nat_journal_entry))
354#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
355 sizeof(struct nat_journal_entry))
356#define SIT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
357 sizeof(struct sit_journal_entry))
358#define SIT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
359 sizeof(struct sit_journal_entry))
360
361
362
363
364enum {
365 NAT_JOURNAL = 0,
366 SIT_JOURNAL
367};
368
369struct nat_journal_entry {
370 __le32 nid;
371 struct f2fs_nat_entry ne;
372} __packed;
373
374struct nat_journal {
375 struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES];
376 __u8 reserved[NAT_JOURNAL_RESERVED];
377} __packed;
378
379struct sit_journal_entry {
380 __le32 segno;
381 struct f2fs_sit_entry se;
382} __packed;
383
384struct sit_journal {
385 struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES];
386 __u8 reserved[SIT_JOURNAL_RESERVED];
387} __packed;
388
389
390struct f2fs_summary_block {
391 struct f2fs_summary entries[ENTRIES_IN_SUM];
392 union {
393 __le16 n_nats;
394 __le16 n_sits;
395 };
396
397 union {
398 struct nat_journal nat_j;
399 struct sit_journal sit_j;
400 };
401 struct summary_footer footer;
402} __packed;
403
404
405
406
407#define F2FS_DOT_HASH 0
408#define F2FS_DDOT_HASH F2FS_DOT_HASH
409#define F2FS_MAX_HASH (~((0x3ULL) << 62))
410#define F2FS_HASH_COL_BIT ((0x1ULL) << 63)
411
412typedef __le32 f2fs_hash_t;
413
414
415#define F2FS_SLOT_LEN 8
416#define F2FS_SLOT_LEN_BITS 3
417
418#define GET_DENTRY_SLOTS(x) ((x + F2FS_SLOT_LEN - 1) >> F2FS_SLOT_LEN_BITS)
419
420
421#define MAX_DIR_HASH_DEPTH 63
422
423
424#define MAX_DIR_BUCKETS (1 << ((MAX_DIR_HASH_DEPTH / 2) - 1))
425
426
427
428
429
430
431
432
433
434
435
436
437
438#define NR_DENTRY_IN_BLOCK 214
439#define SIZE_OF_DIR_ENTRY 11
440#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \
441 BITS_PER_BYTE)
442#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \
443 F2FS_SLOT_LEN) * \
444 NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
445
446
447struct f2fs_dir_entry {
448 __le32 hash_code;
449 __le32 ino;
450 __le16 name_len;
451 __u8 file_type;
452} __packed;
453
454
455struct f2fs_dentry_block {
456
457 __u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP];
458 __u8 reserved[SIZE_OF_RESERVED];
459 struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK];
460 __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
461} __packed;
462
463
464#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \
465 ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
466 BITS_PER_BYTE + 1))
467#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + \
468 BITS_PER_BYTE - 1) / BITS_PER_BYTE)
469#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \
470 ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
471 NR_INLINE_DENTRY + INLINE_DENTRY_BITMAP_SIZE))
472
473
474struct f2fs_inline_dentry {
475 __u8 dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE];
476 __u8 reserved[INLINE_RESERVED_SIZE];
477 struct f2fs_dir_entry dentry[NR_INLINE_DENTRY];
478 __u8 filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN];
479} __packed;
480
481
482enum {
483 F2FS_FT_UNKNOWN,
484 F2FS_FT_REG_FILE,
485 F2FS_FT_DIR,
486 F2FS_FT_CHRDEV,
487 F2FS_FT_BLKDEV,
488 F2FS_FT_FIFO,
489 F2FS_FT_SOCK,
490 F2FS_FT_SYMLINK,
491 F2FS_FT_MAX
492};
493
494#endif
495