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