Android-cuttlefish cvd tool
f2fs.h
Go to the documentation of this file.
1
11#ifndef _F2FS_H_
12#define _F2FS_H_
13
14#include <stdlib.h>
15#include <unistd.h>
16#include <stdio.h>
17#include <stdbool.h>
18#include <stddef.h>
19#include <errno.h>
20#include <fcntl.h>
21#include <string.h>
22#include <errno.h>
23#include <f2fs_fs.h>
24
25#ifdef HAVE_MNTENT_H
26#include <mntent.h>
27#endif
28#ifdef HAVE_MACH_TIME_H
29#include <mach/mach_time.h>
30#endif
31#include <sys/stat.h>
32#ifdef HAVE_SYS_IOCTL_H
33#include <sys/ioctl.h>
34#endif
35#ifdef HAVE_SYS_MOUNT_H
36#include <sys/mount.h>
37#endif
38#include <assert.h>
39
40#define EXIT_ERR_CODE (-1)
41#define ver_after(a, b) (typecheck(unsigned long long, a) && \
42 typecheck(unsigned long long, b) && \
43 ((long long)((a) - (b)) > 0))
44
45#define container_of(ptr, type, member) ({ \
46 const typeof(((type *)0)->member) * __mptr = (ptr); \
47 (type *)((char *)__mptr - offsetof(type, member)); })
48
49struct list_head {
50 struct list_head *next, *prev;
51};
52
53static inline void __list_add(struct list_head *new,
54 struct list_head *prev,
55 struct list_head *next)
56{
57 next->prev = new;
58 new->next = next;
59 new->prev = prev;
60 prev->next = new;
61}
62
63static inline void __list_del(struct list_head * prev, struct list_head * next)
64{
65 next->prev = prev;
66 prev->next = next;
67}
68
69static inline void list_del(struct list_head *entry)
70{
71 __list_del(entry->prev, entry->next);
72}
73
74static inline void list_add_tail(struct list_head *new, struct list_head *head)
75{
76 __list_add(new, head->prev, head);
77}
78
79#define LIST_HEAD_INIT(name) { &(name), &(name) }
80
81#define list_entry(ptr, type, member) \
82 container_of(ptr, type, member)
83
84#define list_first_entry(ptr, type, member) \
85 list_entry((ptr)->next, type, member)
86
87#define list_next_entry(pos, member) \
88 list_entry((pos)->member.next, typeof(*(pos)), member)
89
90#define list_for_each_entry(pos, head, member) \
91 for (pos = list_first_entry(head, typeof(*pos), member); \
92 &pos->member != (head); \
93 pos = list_next_entry(pos, member))
94
95#define list_for_each_entry_safe(pos, n, head, member) \
96 for (pos = list_first_entry(head, typeof(*pos), member), \
97 n = list_next_entry(pos, member); \
98 &pos->member != (head); \
99 pos = n, n = list_next_entry(n, member))
100
101/*
102 * indicate meta/data type
103 */
104enum {
112};
113
114#define MAX_RA_BLOCKS 64
115
116enum {
120
121struct node_info {
125 unsigned char version;
126};
127
134
135 unsigned int nat_cnt;
136 unsigned int fcnt;
137
141};
142
143struct seg_entry {
144 unsigned short valid_blocks; /* # of valid blocks */
145 unsigned short ckpt_valid_blocks; /* # of valid blocks last cp, for recovered data/node */
146 unsigned char *cur_valid_map; /* validity bitmap of blocks */
147 unsigned char *ckpt_valid_map; /* validity bitmap of blocks last cp, for recovered data/node */
148 unsigned char type; /* segment type like CURSEG_XXX_TYPE */
149 unsigned char orig_type; /* segment type like CURSEG_XXX_TYPE */
150 unsigned char ckpt_type; /* segment type like CURSEG_XXX_TYPE , for recovered data/node */
151 unsigned long long mtime; /* modification time of the segment */
152 int dirty;
153};
154
155struct sec_entry {
156 unsigned int valid_blocks; /* # of valid blocks in a section */
157};
158
159struct sit_info {
160
161 block_t sit_base_addr; /* start block address of SIT area */
162 block_t sit_blocks; /* # of blocks used by SIT area */
163 block_t written_valid_blocks; /* # of valid blocks in main area */
164 unsigned char *bitmap; /* all bitmaps pointer */
165 char *sit_bitmap; /* SIT bitmap pointer */
166 unsigned int bitmap_size; /* SIT bitmap size */
167
168 unsigned long *dirty_sentries_bitmap; /* bitmap for dirty sentries */
169 unsigned int dirty_sentries; /* # of dirty sentries */
170 unsigned int sents_per_block; /* # of SIT entries per block */
171 struct seg_entry *sentries; /* SIT segment-level cache */
172 struct sec_entry *sec_entries; /* SIT section-level cache */
173
174 unsigned long long elapsed_time; /* elapsed time after mount */
175 unsigned long long mounted_time; /* mount time */
176 unsigned long long min_mtime; /* min. modification time */
177 unsigned long long max_mtime; /* max. modification time */
178};
179
181 struct f2fs_summary_block *sum_blk; /* cached summary block */
182 unsigned char alloc_type; /* current allocation type */
183 unsigned int segno; /* current segment number */
184 unsigned short next_blkoff; /* next block offset to write */
185 unsigned int zone; /* current zone number */
186 unsigned int next_segno; /* preallocated segment */
187};
188
193
197
198 unsigned int segment_count;
199 unsigned int main_segments;
200 unsigned int reserved_segments;
201 unsigned int ovp_segments;
202 unsigned int free_segments;
203};
204
206 struct inode *inode;
210 int max;
212};
213
214struct dentry {
215 char *path;
217 const u8 *name;
218 int len;
219 char *link;
220 unsigned long size;
227 char *secon;
228 uint64_t capabilities;
232};
233
234/* different from dnode_of_data in kernel */
236 struct f2fs_node *inode_blk; /* inode page */
237 struct f2fs_node *node_blk; /* cached direct node page */
239 unsigned int ofs_in_node;
243};
244
249};
250
253
259
260 /* basic file system units */
261 unsigned int log_sectors_per_block; /* log2 sectors per block */
262 unsigned int log_blocksize; /* log2 block size */
263 unsigned int blocksize; /* block size */
264 unsigned int root_ino_num; /* root inode number*/
265 unsigned int node_ino_num; /* node inode number*/
266 unsigned int meta_ino_num; /* meta inode number*/
267 unsigned int log_blocks_per_seg; /* log2 blocks per segment */
268 unsigned int blocks_per_seg; /* blocks per segment */
269 unsigned int segs_per_sec; /* segments per section */
270 unsigned int secs_per_zone; /* sections per zone */
271 unsigned int total_sections; /* total section count */
272 unsigned int total_node_count; /* total node block count */
273 unsigned int total_valid_node_count; /* valid node block count */
274 unsigned int total_valid_inode_count; /* valid inode count */
275 int active_logs; /* # of active logs */
276
277 block_t user_block_count; /* # of user blocks */
278 block_t total_valid_block_count; /* # of valid blocks */
279 block_t alloc_valid_block_count; /* # of allocated blocks */
280 block_t last_valid_block_count; /* for recovery */
281 u32 s_next_generation; /* for NFS support */
282
283 unsigned int cur_victim_sec; /* current victim section num */
285
286 int cp_backuped; /* backup valid checkpoint */
287
288 /* true if late_build_segment_manger() is called */
290
291 /* keep track of hardlinks so we can recreate them */
293};
294
295static inline struct f2fs_super_block *F2FS_RAW_SUPER(struct f2fs_sb_info *sbi)
296{
297 return (struct f2fs_super_block *)(sbi->raw_super);
298}
299
300static inline struct f2fs_checkpoint *F2FS_CKPT(struct f2fs_sb_info *sbi)
301{
302 return (struct f2fs_checkpoint *)(sbi->ckpt);
303}
304
305static inline struct f2fs_fsck *F2FS_FSCK(struct f2fs_sb_info *sbi)
306{
307 return (struct f2fs_fsck *)(sbi->fsck);
308}
309
310static inline struct f2fs_nm_info *NM_I(struct f2fs_sb_info *sbi)
311{
312 return (struct f2fs_nm_info *)(sbi->nm_info);
313}
314
315static inline struct f2fs_sm_info *SM_I(struct f2fs_sb_info *sbi)
316{
317 return (struct f2fs_sm_info *)(sbi->sm_info);
318}
319
320static inline struct sit_info *SIT_I(struct f2fs_sb_info *sbi)
321{
322 return (struct sit_info *)(SM_I(sbi)->sit_info);
323}
324
325static inline void *inline_data_addr(struct f2fs_node *node_blk)
326{
327 int ofs = get_extra_isize(node_blk) + DEF_INLINE_RESERVED_SIZE;
328
329 return (void *)&(node_blk->i.i_addr[ofs]);
330}
331
332static inline unsigned int ofs_of_node(struct f2fs_node *node_blk)
333{
334 unsigned flag = le32_to_cpu(F2FS_NODE_FOOTER(node_blk)->flag);
335 return flag >> OFFSET_BIT_SHIFT;
336}
337
338static inline unsigned long long cur_cp_version(struct f2fs_checkpoint *cp)
339{
341}
342
343static inline __u64 cur_cp_crc(struct f2fs_checkpoint *cp)
344{
345 size_t crc_offset = le32_to_cpu(cp->checksum_offset);
346 return le32_to_cpu(*((__le32 *)((unsigned char *)cp + crc_offset)));
347}
348
349static inline bool is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f)
350{
351 unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags);
352 return ckpt_flags & f ? 1 : 0;
353}
354
355static inline unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag)
356{
357 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
358
359 /* return NAT or SIT bitmap */
360 if (flag == NAT_BITMAP)
362 else if (flag == SIT_BITMAP)
364
365 return 0;
366}
367
368static inline block_t __cp_payload(struct f2fs_sb_info *sbi)
369{
371}
372
373static inline void *__bitmap_ptr(struct f2fs_sb_info *sbi, int flag)
374{
375 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
376 int offset;
377
379 unsigned int chksum_size = 0;
380
381 offset = (flag == SIT_BITMAP) ?
383
384 if (le32_to_cpu(ckpt->checksum_offset) ==
386 chksum_size = sizeof(__le32);
387
388 return &ckpt->sit_nat_version_bitmap[offset + chksum_size];
389 }
390
391 if (le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload) > 0) {
392 if (flag == NAT_BITMAP)
393 return &ckpt->sit_nat_version_bitmap;
394 else
395 return ((char *)ckpt + F2FS_BLKSIZE);
396 } else {
397 offset = (flag == NAT_BITMAP) ?
399 return &ckpt->sit_nat_version_bitmap[offset];
400 }
401}
402
403static inline block_t __start_cp_addr(struct f2fs_sb_info *sbi)
404{
405 block_t start_addr = le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_blkaddr);
406
407 if (sbi->cur_cp == 2)
408 start_addr += sbi->blocks_per_seg;
409 return start_addr;
410}
411
412static inline block_t __start_sum_addr(struct f2fs_sb_info *sbi)
413{
415}
416
417static inline block_t __end_block_addr(struct f2fs_sb_info *sbi)
418{
419 return SM_I(sbi)->main_blkaddr +
421 sbi->log_blocks_per_seg);
422}
423
424#define BLKS_PER_SEC(sbi) \
425 ((sbi)->segs_per_sec * (sbi)->blocks_per_seg)
426#define GET_ZONENO_FROM_SEGNO(sbi, segno) \
427 ((segno / sbi->segs_per_sec) / sbi->secs_per_zone)
428
429#define IS_DATASEG(t) \
430 ((t == CURSEG_HOT_DATA) || (t == CURSEG_COLD_DATA) || \
431 (t == CURSEG_WARM_DATA))
432
433#define IS_NODESEG(t) \
434 ((t == CURSEG_HOT_NODE) || (t == CURSEG_COLD_NODE) || \
435 (t == CURSEG_WARM_NODE))
436
437#define MAIN_BLKADDR(sbi) \
438 (SM_I(sbi) ? SM_I(sbi)->main_blkaddr : \
439 le32_to_cpu(F2FS_RAW_SUPER(sbi)->main_blkaddr))
440#define SEG0_BLKADDR(sbi) \
441 (SM_I(sbi) ? SM_I(sbi)->seg0_blkaddr : \
442 le32_to_cpu(F2FS_RAW_SUPER(sbi)->segment0_blkaddr))
443
444#define GET_SUM_BLKADDR(sbi, segno) \
445 ((sbi->sm_info->ssa_blkaddr) + segno)
446
447#define GET_SEGOFF_FROM_SEG0(sbi, blk_addr) \
448 ((blk_addr) - SM_I(sbi)->seg0_blkaddr)
449
450#define GET_SEGNO_FROM_SEG0(sbi, blk_addr) \
451 (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) >> sbi->log_blocks_per_seg)
452
453#define GET_BLKOFF_FROM_SEG0(sbi, blk_addr) \
454 (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) & (sbi->blocks_per_seg - 1))
455
456#define GET_SEC_FROM_SEG(sbi, segno) \
457 ((segno) / (sbi)->segs_per_sec)
458#define GET_SEG_FROM_SEC(sbi, secno) \
459 ((secno) * (sbi)->segs_per_sec)
460
461#define FREE_I_START_SEGNO(sbi) \
462 GET_SEGNO_FROM_SEG0(sbi, SM_I(sbi)->main_blkaddr)
463#define GET_R2L_SEGNO(sbi, segno) (segno + FREE_I_START_SEGNO(sbi))
464
465#define MAIN_SEGS(sbi) (SM_I(sbi)->main_segments)
466#define TOTAL_SEGS(sbi) (SM_I(sbi)->segment_count)
467#define TOTAL_BLKS(sbi) (TOTAL_SEGS(sbi) << (sbi)->log_blocks_per_seg)
468#define MAX_BLKADDR(sbi) (SEG0_BLKADDR(sbi) + TOTAL_BLKS(sbi))
469
470#define START_BLOCK(sbi, segno) (SM_I(sbi)->main_blkaddr + \
471 ((segno) << sbi->log_blocks_per_seg))
472
473#define NEXT_FREE_BLKADDR(sbi, curseg) \
474 (START_BLOCK(sbi, (curseg)->segno) + (curseg)->next_blkoff)
475
476#define SIT_BLK_CNT(sbi) \
477 ((MAIN_SEGS(sbi) + SIT_ENTRY_PER_BLOCK - 1) / SIT_ENTRY_PER_BLOCK)
478
479static inline struct curseg_info *CURSEG_I(struct f2fs_sb_info *sbi, int type)
480{
481 return (struct curseg_info *)(SM_I(sbi)->curseg_array + type);
482}
483
484static inline block_t start_sum_block(struct f2fs_sb_info *sbi)
485{
486 return __start_cp_addr(sbi) + le32_to_cpu(F2FS_CKPT(sbi)->cp_pack_start_sum);
487}
488
489static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
490{
491 return __start_cp_addr(sbi) + le32_to_cpu(F2FS_CKPT(sbi)->cp_pack_total_block_count)
492 - (base + 1) + type;
493}
494
495/* for the list of fsync inodes, used only during recovery */
497 struct list_head list; /* list head */
498 nid_t ino; /* inode number */
499 block_t blkaddr; /* block address locating the last fsync */
500 block_t last_dentry; /* block address locating the last dentry */
501};
502
503#define nats_in_cursum(jnl) (le16_to_cpu(jnl->n_nats))
504#define sits_in_cursum(jnl) (le16_to_cpu(jnl->n_sits))
505
506#define nat_in_journal(jnl, i) (jnl->nat_j.entries[i].ne)
507#define nid_in_journal(jnl, i) (jnl->nat_j.entries[i].nid)
508#define sit_in_journal(jnl, i) (jnl->sit_j.entries[i].se)
509#define segno_in_journal(jnl, i) (jnl->sit_j.entries[i].segno)
510
511#define SIT_ENTRY_OFFSET(sit_i, segno) \
512 ((segno) % sit_i->sents_per_block)
513#define SIT_BLOCK_OFFSET(sit_i, segno) \
514 ((segno) / SIT_ENTRY_PER_BLOCK)
515
516static inline bool IS_VALID_NID(struct f2fs_sb_info *sbi, u32 nid)
517{
518 return (nid < (NAT_ENTRY_PER_BLOCK *
520 << (sbi->log_blocks_per_seg - 1)));
521}
522
523static inline bool is_valid_data_blkaddr(block_t blkaddr)
524{
525 if (blkaddr == NEW_ADDR || blkaddr == NULL_ADDR ||
526 blkaddr == COMPRESS_ADDR)
527 return 0;
528 return 1;
529}
530
531static inline int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno)
532{
533 int i;
534
535 for (i = 0; i < NO_CHECK_TYPE; i++) {
536 struct curseg_info *curseg = CURSEG_I(sbi, i);
537
538 if (segno == curseg->segno)
539 return 1;
540 }
541 return 0;
542}
543
544static inline u64 BLKOFF_FROM_MAIN(struct f2fs_sb_info *sbi, u64 blk_addr)
545{
546 ASSERT(blk_addr >= SM_I(sbi)->main_blkaddr);
547 return blk_addr - SM_I(sbi)->main_blkaddr;
548}
549
550static inline u32 GET_SEGNO(struct f2fs_sb_info *sbi, u64 blk_addr)
551{
552 return (u32)(BLKOFF_FROM_MAIN(sbi, blk_addr)
553 >> sbi->log_blocks_per_seg);
554}
555
556static inline u32 OFFSET_IN_SEG(struct f2fs_sb_info *sbi, u64 blk_addr)
557{
558 return (u32)(BLKOFF_FROM_MAIN(sbi, blk_addr)
559 % (1 << sbi->log_blocks_per_seg));
560}
561
562static inline void node_info_from_raw_nat(struct node_info *ni,
563 struct f2fs_nat_entry *raw_nat)
564{
565 ni->ino = le32_to_cpu(raw_nat->ino);
566 ni->blk_addr = le32_to_cpu(raw_nat->block_addr);
567 ni->version = raw_nat->version;
568}
569
570static inline void set_summary(struct f2fs_summary *sum, nid_t nid,
571 unsigned int ofs_in_node, unsigned char version)
572{
573 sum->nid = cpu_to_le32(nid);
575 sum->version = version;
576}
577
578#define S_SHIFT 12
579static unsigned char f2fs_type_by_mode[S_IFMT >> S_SHIFT] = {
580 [S_IFREG >> S_SHIFT] = F2FS_FT_REG_FILE,
581 [S_IFDIR >> S_SHIFT] = F2FS_FT_DIR,
582 [S_IFCHR >> S_SHIFT] = F2FS_FT_CHRDEV,
583 [S_IFBLK >> S_SHIFT] = F2FS_FT_BLKDEV,
584 [S_IFIFO >> S_SHIFT] = F2FS_FT_FIFO,
585#ifdef S_IFSOCK
586 [S_IFSOCK >> S_SHIFT] = F2FS_FT_SOCK,
587#endif
588#ifdef S_IFLNK
589 [S_IFLNK >> S_SHIFT] = F2FS_FT_SYMLINK,
590#endif
591};
592
593static inline int map_de_type(umode_t mode)
594{
595 return f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT];
596}
597
598static inline void *inline_xattr_addr(struct f2fs_inode *inode)
599{
600 return (void *)&(inode->i_addr[DEF_ADDRS_PER_INODE -
601 get_inline_xattr_addrs(inode)]);
602}
603
604static inline int inline_xattr_size(struct f2fs_inode *inode)
605{
606 return get_inline_xattr_addrs(inode) * sizeof(__le32);
607}
608
609extern int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid, struct f2fs_nat_entry *ne);
610#define IS_SUM_NODE_SEG(sum) (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_NODE)
611#define IS_SUM_DATA_SEG(sum) (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_DATA)
612
613static inline unsigned int dir_buckets(unsigned int level, int dir_level)
614{
615 if (level + dir_level < MAX_DIR_HASH_DEPTH / 2)
616 return 1 << (level + dir_level);
617 else
618 return MAX_DIR_BUCKETS;
619}
620
621static inline unsigned int bucket_blocks(unsigned int level)
622{
623 if (level < MAX_DIR_HASH_DEPTH / 2)
624 return 2;
625 else
626 return 4;
627}
628
629static inline unsigned long dir_block_index(unsigned int level,
630 int dir_level, unsigned int idx)
631{
632 unsigned long i;
633 unsigned long bidx = 0;
634
635 for (i = 0; i < level; i++)
636 bidx += dir_buckets(i, dir_level) * bucket_blocks(i);
637 bidx += idx * bucket_blocks(level);
638 return bidx;
639}
640
641static inline int is_dot_dotdot(const unsigned char *name, const int len)
642{
643 if (len == 1 && name[0] == '.')
644 return 1;
645 if (len == 2 && name[0] == '.' && name[1] == '.')
646 return 1;
647 return 0;
648}
649
650static inline int get_encoding(struct f2fs_sb_info *sbi)
651{
653}
654
655#endif /* _F2FS_H_ */
unsigned long long __u64
Definition: blkid_types.h:16
__u32 __bitwise __le32
Definition: blkid_types.h:39
#define __le32
Definition: ext4_kernel_headers.h:26
#define __u8
Definition: ext4_kernel_headers.h:36
unsigned int u32
Definition: ext4_utils.h:68
#define cpu_to_le32(x)
Definition: ext4_utils.h:52
#define le32_to_cpu(x)
Definition: ext4_utils.h:54
#define le16_to_cpu(x)
Definition: ext4_utils.h:55
unsigned short int u16
Definition: ext4_utils.h:69
unsigned long long u64
Definition: ext4_utils.h:63
unsigned char u8
Definition: ext4_utils.h:70
#define cpu_to_le16(x)
Definition: ext4_utils.h:53
static struct f2fs_sm_info * SM_I(struct f2fs_sb_info *sbi)
Definition: f2fs.h:315
static void set_summary(struct f2fs_summary *sum, nid_t nid, unsigned int ofs_in_node, unsigned char version)
Definition: f2fs.h:570
static block_t __start_cp_addr(struct f2fs_sb_info *sbi)
Definition: f2fs.h:403
static struct f2fs_nm_info * NM_I(struct f2fs_sb_info *sbi)
Definition: f2fs.h:310
static void __list_del(struct list_head *prev, struct list_head *next)
Definition: f2fs.h:63
static bool is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f)
Definition: f2fs.h:349
static void * inline_data_addr(struct f2fs_node *node_blk)
Definition: f2fs.h:325
static u64 BLKOFF_FROM_MAIN(struct f2fs_sb_info *sbi, u64 blk_addr)
Definition: f2fs.h:544
static struct f2fs_fsck * F2FS_FSCK(struct f2fs_sb_info *sbi)
Definition: f2fs.h:305
static bool is_valid_data_blkaddr(block_t blkaddr)
Definition: f2fs.h:523
static struct f2fs_super_block * F2FS_RAW_SUPER(struct f2fs_sb_info *sbi)
Definition: f2fs.h:295
static int inline_xattr_size(struct f2fs_inode *inode)
Definition: f2fs.h:604
static unsigned int ofs_of_node(struct f2fs_node *node_blk)
Definition: f2fs.h:332
@ META_NAT
Definition: f2fs.h:106
@ META_POR
Definition: f2fs.h:110
@ META_SIT
Definition: f2fs.h:107
@ META_CP
Definition: f2fs.h:105
@ META_MAX
Definition: f2fs.h:109
@ META_SSA
Definition: f2fs.h:108
@ DATA_GENERIC
Definition: f2fs.h:111
static void list_add_tail(struct list_head *new, struct list_head *head)
Definition: f2fs.h:74
static struct curseg_info * CURSEG_I(struct f2fs_sb_info *sbi, int type)
Definition: f2fs.h:479
static unsigned int dir_buckets(unsigned int level, int dir_level)
Definition: f2fs.h:613
static void * __bitmap_ptr(struct f2fs_sb_info *sbi, int flag)
Definition: f2fs.h:373
static block_t __start_sum_addr(struct f2fs_sb_info *sbi)
Definition: f2fs.h:412
static void * inline_xattr_addr(struct f2fs_inode *inode)
Definition: f2fs.h:598
static block_t __end_block_addr(struct f2fs_sb_info *sbi)
Definition: f2fs.h:417
static unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag)
Definition: f2fs.h:355
static unsigned int bucket_blocks(unsigned int level)
Definition: f2fs.h:621
static void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next)
Definition: f2fs.h:53
static int map_de_type(umode_t mode)
Definition: f2fs.h:593
static unsigned long dir_block_index(unsigned int level, int dir_level, unsigned int idx)
Definition: f2fs.h:629
static void node_info_from_raw_nat(struct node_info *ni, struct f2fs_nat_entry *raw_nat)
Definition: f2fs.h:562
static int get_encoding(struct f2fs_sb_info *sbi)
Definition: f2fs.h:650
static unsigned long long cur_cp_version(struct f2fs_checkpoint *cp)
Definition: f2fs.h:338
static __u64 cur_cp_crc(struct f2fs_checkpoint *cp)
Definition: f2fs.h:343
static int is_dot_dotdot(const unsigned char *name, const int len)
Definition: f2fs.h:641
static void list_del(struct list_head *entry)
Definition: f2fs.h:69
static unsigned char f2fs_type_by_mode[S_IFMT > > S_SHIFT]
Definition: f2fs.h:579
static u32 GET_SEGNO(struct f2fs_sb_info *sbi, u64 blk_addr)
Definition: f2fs.h:550
static struct sit_info * SIT_I(struct f2fs_sb_info *sbi)
Definition: f2fs.h:320
static bool IS_VALID_NID(struct f2fs_sb_info *sbi, u32 nid)
Definition: f2fs.h:516
static block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
Definition: f2fs.h:489
static block_t __cp_payload(struct f2fs_sb_info *sbi)
Definition: f2fs.h:368
static struct f2fs_checkpoint * F2FS_CKPT(struct f2fs_sb_info *sbi)
Definition: f2fs.h:300
@ SIT_BITMAP
Definition: f2fs.h:118
@ NAT_BITMAP
Definition: f2fs.h:117
int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid, struct f2fs_nat_entry *ne)
Definition: mount.c:3270
#define S_SHIFT
Definition: f2fs.h:578
static block_t start_sum_block(struct f2fs_sb_info *sbi)
Definition: f2fs.h:484
static int IS_CUR_SEGNO(struct f2fs_sb_info *sbi, u32 segno)
Definition: f2fs.h:531
static u32 OFFSET_IN_SEG(struct f2fs_sb_info *sbi, u64 blk_addr)
Definition: f2fs.h:556
struct f2fs_checkpoint * cp
Definition: f2fs_format.c:41
__le32 nid
Definition: f2fs_fs.h:0
#define ASSERT(exp)
Definition: f2fs_fs.h:272
#define le64_to_cpu(x)
Definition: f2fs_fs.h:225
#define F2FS_NODE_FOOTER(blk)
Definition: f2fs_fs.h:1130
__le32 cp_blkaddr
Definition: f2fs_fs.h:20
__le32 cp_payload
Definition: f2fs_fs.h:32
#define NEW_ADDR
Definition: f2fs_fs.h:663
__le32 main_blkaddr
Definition: f2fs_fs.h:24
#define NULL_ADDR
Definition: f2fs_fs.h:662
#define CP_LARGE_NAT_BITMAP_FLAG
Definition: f2fs_fs.h:831
u32 block_t
Definition: f2fs_fs.h:122
#define get_extra_isize(node)
Definition: f2fs_fs.h:1741
#define F2FS_SLOT_LEN
Definition: f2fs_fs.h:1363
@ OFFSET_BIT_SHIFT
Definition: f2fs_fs.h:1109
@ NO_CHECK_TYPE
Definition: f2fs_fs.h:632
#define MAX_DIR_BUCKETS
Definition: f2fs_fs.h:1375
static int get_inline_xattr_addrs(struct f2fs_inode *inode)
Definition: f2fs_fs.h:1730
#define MAX_DIR_HASH_DEPTH
Definition: f2fs_fs.h:1372
u32 nid_t
Definition: f2fs_fs.h:123
#define CP_MIN_CHKSUM_OFFSET
Definition: f2fs_fs.h:880
__le16 ofs_in_node
Definition: f2fs_fs.h:1
@ F2FS_FT_CHRDEV
Definition: f2fs_fs.h:1438
@ F2FS_FT_DIR
Definition: f2fs_fs.h:1437
@ F2FS_FT_REG_FILE
Definition: f2fs_fs.h:1436
@ F2FS_FT_FIFO
Definition: f2fs_fs.h:1440
@ F2FS_FT_SYMLINK
Definition: f2fs_fs.h:1442
@ F2FS_FT_SOCK
Definition: f2fs_fs.h:1441
@ F2FS_FT_BLKDEV
Definition: f2fs_fs.h:1439
unsigned short umode_t
Definition: f2fs_fs.h:125
__le32 segno
Definition: f2fs_fs.h:0
#define F2FS_BLKSIZE
Definition: f2fs_fs.h:657
#define DEF_ADDRS_PER_INODE
Definition: f2fs_fs.h:945
__le32 segment_count_nat
Definition: f2fs_fs.h:16
#define COMPRESS_ADDR
Definition: f2fs_fs.h:664
struct f2fs_nat_entry ne
Definition: f2fs_fs.h:1
__le16 s_encoding
Definition: f2fs_fs.h:41
__le32 segment_count_main
Definition: f2fs_fs.h:18
#define NAT_ENTRY_PER_BLOCK
Definition: f2fs_fs.h:1136
#define DEF_INLINE_RESERVED_SIZE
Definition: f2fs_fs.h:1420
char * name
Definition: libf2fs.c:1403
uint8_t version
Definition: pairing_connection.cpp:0
uint8_t type
Definition: pairing_connection.h:0
Definition: f2fs.h:180
unsigned int next_segno
Definition: f2fs.h:186
unsigned short next_blkoff
Definition: f2fs.h:184
struct f2fs_summary_block * sum_blk
Definition: f2fs.h:181
unsigned char alloc_type
Definition: f2fs.h:182
unsigned int segno
Definition: f2fs.h:183
unsigned int zone
Definition: f2fs.h:185
Definition: f2fs.h:214
u16 mode
Definition: f2fs.h:222
u64 from_devino
Definition: f2fs.h:231
unsigned long size
Definition: f2fs.h:220
char * path
Definition: f2fs.h:215
u32 mtime
Definition: f2fs.h:226
const u8 * name
Definition: f2fs.h:217
uint64_t capabilities
Definition: f2fs.h:228
int len
Definition: f2fs.h:218
char * link
Definition: f2fs.h:219
u8 file_type
Definition: f2fs.h:221
char * secon
Definition: f2fs.h:227
nid_t ino
Definition: f2fs.h:229
u16 uid
Definition: f2fs.h:223
char * full_path
Definition: f2fs.h:216
nid_t pino
Definition: f2fs.h:230
u16 gid
Definition: f2fs.h:224
u32 * inode
Definition: f2fs.h:225
Definition: f2fs.h:235
struct f2fs_node * node_blk
Definition: f2fs.h:237
block_t data_blkaddr
Definition: f2fs.h:240
block_t node_blkaddr
Definition: f2fs.h:241
int ndirty
Definition: f2fs.h:242
int alloced
Definition: f2fs.h:242
unsigned int ofs_in_node
Definition: f2fs.h:239
int idirty
Definition: f2fs.h:242
struct f2fs_node * inode_blk
Definition: f2fs.h:236
nid_t nid
Definition: f2fs.h:238
Definition: f2fs_fs.h:845
__le32 cp_pack_start_sum
Definition: f2fs_fs.h:861
unsigned char sit_nat_version_bitmap[]
Definition: f2fs_fs.h:873
__le64 checkpoint_ver
Definition: f2fs_fs.h:846
__le32 sit_ver_bitmap_bytesize
Definition: f2fs_fs.h:865
__le32 nat_ver_bitmap_bytesize
Definition: f2fs_fs.h:866
__le32 checksum_offset
Definition: f2fs_fs.h:867
__le32 ckpt_flags
Definition: f2fs_fs.h:859
Definition: f2fs.h:205
struct f2fs_dir_entry * dentry
Definition: f2fs.h:208
int max
Definition: f2fs.h:210
struct inode * inode
Definition: f2fs.h:206
u8 * bitmap
Definition: f2fs.h:207
int nr_bitmap
Definition: f2fs.h:211
__u8(* filename)[F2FS_SLOT_LEN]
Definition: f2fs.h:209
Definition: f2fs_fs.h:1386
Definition: fsck.h:90
struct f2fs_sb_info sbi
Definition: fsck.h:91
Definition: f2fs_fs.h:1034
__le32 i_addr[0]
Definition: f2fs_fs.h:1083
Definition: f2fs_fs.h:1141
__le32 ino
Definition: f2fs_fs.h:1143
__le32 block_addr
Definition: f2fs_fs.h:1144
__u8 version
Definition: f2fs_fs.h:1142
Definition: f2fs.h:128
char * nid_bitmap
Definition: f2fs.h:140
block_t nat_blocks
Definition: f2fs.h:130
char * nat_bitmap
Definition: f2fs.h:138
nid_t next_scan_nid
Definition: f2fs.h:133
unsigned int fcnt
Definition: f2fs.h:136
nid_t init_scan_nid
Definition: f2fs.h:132
int bitmap_size
Definition: f2fs.h:139
unsigned int nat_cnt
Definition: f2fs.h:135
nid_t max_nid
Definition: f2fs.h:131
block_t nat_blkaddr
Definition: f2fs.h:129
Definition: f2fs_fs.h:1122
struct f2fs_inode i
Definition: f2fs_fs.h:1125
Definition: f2fs.h:251
struct f2fs_checkpoint * ckpt
Definition: f2fs.h:257
unsigned int cur_victim_sec
Definition: f2fs.h:283
block_t total_valid_block_count
Definition: f2fs.h:278
unsigned int total_valid_node_count
Definition: f2fs.h:273
int cp_backuped
Definition: f2fs.h:286
struct f2fs_sm_info * sm_info
Definition: f2fs.h:256
unsigned int blocks_per_seg
Definition: f2fs.h:268
unsigned int log_blocksize
Definition: f2fs.h:262
block_t last_valid_block_count
Definition: f2fs.h:280
unsigned int segs_per_sec
Definition: f2fs.h:269
bool seg_manager_done
Definition: f2fs.h:289
unsigned int root_ino_num
Definition: f2fs.h:264
unsigned int total_valid_inode_count
Definition: f2fs.h:274
struct f2fs_nm_info * nm_info
Definition: f2fs.h:255
int cur_cp
Definition: f2fs.h:258
void * hardlink_cache
Definition: f2fs.h:292
unsigned int node_ino_num
Definition: f2fs.h:265
struct f2fs_fsck * fsck
Definition: f2fs.h:252
unsigned int blocksize
Definition: f2fs.h:263
int active_logs
Definition: f2fs.h:275
block_t alloc_valid_block_count
Definition: f2fs.h:279
u32 free_segments
Definition: f2fs.h:284
unsigned int total_sections
Definition: f2fs.h:271
unsigned int log_sectors_per_block
Definition: f2fs.h:261
block_t user_block_count
Definition: f2fs.h:277
unsigned int secs_per_zone
Definition: f2fs.h:270
unsigned int meta_ino_num
Definition: f2fs.h:266
struct f2fs_super_block * raw_super
Definition: f2fs.h:254
unsigned int log_blocks_per_seg
Definition: f2fs.h:267
unsigned int total_node_count
Definition: f2fs.h:272
u32 s_next_generation
Definition: f2fs.h:281
Definition: f2fs.h:189
struct curseg_info saved_curseg_warm_node
Definition: f2fs.h:192
block_t ssa_blkaddr
Definition: f2fs.h:196
unsigned int segment_count
Definition: f2fs.h:198
block_t main_blkaddr
Definition: f2fs.h:195
block_t seg0_blkaddr
Definition: f2fs.h:194
unsigned int ovp_segments
Definition: f2fs.h:201
unsigned int reserved_segments
Definition: f2fs.h:200
struct sit_info * sit_info
Definition: f2fs.h:190
unsigned int free_segments
Definition: f2fs.h:202
struct curseg_info * curseg_array
Definition: f2fs.h:191
unsigned int main_segments
Definition: f2fs.h:199
Definition: f2fs_fs.h:1345
Definition: f2fs_fs.h:1227
__le32 nid
Definition: f2fs_fs.h:1228
__u8 version
Definition: f2fs_fs.h:1232
__le16 ofs_in_node
Definition: f2fs_fs.h:1233
Definition: f2fs_fs.h:773
Definition: f2fs.h:496
block_t last_dentry
Definition: f2fs.h:500
struct list_head list
Definition: f2fs.h:497
block_t blkaddr
Definition: f2fs.h:499
nid_t ino
Definition: f2fs.h:498
Definition: f2fs.h:245
u64 from_devino
Definition: f2fs.h:246
int nbuild
Definition: f2fs.h:248
nid_t to_ino
Definition: f2fs.h:247
Definition: f2fs.h:49
struct list_head * prev
Definition: f2fs.h:50
struct list_head * next
Definition: f2fs.h:50
Definition: f2fs.h:121
nid_t ino
Definition: f2fs.h:123
nid_t nid
Definition: f2fs.h:122
u32 blk_addr
Definition: f2fs.h:124
unsigned char version
Definition: f2fs.h:125
Definition: f2fs.h:155
unsigned int valid_blocks
Definition: f2fs.h:156
Definition: f2fs.h:143
unsigned short valid_blocks
Definition: f2fs.h:144
unsigned char type
Definition: f2fs.h:148
unsigned long long mtime
Definition: f2fs.h:151
unsigned char orig_type
Definition: f2fs.h:149
unsigned char * cur_valid_map
Definition: f2fs.h:146
unsigned short ckpt_valid_blocks
Definition: f2fs.h:145
unsigned char * ckpt_valid_map
Definition: f2fs.h:147
int dirty
Definition: f2fs.h:152
unsigned char ckpt_type
Definition: f2fs.h:150
Definition: f2fs.h:159
block_t sit_base_addr
Definition: f2fs.h:161
struct sec_entry * sec_entries
Definition: f2fs.h:172
unsigned long long mounted_time
Definition: f2fs.h:175
block_t written_valid_blocks
Definition: f2fs.h:163
char * sit_bitmap
Definition: f2fs.h:165
unsigned char * bitmap
Definition: f2fs.h:164
unsigned long long min_mtime
Definition: f2fs.h:176
unsigned long long elapsed_time
Definition: f2fs.h:174
block_t sit_blocks
Definition: f2fs.h:162
struct seg_entry * sentries
Definition: f2fs.h:171
unsigned int dirty_sentries
Definition: f2fs.h:169
unsigned int bitmap_size
Definition: f2fs.h:166
unsigned long * dirty_sentries_bitmap
Definition: f2fs.h:168
unsigned int sents_per_block
Definition: f2fs.h:170
unsigned long long max_mtime
Definition: f2fs.h:177