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#define F2FS_INLINE_DATA 0x02
157
158#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
159 F2FS_INLINE_XATTR_ADDRS - 1))
160
161#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) \
162 - sizeof(__le32) * (DEF_ADDRS_PER_INODE + 5 - 1))
163
164struct f2fs_inode {
165 __le16 i_mode;
166 __u8 i_advise;
167 __u8 i_inline;
168 __le32 i_uid;
169 __le32 i_gid;
170 __le32 i_links;
171 __le64 i_size;
172 __le64 i_blocks;
173 __le64 i_atime;
174 __le64 i_ctime;
175 __le64 i_mtime;
176 __le32 i_atime_nsec;
177 __le32 i_ctime_nsec;
178 __le32 i_mtime_nsec;
179 __le32 i_generation;
180 __le32 i_current_depth;
181 __le32 i_xattr_nid;
182 __le32 i_flags;
183 __le32 i_pino;
184 __le32 i_namelen;
185 __u8 i_name[F2FS_NAME_LEN];
186 __u8 i_reserved2;
187
188 struct f2fs_extent i_ext;
189
190 __le32 i_addr[DEF_ADDRS_PER_INODE];
191
192 __le32 i_nid[5];
193
194} __packed;
195
196struct direct_node {
197 __le32 addr[ADDRS_PER_BLOCK];
198} __packed;
199
200struct indirect_node {
201 __le32 nid[NIDS_PER_BLOCK];
202} __packed;
203
204enum {
205 COLD_BIT_SHIFT = 0,
206 FSYNC_BIT_SHIFT,
207 DENT_BIT_SHIFT,
208 OFFSET_BIT_SHIFT
209};
210
211struct node_footer {
212 __le32 nid;
213 __le32 ino;
214 __le32 flag;
215 __le64 cp_ver;
216 __le32 next_blkaddr;
217} __packed;
218
219struct f2fs_node {
220
221 union {
222 struct f2fs_inode i;
223 struct direct_node dn;
224 struct indirect_node in;
225 };
226 struct node_footer footer;
227} __packed;
228
229
230
231
232#define NAT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_nat_entry))
233
234struct f2fs_nat_entry {
235 __u8 version;
236 __le32 ino;
237 __le32 block_addr;
238} __packed;
239
240struct f2fs_nat_block {
241 struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK];
242} __packed;
243
244
245
246
247
248
249
250
251#define SIT_VBLOCK_MAP_SIZE 64
252#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry))
253
254
255
256
257
258
259#define SIT_VBLOCKS_SHIFT 10
260#define SIT_VBLOCKS_MASK ((1 << SIT_VBLOCKS_SHIFT) - 1)
261#define GET_SIT_VBLOCKS(raw_sit) \
262 (le16_to_cpu((raw_sit)->vblocks) & SIT_VBLOCKS_MASK)
263#define GET_SIT_TYPE(raw_sit) \
264 ((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \
265 >> SIT_VBLOCKS_SHIFT)
266
267struct f2fs_sit_entry {
268 __le16 vblocks;
269 __u8 valid_map[SIT_VBLOCK_MAP_SIZE];
270 __le64 mtime;
271} __packed;
272
273struct f2fs_sit_block {
274 struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK];
275} __packed;
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292#define ENTRIES_IN_SUM 512
293#define SUMMARY_SIZE (7)
294#define SUM_FOOTER_SIZE (5)
295#define SUM_ENTRY_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM)
296
297
298struct f2fs_summary {
299 __le32 nid;
300 union {
301 __u8 reserved[3];
302 struct {
303 __u8 version;
304 __le16 ofs_in_node;
305 } __packed;
306 };
307} __packed;
308
309
310#define SUM_TYPE_NODE (1)
311#define SUM_TYPE_DATA (0)
312
313struct summary_footer {
314 unsigned char entry_type;
315 __u32 check_sum;
316} __packed;
317
318#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\
319 SUM_ENTRY_SIZE)
320#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
321 sizeof(struct nat_journal_entry))
322#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
323 sizeof(struct nat_journal_entry))
324#define SIT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
325 sizeof(struct sit_journal_entry))
326#define SIT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
327 sizeof(struct sit_journal_entry))
328
329
330
331
332enum {
333 NAT_JOURNAL = 0,
334 SIT_JOURNAL
335};
336
337struct nat_journal_entry {
338 __le32 nid;
339 struct f2fs_nat_entry ne;
340} __packed;
341
342struct nat_journal {
343 struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES];
344 __u8 reserved[NAT_JOURNAL_RESERVED];
345} __packed;
346
347struct sit_journal_entry {
348 __le32 segno;
349 struct f2fs_sit_entry se;
350} __packed;
351
352struct sit_journal {
353 struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES];
354 __u8 reserved[SIT_JOURNAL_RESERVED];
355} __packed;
356
357
358struct f2fs_summary_block {
359 struct f2fs_summary entries[ENTRIES_IN_SUM];
360 union {
361 __le16 n_nats;
362 __le16 n_sits;
363 };
364
365 union {
366 struct nat_journal nat_j;
367 struct sit_journal sit_j;
368 };
369 struct summary_footer footer;
370} __packed;
371
372
373
374
375#define F2FS_DOT_HASH 0
376#define F2FS_DDOT_HASH F2FS_DOT_HASH
377#define F2FS_MAX_HASH (~((0x3ULL) << 62))
378#define F2FS_HASH_COL_BIT ((0x1ULL) << 63)
379
380typedef __le32 f2fs_hash_t;
381
382
383#define F2FS_SLOT_LEN 8
384#define F2FS_SLOT_LEN_BITS 3
385
386#define GET_DENTRY_SLOTS(x) ((x + F2FS_SLOT_LEN - 1) >> F2FS_SLOT_LEN_BITS)
387
388
389#define NR_DENTRY_IN_BLOCK 214
390
391
392#define MAX_DIR_HASH_DEPTH 63
393
394#define SIZE_OF_DIR_ENTRY 11
395#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \
396 BITS_PER_BYTE)
397#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \
398 F2FS_SLOT_LEN) * \
399 NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
400
401
402struct f2fs_dir_entry {
403 __le32 hash_code;
404 __le32 ino;
405 __le16 name_len;
406 __u8 file_type;
407} __packed;
408
409
410struct f2fs_dentry_block {
411
412 __u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP];
413 __u8 reserved[SIZE_OF_RESERVED];
414 struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK];
415 __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
416} __packed;
417
418
419enum {
420 F2FS_FT_UNKNOWN,
421 F2FS_FT_REG_FILE,
422 F2FS_FT_DIR,
423 F2FS_FT_CHRDEV,
424 F2FS_FT_BLKDEV,
425 F2FS_FT_FIFO,
426 F2FS_FT_SOCK,
427 F2FS_FT_SYMLINK,
428 F2FS_FT_MAX
429};
430
431#endif
432