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