Android-cuttlefish cvd tool
f2fs_fs.h
Go to the documentation of this file.
17#ifndef __F2FS_FS_H__
18#define __F2FS_FS_H__
20#ifndef __SANE_USERSPACE_TYPES__
21#define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */
22#endif
24#include <assert.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <sys/stat.h>
28#include <stddef.h>
29#include <string.h>
30#include <time.h>
31#include <stdbool.h>
32#include <limits.h>
34#ifdef HAVE_CONFIG_H
35#include <config.h>
36#else
37#ifdef __ANDROID__
38#define WITH_ANDROID
39#endif
40#endif /* HAVE_CONFIG_H */
42#ifdef WITH_ANDROID
44#else
45#define WITH_DUMP
46#define WITH_DEFRAG
47#define WITH_RESIZE
48#define WITH_SLOAD
49#define WITH_LABEL
50#define WITH_INJECT
51#endif
52
53#include <inttypes.h>
54#ifdef HAVE_LINUX_TYPES_H
55#include <linux/types.h>
56#endif
57#include <sys/types.h>
58
59#ifdef HAVE_KERNEL_UAPI_LINUX_BLKZONED_H
60#include <kernel/uapi/linux/blkzoned.h>
61#elif defined(HAVE_LINUX_BLKZONED_H)
62#include <linux/blkzoned.h>
63#endif
64
65#ifdef HAVE_LINUX_RW_HINT_H
66#include <linux/rw_hint.h>
67#else
68enum rw_hint {
75};
76#endif
77
78#ifdef HAVE_LIBSELINUX
79#include <selinux/selinux.h>
80#include <selinux/label.h>
81#endif
82
83#ifdef UNUSED
84#elif defined(__GNUC__)
85# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
86#elif defined(__LCLINT__)
87# define UNUSED(x) x
88#elif defined(__cplusplus)
89# define UNUSED(x)
90#else
91# define UNUSED(x) x
92#endif
93
94#ifndef static_assert
95#define static_assert _Static_assert
96#endif
97
98#ifdef HAVE_SYS_MOUNT_H
99#include <sys/mount.h>
100#endif
101
102#ifndef fallthrough
103#ifdef __clang__
104#define fallthrough do {} while (0) /* fall through */
105#else
106#define fallthrough __attribute__((__fallthrough__))
107#endif
108#endif
109
110#ifdef _WIN32
111#undef HAVE_LINUX_TYPES_H
112#endif
113
114/* codes from kernel's f2fs.h, GPL-v2.0 */
115#define MIN_COMPRESS_LOG_SIZE 2
116#define MAX_COMPRESS_LOG_SIZE 8
117
118typedef uint64_t u64;
119typedef uint32_t u32;
120typedef uint16_t u16;
121typedef uint8_t u8;
122typedef u32 block_t;
123typedef u32 nid_t;
124typedef unsigned long pgoff_t;
125typedef unsigned short umode_t;
126
127#ifndef HAVE_LINUX_TYPES_H
128typedef u8 __u8;
129typedef u16 __u16;
130typedef u32 __u32;
131typedef u64 __u64;
132typedef u16 __le16;
133typedef u32 __le32;
134typedef u64 __le64;
135typedef u16 __be16;
136typedef u32 __be32;
137typedef u64 __be64;
138#endif
139
140/*
141 * code borrowed from kernel f2fs dirver: f2fs.h, GPL-2.0
142 * : definitions of COMPRESS_DATA_RESERVED_SIZE,
143 * struct compress_data, COMPRESS_HEADER_SIZE,
144 * and struct compress_ctx
145 */
146#define COMPRESS_DATA_RESERVED_SIZE 4
148 __le32 clen; /* compressed data size */
149 __le32 chksum; /* checksum of compressed data */
151 u8 cdata[]; /* compressed data */
152};
153#define COMPRESS_HEADER_SIZE (sizeof(struct compress_data))
154/* compress context */
156 unsigned int cluster_size; /* page count in cluster */
157 unsigned int log_cluster_size; /* log of cluster size */
158 void *rbuf; /* compression input buffer */
159 struct compress_data *cbuf; /* comprsssion output header + data */
160 size_t rlen; /* valid data length in rbuf */
161 size_t clen; /* valid data length in cbuf */
162 void *private; /* work buf for compress algorithm */
163};
164
165#if HAVE_BYTESWAP_H
166#include <byteswap.h>
167#else
176static inline uint16_t bswap_16(uint16_t val)
177{
178 return ((val & (uint16_t)0x00ffU) << 8)
179 | ((val & (uint16_t)0xff00U) >> 8);
180}
181
190static inline uint32_t bswap_32(uint32_t val)
191{
192 return ((val & (uint32_t)0x000000ffUL) << 24)
193 | ((val & (uint32_t)0x0000ff00UL) << 8)
194 | ((val & (uint32_t)0x00ff0000UL) >> 8)
195 | ((val & (uint32_t)0xff000000UL) >> 24);
196}
197#endif /* !HAVE_BYTESWAP_H */
198
199#if defined HAVE_DECL_BSWAP_64 && !HAVE_DECL_BSWAP_64
209static inline uint64_t bswap_64(uint64_t val)
210{
211 return ((val & (uint64_t)0x00000000000000ffULL) << 56)
212 | ((val & (uint64_t)0x000000000000ff00ULL) << 40)
213 | ((val & (uint64_t)0x0000000000ff0000ULL) << 24)
214 | ((val & (uint64_t)0x00000000ff000000ULL) << 8)
215 | ((val & (uint64_t)0x000000ff00000000ULL) >> 8)
216 | ((val & (uint64_t)0x0000ff0000000000ULL) >> 24)
217 | ((val & (uint64_t)0x00ff000000000000ULL) >> 40)
218 | ((val & (uint64_t)0xff00000000000000ULL) >> 56);
219}
220#endif
221
222#if __BYTE_ORDER == __LITTLE_ENDIAN
223#define le16_to_cpu(x) ((uint16_t)(x))
224#define le32_to_cpu(x) ((uint32_t)(x))
225#define le64_to_cpu(x) ((uint64_t)(x))
226#define cpu_to_le16(x) ((uint16_t)(x))
227#define cpu_to_le32(x) ((uint32_t)(x))
228#define cpu_to_le64(x) ((uint64_t)(x))
229#define be32_to_cpu(x) __builtin_bswap64(x)
230#elif __BYTE_ORDER == __BIG_ENDIAN
231#define le16_to_cpu(x) bswap_16(x)
232#define le32_to_cpu(x) bswap_32(x)
233#define le64_to_cpu(x) bswap_64(x)
234#define cpu_to_le16(x) bswap_16(x)
235#define cpu_to_le32(x) bswap_32(x)
236#define cpu_to_le64(x) bswap_64(x)
237#define be32_to_cpu(x) ((uint64_t)(x))
238#endif
239
240#define typecheck(type,x) \
241 ({ type __dummy; \
242 typeof(x) __dummy2; \
243 (void)(&__dummy == &__dummy2); \
244 1; \
245 })
246
247#define NULL_SEGNO ((unsigned int)~0)
248
249/*
250 * Debugging interfaces
251 */
252
253#define INFO_MSG(fmt, ...) \
254 do { \
255 printf("[INFO] (%s:%4d) ", __func__, __LINE__); \
256 printf(" --> "fmt"\n", ##__VA_ARGS__); \
257 } while (0)
258
259#define FIX_MSG(fmt, ...) \
260 do { \
261 printf("[FIX] (%s:%4d) ", __func__, __LINE__); \
262 printf(" --> "fmt"\n", ##__VA_ARGS__); \
263 } while (0)
264
265#define ASSERT_MSG(fmt, ...) \
266 do { \
267 printf("[ASSERT] (%s:%4d) ", __func__, __LINE__); \
268 printf(" --> "fmt"\n", ##__VA_ARGS__); \
269 c.bug_on = 1; \
270 } while (0)
271
272#define ASSERT(exp) \
273 do { \
274 if (!(exp)) { \
275 printf("[ASSERT] (%s:%4d) %s\n", \
276 __func__, __LINE__, #exp); \
277 exit(-1); \
278 } \
279 } while (0)
280
281#define ERR_MSG(fmt, ...) \
282 do { \
283 printf("[%s:%d] " fmt, __func__, __LINE__, ##__VA_ARGS__); \
284 } while (0)
285
286#define MSG(n, fmt, ...) \
287 do { \
288 if (c.dbg_lv >= n && !c.layout && !c.show_file_map) { \
289 printf(fmt, ##__VA_ARGS__); \
290 } \
291 } while (0)
292
293#define DBG(n, fmt, ...) \
294 do { \
295 if (c.dbg_lv >= n && !c.layout && !c.show_file_map) { \
296 printf("[%s:%4d] " fmt, \
297 __func__, __LINE__, ##__VA_ARGS__); \
298 } \
299 } while (0)
300
301/* Display on console */
302#define DISP(fmt, ptr, member) \
303 do { \
304 printf("%-30s" fmt, #member, ((ptr)->member)); \
305 } while (0)
306
307#define DISP_raw_str(fmt, member) \
308 do { \
309 if (c.layout) \
310 printf("%-30s " fmt "\n", #member":", member); \
311 else \
312 printf("%-30s" "\t\t[" fmt "]\n", \
313 #member, member); \
314 } while (0)
315
316#define DISP_str(fmt, ptr, member) \
317 do { \
318 if (c.layout) \
319 printf("%-30s " fmt "\n", \
320 #member":", ((ptr)->member)); \
321 else \
322 printf("%-30s" "\t\t[" fmt "]\n", \
323 #member, ((ptr)->member)); \
324 } while (0)
325
326#define DISP_u8(ptr, member) \
327 do { \
328 assert(sizeof((ptr)->member) == 1); \
329 if (c.layout) \
330 printf("%-30s %u\n", \
331 #member":", ((ptr)->member)); \
332 else \
333 printf("%-30s" "\t\t[0x%8x : %u]\n", \
334 #member, ((ptr)->member), ((ptr)->member)); \
335 } while (0)
336
337#define DISP_u16(ptr, member) \
338 do { \
339 assert(sizeof((ptr)->member) == 2); \
340 if (c.layout) \
341 printf("%-30s %u\n", \
342 #member":", le16_to_cpu(((ptr)->member))); \
343 else \
344 printf("%-30s" "\t\t[0x%8x : %u]\n", \
345 #member, le16_to_cpu(((ptr)->member)), \
346 le16_to_cpu(((ptr)->member))); \
347 } while (0)
348
349#define DISP_u32(ptr, member) \
350 do { \
351 assert(sizeof((ptr)->member) <= 4); \
352 if (c.layout) \
353 printf("%-30s %u\n", \
354 #member":", le32_to_cpu(((ptr)->member))); \
355 else \
356 printf("%-30s" "\t\t[0x%8x : %u]\n", \
357 #member, le32_to_cpu(((ptr)->member)), \
358 le32_to_cpu(((ptr)->member))); \
359 } while (0)
360
361#define DISP_u64(ptr, member) \
362 do { \
363 assert(sizeof((ptr)->member) == 8); \
364 if (c.layout) \
365 printf("%-30s %" PRIu64 "\n", \
366 #member":", le64_to_cpu(((ptr)->member))); \
367 else \
368 printf("%-30s" "\t\t[0x%8" PRIx64 " : %" PRIu64 "]\n", \
369 #member, le64_to_cpu(((ptr)->member)), \
370 le64_to_cpu(((ptr)->member))); \
371 } while (0)
372
373#define DISP_utf(ptr, member) \
374 do { \
375 if (c.layout) \
376 printf("%-30s %s\n", #member":", \
377 ((ptr)->member)); \
378 else \
379 printf("%-30s" "\t\t[%s]\n", #member, \
380 ((ptr)->member)); \
381 } while (0)
382
383/* Display to buffer */
384#define BUF_DISP_u32(buf, data, len, ptr, member) \
385 do { \
386 assert(sizeof((ptr)->member) <= 4); \
387 snprintf(buf, len, #member); \
388 snprintf(data, len, "0x%x : %u", ((ptr)->member), \
389 ((ptr)->member)); \
390 } while (0)
391
392#define BUF_DISP_u64(buf, data, len, ptr, member) \
393 do { \
394 assert(sizeof((ptr)->member) == 8); \
395 snprintf(buf, len, #member); \
396 snprintf(data, len, "0x%llx : %llu", ((ptr)->member), \
397 ((ptr)->member)); \
398 } while (0)
399
400#define BUF_DISP_utf(buf, data, len, ptr, member) \
401 snprintf(buf, len, #member)
402
403/* these are defined in kernel */
404#define BITS_PER_BYTE 8
405#ifndef SECTOR_SHIFT
406#define SECTOR_SHIFT 9
407#endif
408#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
409#define CP_CHKSUM_OFFSET (F2FS_BLKSIZE - sizeof(__le32))
410#define SB_CHKSUM_OFFSET 3068
411#define MAX_PATH_LEN 64
412#define MAX_DEVICES 8
413
414#define F2FS_BYTES_TO_BLK(bytes) ((bytes) >> F2FS_BLKSIZE_BITS)
415#define F2FS_BLKSIZE_BITS c.blksize_bits
416
417/* for mkfs */
418#define F2FS_NUMBER_OF_CHECKPOINT_PACK 2
419#define DEFAULT_SECTOR_SIZE 512
420#define DEFAULT_SECTORS_PER_BLOCK (1 << (F2FS_BLKSIZE_BITS - SECTOR_SHIFT))
421#define DEFAULT_BLOCKS_PER_SEGMENT 512
422#define DEFAULT_SEGMENTS_PER_SECTION 1
423#define DEFAULT_BLKSIZE_BITS 12 /* 4096 */
424
425#define VERSION_LEN 256
426#define VERSION_TIMESTAMP_LEN 4
427#define VERSION_NAME_LEN (VERSION_LEN - VERSION_TIMESTAMP_LEN)
428
429#define LPF "lost+found"
430
431/* one for gc buffer, the other for node */
432#define MIN_RSVD_SECS (NR_CURSEG_TYPE + 2U)
433#define CONFIG_RSVD_DEFAULT_OP_RATIO 3.0
434
444};
445
449};
450
452 char *path;
453 int32_t fd;
454 uint32_t sector_size;
455 uint64_t total_sectors; /* got by get_device_info */
457 uint64_t end_blkaddr;
460
461 /* to handle zone block devices */
463 uint32_t nr_zones;
464 uint32_t nr_rnd_zones;
466 uint64_t zone_size;
468};
469
470typedef struct {
471 /* Value 0 means no cache, minimum 1024 */
473
474 /* Value 0 means always overwrite (no collision allowed). maximum 16 */
476
477 bool dbg_en;
479
480/* f2fs_configration for compression used for sload.f2fs */
481typedef struct {
482 void (*init)(struct compress_ctx *cc);
483 int (*compress)(struct compress_ctx *cc);
484 void (*reset)(struct compress_ctx *cc);
486
487/* Should be aligned to supported_comp_names and support_comp_ops */
492};
493
498};
499
500typedef struct {
501 void (*add)(const char *);
502 void (*destroy)(void);
503 bool (*filter)(const char *);
504} filter_ops;
505
506typedef struct {
507 bool enabled; /* disabled by default */
508 bool required; /* require to enable */
509 bool readonly; /* readonly to release blocks */
510 struct compress_ctx cc; /* work context */
511 enum compress_algorithms alg; /* algorithm to compress */
512 compress_ops *ops; /* ops per algorithm */
513 unsigned int min_blocks; /* save more blocks than this */
514 enum filter_policy filter; /* filter to try compression */
515 filter_ops *filter_ops; /* filter ops */
517
518#define ALIGN_DOWN(addrs, size) (((addrs) / (size)) * (size))
519#define ALIGN_UP(addrs, size) ALIGN_DOWN(((addrs) + (size) - 1), (size))
520
521#ifdef CONFIG_64BIT
522#define BITS_PER_LONG 64
523#else
524#define BITS_PER_LONG 32
525#endif
526
527#define BIT_MASK(nr) (1 << (nr % BITS_PER_LONG))
528#define BIT_WORD(nr) (nr / BITS_PER_LONG)
529
530#define set_sb_le64(member, val) (sb->member = cpu_to_le64(val))
531#define set_sb_le32(member, val) (sb->member = cpu_to_le32(val))
532#define set_sb_le16(member, val) (sb->member = cpu_to_le16(val))
533#define get_sb_le64(member) le64_to_cpu(sb->member)
534#define get_sb_le32(member) le32_to_cpu(sb->member)
535#define get_sb_le16(member) le16_to_cpu(sb->member)
536#define get_newsb_le64(member) le64_to_cpu(new_sb->member)
537#define get_newsb_le32(member) le32_to_cpu(new_sb->member)
538#define get_newsb_le16(member) le16_to_cpu(new_sb->member)
539
540#define set_sb(member, val) \
541 do { \
542 typeof(sb->member) t = (val); \
543 switch (sizeof(t)) { \
544 case 8: set_sb_le64(member, t); break; \
545 case 4: set_sb_le32(member, t); break; \
546 case 2: set_sb_le16(member, t); break; \
547 } \
548 } while(0)
549
550#define get_sb(member) \
551 ({ \
552 typeof(sb->member) t; \
553 switch (sizeof(t)) { \
554 case 8: t = get_sb_le64(member); break; \
555 case 4: t = get_sb_le32(member); break; \
556 case 2: t = get_sb_le16(member); break; \
557 } \
558 t; \
559 })
560#define get_newsb(member) \
561 ({ \
562 typeof(new_sb->member) t; \
563 switch (sizeof(t)) { \
564 case 8: t = get_newsb_le64(member); break; \
565 case 4: t = get_newsb_le32(member); break; \
566 case 2: t = get_newsb_le16(member); break; \
567 } \
568 t; \
569 })
570
571#define set_cp_le64(member, val) (cp->member = cpu_to_le64(val))
572#define set_cp_le32(member, val) (cp->member = cpu_to_le32(val))
573#define set_cp_le16(member, val) (cp->member = cpu_to_le16(val))
574#define get_cp_le64(member) le64_to_cpu(cp->member)
575#define get_cp_le32(member) le32_to_cpu(cp->member)
576#define get_cp_le16(member) le16_to_cpu(cp->member)
577
578#define set_cp(member, val) \
579 do { \
580 typeof(cp->member) t = (val); \
581 switch (sizeof(t)) { \
582 case 8: set_cp_le64(member, t); break; \
583 case 4: set_cp_le32(member, t); break; \
584 case 2: set_cp_le16(member, t); break; \
585 } \
586 } while(0)
587
588#define get_cp(member) \
589 ({ \
590 typeof(cp->member) t; \
591 switch (sizeof(t)) { \
592 case 8: t = get_cp_le64(member); break; \
593 case 4: t = get_cp_le32(member); break; \
594 case 2: t = get_cp_le16(member); break; \
595 } \
596 t; \
597 })
598
599/*
600 * Copied from include/linux/kernel.h
601 */
602#define __round_mask(x, y) ((__typeof__(x))((y)-1))
603#define round_down(x, y) ((x) & ~__round_mask(x, y))
604
605#define min(x, y) ({ \
606 typeof(x) _min1 = (x); \
607 typeof(y) _min2 = (y); \
608 (void) (&_min1 == &_min2); \
609 _min1 < _min2 ? _min1 : _min2; })
610
611#define max(x, y) ({ \
612 typeof(x) _max1 = (x); \
613 typeof(y) _max2 = (y); \
614 (void) (&_max1 == &_max2); \
615 _max1 > _max2 ? _max1 : _max2; })
616
617#define round_up(x, y) (((x) + (y) - 1) / (y))
618/*
619 * Copied from fs/f2fs/f2fs.h
620 */
621#define NR_CURSEG_DATA_TYPE (3)
622#define NR_CURSEG_NODE_TYPE (3)
623#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE)
624
625enum {
626 CURSEG_HOT_DATA = 0, /* directory entry blocks */
627 CURSEG_WARM_DATA, /* data blocks */
628 CURSEG_COLD_DATA, /* multimedia or GCed data blocks */
629 CURSEG_HOT_NODE, /* direct node blocks of directory files */
630 CURSEG_WARM_NODE, /* direct node blocks of normal files */
631 CURSEG_COLD_NODE, /* indirect node blocks */
634
635enum {
639};
640
641#define F2FS_MIN_SEGMENTS 9 /* SB + 2 (CP + SIT + NAT) + SSA + MAIN */
642
643/*
644 * Copied from fs/f2fs/segment.h
645 */
646#define GET_SUM_TYPE(sum) (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type)
647#define SET_SUM_TYPE(sum, type) (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type = type)
648
649/*
650 * Copied from include/linux/f2fs_sb.h
651 */
652#define F2FS_SUPER_OFFSET 1024 /* byte-size offset */
653#define F2FS_MIN_LOG_SECTOR_SIZE 9 /* 9 bits for 512 bytes */
654#define F2FS_MAX_LOG_SECTOR_SIZE F2FS_BLKSIZE_BITS /* max sector size is block size */
655#define F2FS_MIN_BLKSIZE 4096
656#define F2FS_MAX_BLKSIZE 16384
657#define F2FS_BLKSIZE c.blksize /* support configurable block size */
658#define F2FS_MAX_EXTENSION 64 /* # of extension entries */
659#define F2FS_EXTENSION_LEN 8 /* max size of extension */
660#define F2FS_BLK_ALIGN(x) (((x) + F2FS_BLKSIZE - 1) / F2FS_BLKSIZE)
661
662#define NULL_ADDR 0x0U
663#define NEW_ADDR -1U
664#define COMPRESS_ADDR -2U
665
666#define F2FS_ROOT_INO(sbi) (sbi->root_ino_num)
667#define F2FS_NODE_INO(sbi) (sbi->node_ino_num)
668#define F2FS_META_INO(sbi) (sbi->meta_ino_num)
669
670#define F2FS_MAX_QUOTAS 3
671#define QUOTA_DATA (((1024 * 6 - 1) / F2FS_BLKSIZE) + 1)
672#define QUOTA_INO(sb,t) (le32_to_cpu((sb)->qf_ino[t]))
673
674/*
675 * On-disk inode flags (f2fs_inode::i_flags)
676 */
677#define F2FS_COMPR_FL 0x00000004 /* Compress file */
678#define F2FS_NODUMP_FL 0x00000040 /* do not dump file */
679#define F2FS_IMMUTABLE_FL 0x00000010 /* Immutable file */
680#define F2FS_NOATIME_FL 0x00000080 /* do not update atime */
681#define F2FS_CASEFOLD_FL 0x40000000 /* Casefolded file */
682#define F2FS_DEVICE_ALIAS_FL 0x80000000 /* File for aliasing a device */
683#define IS_DEVICE_ALIASING(fi) ((fi)->i_flags & cpu_to_le32(F2FS_DEVICE_ALIAS_FL))
684
685#define F2FS_ENC_UTF8_12_1 1
686#define F2FS_ENC_STRICT_MODE_FL (1 << 0)
687#define F2FS_ENC_NO_COMPAT_FALLBACK_FL (1 << 1)
688
689/* This flag is used by node and meta inodes, and by recovery */
690#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO)
691
692/*
693 * For further optimization on multi-head logs, on-disk layout supports maximum
694 * 16 logs by default. The number, 16, is expected to cover all the cases
695 * enoughly. The implementaion currently uses no more than 6 logs.
696 * Half the logs are used for nodes, and the other half are used for data.
697 */
698#define MAX_ACTIVE_LOGS 16
699#define MAX_ACTIVE_NODE_LOGS 8
700#define MAX_ACTIVE_DATA_LOGS 8
701
702#define F2FS_FEATURE_ENCRYPT 0x0001
703#define F2FS_FEATURE_BLKZONED 0x0002
704#define F2FS_FEATURE_ATOMIC_WRITE 0x0004
705#define F2FS_FEATURE_EXTRA_ATTR 0x0008
706#define F2FS_FEATURE_PRJQUOTA 0x0010
707#define F2FS_FEATURE_INODE_CHKSUM 0x0020
708#define F2FS_FEATURE_FLEXIBLE_INLINE_XATTR 0x0040
709#define F2FS_FEATURE_QUOTA_INO 0x0080
710#define F2FS_FEATURE_INODE_CRTIME 0x0100
711#define F2FS_FEATURE_LOST_FOUND 0x0200
712#define F2FS_FEATURE_VERITY 0x0400 /* reserved */
713#define F2FS_FEATURE_SB_CHKSUM 0x0800
714#define F2FS_FEATURE_CASEFOLD 0x1000
715#define F2FS_FEATURE_COMPRESSION 0x2000
716#define F2FS_FEATURE_RO 0x4000
717#define F2FS_FEATURE_DEVICE_ALIAS 0x8000
718
719#define MAX_NR_FEATURE 32
720
721#define MAX_VOLUME_NAME 512
722
723/*
724 * For superblock
725 */
729};
730
731static_assert(sizeof(struct f2fs_device) == 68, "");
732
733/* reason of stop_checkpoint */
745};
746
747#define MAX_STOP_REASON 32
748
749/* detail reason for EFSCORRUPTED */
769};
770
771#define MAX_F2FS_ERRORS 16
772
774 __le32 magic; /* Magic Number */
775 __le16 major_ver; /* Major Version */
776 __le16 minor_ver; /* Minor Version */
777 __le32 log_sectorsize; /* log2 sector size in bytes */
778 __le32 log_sectors_per_block; /* log2 # of sectors per block */
779 __le32 log_blocksize; /* log2 block size in bytes */
780 __le32 log_blocks_per_seg; /* log2 # of blocks per segment */
781 __le32 segs_per_sec; /* # of segments per section */
782 __le32 secs_per_zone; /* # of sections per zone */
783 __le32 checksum_offset; /* checksum offset inside super block */
784 __le64 block_count __attribute__((packed));
785 /* total # of user blocks */
786 __le32 section_count; /* total # of sections */
787 __le32 segment_count; /* total # of segments */
788 __le32 segment_count_ckpt; /* # of segments for checkpoint */
789 __le32 segment_count_sit; /* # of segments for SIT */
790 __le32 segment_count_nat; /* # of segments for NAT */
791 __le32 segment_count_ssa; /* # of segments for SSA */
792 __le32 segment_count_main; /* # of segments for main area */
793 __le32 segment0_blkaddr; /* start block address of segment 0 */
794 __le32 cp_blkaddr; /* start block address of checkpoint */
795 __le32 sit_blkaddr; /* start block address of SIT */
796 __le32 nat_blkaddr; /* start block address of NAT */
797 __le32 ssa_blkaddr; /* start block address of SSA */
798 __le32 main_blkaddr; /* start block address of main area */
799 __le32 root_ino; /* root inode number */
800 __le32 node_ino; /* node inode number */
801 __le32 meta_ino; /* meta inode number */
802 __u8 uuid[16]; /* 128-bit uuid for volume */
804 __le32 extension_count; /* # of extensions below */
805 __u8 extension_list[F2FS_MAX_EXTENSION][8]; /* extension array */
807 __u8 version[VERSION_LEN]; /* the kernel version */
808 __u8 init_version[VERSION_LEN]; /* the initial kernel version */
809 __le32 feature; /* defined features */
810 __u8 encryption_level; /* versioning level for encryption */
811 __u8 encrypt_pw_salt[16]; /* Salt used for string2key algorithm */
812 struct f2fs_device devs[MAX_DEVICES] __attribute__((packed)); /* device list */
813 __le32 qf_ino[F2FS_MAX_QUOTAS] __attribute__((packed)); /* quota inode numbers */
814 __u8 hot_ext_count; /* # of hot file extension */
815 __le16 s_encoding; /* Filename charset encoding */
816 __le16 s_encoding_flags; /* Filename charset encoding flags */
817 __u8 s_stop_reason[MAX_STOP_REASON]; /* stop checkpoint reason */
818 __u8 s_errors[MAX_F2FS_ERRORS]; /* reason of image corrupts */
819 __u8 reserved[258]; /* valid reserved region */
820 __le32 crc; /* checksum of superblock */
821} __attribute__((packed));
822
823static_assert(sizeof(struct f2fs_super_block) == 3072, "");
824
825/*
826 * For checkpoint
827 */
828#define CP_RESIZEFS_FLAG 0x00004000
829#define CP_DISABLED_FLAG 0x00001000
830#define CP_QUOTA_NEED_FSCK_FLAG 0x00000800
831#define CP_LARGE_NAT_BITMAP_FLAG 0x00000400
832#define CP_NOCRC_RECOVERY_FLAG 0x00000200
833#define CP_TRIMMED_FLAG 0x00000100
834#define CP_NAT_BITS_FLAG 0x00000080
835#define CP_CRC_RECOVERY_FLAG 0x00000040
836#define CP_FASTBOOT_FLAG 0x00000020
837#define CP_FSCK_FLAG 0x00000010
838#define CP_ERROR_FLAG 0x00000008
839#define CP_COMPACT_SUM_FLAG 0x00000004
840#define CP_ORPHAN_PRESENT_FLAG 0x00000002
841#define CP_UMOUNT_FLAG 0x00000001
842
843#define F2FS_CP_PACKS 2 /* # of checkpoint packs */
844
846 __le64 checkpoint_ver; /* checkpoint block version number */
847 __le64 user_block_count; /* # of user blocks */
848 __le64 valid_block_count; /* # of valid blocks in main area */
849 __le32 rsvd_segment_count; /* # of reserved segments for gc */
850 __le32 overprov_segment_count; /* # of overprovision segments */
851 __le32 free_segment_count; /* # of free segments in main area */
852
853 /* information of current node segments */
856 /* information of current data segments */
859 __le32 ckpt_flags; /* Flags : umount and journal_present */
860 __le32 cp_pack_total_block_count; /* total # of one cp pack */
861 __le32 cp_pack_start_sum; /* start block number of data summary */
862 __le32 valid_node_count; /* Total number of valid nodes */
863 __le32 valid_inode_count; /* Total number of valid inodes */
864 __le32 next_free_nid; /* Next free node number */
865 __le32 sit_ver_bitmap_bytesize; /* Default value 64 */
866 __le32 nat_ver_bitmap_bytesize; /* Default value 256 */
867 __le32 checksum_offset; /* checksum offset inside cp block */
868 __le64 elapsed_time; /* mounted time */
869 /* allocation type of current segment */
871
872 /* SIT and NAT version bitmap */
873 unsigned char sit_nat_version_bitmap[];
875
876static_assert(sizeof(struct f2fs_checkpoint) == 192, "");
877
878#define CP_BITMAP_OFFSET \
879 (offsetof(struct f2fs_checkpoint, sit_nat_version_bitmap))
880#define CP_MIN_CHKSUM_OFFSET CP_BITMAP_OFFSET
881
882#define MIN_NAT_BITMAP_SIZE 64
883#define MAX_SIT_BITMAP_SIZE_IN_CKPT \
884 (CP_CHKSUM_OFFSET - CP_BITMAP_OFFSET - MIN_NAT_BITMAP_SIZE)
885#define MAX_BITMAP_SIZE_IN_CKPT \
886 (CP_CHKSUM_OFFSET - CP_BITMAP_OFFSET)
887
888/*
889 * For orphan inode management
890 */
891#define F2FS_ORPHANS_PER_BLOCK ((F2FS_BLKSIZE - 4 * sizeof(__le32)) / sizeof(__le32))
892
893/*
894 * On disk layout is:
895 * __le32 ino[F2FS_ORPHANS_PER_BLOCK];
896 * struct f2fs_ophan_block_footer
897 *
898 * Do NOT use sizeof, use F2FS_BLKSIZE instead
899 */
901 __le32 ino[0]; /* F2FS_ORPHANS_PER_BLOCK inode numbers */
902};
903#define F2FS_ORPHAN_BLOCK_FOOTER(blk) ((struct orphan_block_footer *)&(blk)->ino[F2FS_ORPHANS_PER_BLOCK])
904
906 __le32 reserved; /* reserved */
907 __le16 blk_addr; /* block index in current CP */
908 __le16 blk_count; /* Number of orphan inode blocks in CP */
909 __le32 entry_count; /* Total number of orphan nodes in current CP */
910 __le32 check_sum; /* CRC32 for orphan inode block */
911};
912
913/*
914 * For NODE structure
915 */
917 __le32 fofs; /* start file offset of the extent */
918 __le32 blk_addr; /* start block address of the extent */
919 __le32 len; /* lengh of the extent */
920};
921
922static_assert(sizeof(struct f2fs_extent) == 12, "");
923
924#define F2FS_NAME_LEN 255
925
926/* max output length of pretty_print_filename() including null terminator */
927#define F2FS_PRINT_NAMELEN (4 * ((F2FS_NAME_LEN + 2) / 3) + 1)
928
929/* 200 bytes for inline xattrs by default */
930#define DEFAULT_INLINE_XATTR_ADDRS 50
931
933 __le32 nid; /* node id */
934 __le32 ino; /* inode number */
935 __le32 flag; /* include cold/fsync/dentry marks and offset */
936 __le64 cp_ver __attribute__((packed)); /* checkpoint version */
937 __le32 next_blkaddr; /* next node page block address */
938};
939
940static_assert(sizeof(struct node_footer) == 24, "");
941
942#define OFFSET_OF_END_OF_I_EXT 360
943#define SIZE_OF_I_NID 20
944/* Address Pointers in an Inode */
945#define DEF_ADDRS_PER_INODE ((F2FS_BLKSIZE - OFFSET_OF_END_OF_I_EXT \
946 - SIZE_OF_I_NID \
947 - sizeof(struct node_footer)) / sizeof(__le32))
948#define CUR_ADDRS_PER_INODE(inode) (DEF_ADDRS_PER_INODE - \
949 __get_extra_isize(inode))
950#define ADDRS_PER_INODE(i) addrs_per_page(i, true)
951/* Address Pointers in a Direct Block */
952#define DEF_ADDRS_PER_BLOCK ((F2FS_BLKSIZE - sizeof(struct node_footer)) / sizeof(__le32))
953#define ADDRS_PER_BLOCK(i) addrs_per_page(i, false)
954/* Node IDs in an Indirect Block */
955#define NIDS_PER_BLOCK ((F2FS_BLKSIZE - sizeof(struct node_footer)) / sizeof(__le32))
956
957#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1)
958#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2)
959#define NODE_IND1_BLOCK (DEF_ADDRS_PER_INODE + 3)
960#define NODE_IND2_BLOCK (DEF_ADDRS_PER_INODE + 4)
961#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5)
962
963#define F2FS_INLINE_XATTR 0x01 /* file inline xattr flag */
964#define F2FS_INLINE_DATA 0x02 /* file inline data flag */
965#define F2FS_INLINE_DENTRY 0x04 /* file inline dentry flag */
966#define F2FS_DATA_EXIST 0x08 /* file inline data exist flag */
967#define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries */
968#define F2FS_EXTRA_ATTR 0x20 /* file having extra attribute */
969#define F2FS_PIN_FILE 0x40 /* file should not be gced */
970#define F2FS_COMPRESS_RELEASED 0x80 /* file released compressed blocks */
971
972#define F2FS_EXTRA_ISIZE_OFFSET \
973 offsetof(struct f2fs_inode, i_extra_isize)
974#define F2FS_TOTAL_EXTRA_ATTR_SIZE \
975 (offsetof(struct f2fs_inode, i_extra_end) - F2FS_EXTRA_ISIZE_OFFSET)
976
977#define F2FS_DEF_PROJID 0 /* default project ID */
978
979#define MAX_INLINE_DATA(node) (sizeof(__le32) * \
980 (DEF_ADDRS_PER_INODE - \
981 get_inline_xattr_addrs(&node->i) - \
982 get_extra_isize(node) - \
983 DEF_INLINE_RESERVED_SIZE))
984#define DEF_MAX_INLINE_DATA (sizeof(__le32) * \
985 (DEF_ADDRS_PER_INODE - \
986 DEFAULT_INLINE_XATTR_ADDRS - \
987 F2FS_TOTAL_EXTRA_ATTR_SIZE - \
988 DEF_INLINE_RESERVED_SIZE))
989#define INLINE_DATA_OFFSET (F2FS_BLKSIZE - \
990 sizeof(struct node_footer) - \
991 sizeof(__le32) * (DEF_ADDRS_PER_INODE + \
992 5 - DEF_INLINE_RESERVED_SIZE))
993
994#define DEF_DIR_LEVEL 0
995
996/*
997 * i_advise uses FADVISE_XXX_BIT. We can add additional hints later.
998 */
999#define FADVISE_COLD_BIT 0x01
1000#define FADVISE_LOST_PINO_BIT 0x02
1001#define FADVISE_ENCRYPT_BIT 0x04
1002#define FADVISE_ENC_NAME_BIT 0x08
1003#define FADVISE_KEEP_SIZE_BIT 0x10
1004#define FADVISE_HOT_BIT 0x20
1005#define FADVISE_VERITY_BIT 0x40 /* reserved */
1006
1007#define file_is_encrypt(fi) ((fi)->i_advise & FADVISE_ENCRYPT_BIT)
1008#define file_enc_name(fi) ((fi)->i_advise & FADVISE_ENC_NAME_BIT)
1009#define IS_CASEFOLDED(dir) ((dir)->i_flags & cpu_to_le32(F2FS_CASEFOLD_FL))
1010
1011/*
1012 * fsck i_compr_blocks counting helper
1013 */
1015 /* counting i_compr_blocks, init 0 */
1017
1018 /*
1019 * previous seen compression header (COMPR_ADDR) page offsets,
1020 * use CHEADER_PGOFS_NONE for none
1021 */
1023};
1024#define CHEADER_PGOFS_NONE ((u32)-(1 << MAX_COMPRESS_LOG_SIZE))
1025
1026/*
1027 * On disk layout is
1028 * struct f2fs_inode
1029 * struct f2fs_inode_nids
1030 *
1031 * where the size of f2fs_inode depends on block size.
1032 * Do NOT use sizeof
1033 */
1035 __le16 i_mode; /* file mode */
1036 __u8 i_advise; /* file hints */
1037 __u8 i_inline; /* file inline flags */
1038 __le32 i_uid; /* user ID */
1039 __le32 i_gid; /* group ID */
1040 __le32 i_links; /* links count */
1041 __le64 i_size; /* file size in bytes */
1042 __le64 i_blocks; /* file size in blocks */
1043 __le64 i_atime; /* access time */
1044 __le64 i_ctime; /* change time */
1045 __le64 i_mtime; /* modification time */
1046 __le32 i_atime_nsec; /* access time in nano scale */
1047 __le32 i_ctime_nsec; /* change time in nano scale */
1048 __le32 i_mtime_nsec; /* modification time in nano scale */
1049 __le32 i_generation; /* file version (for NFS) */
1050 union {
1051 __le32 i_current_depth; /* only for directory depth */
1053 * # of gc failures on pinned file.
1054 * only for regular files.
1055 */
1056 };
1057 __le32 i_xattr_nid; /* nid to save xattr */
1058 __le32 i_flags; /* file attributes */
1059 __le32 i_pino; /* parent inode number */
1060 __le32 i_namelen; /* file name length */
1061 __u8 i_name[F2FS_NAME_LEN]; /* file name for SPOR */
1062 __u8 i_dir_level; /* dentry_level for large dir */
1063
1064 struct f2fs_extent i_ext __attribute__((packed)); /* caching a largest extent */
1065
1066 union {
1067 struct {
1068 __le16 i_extra_isize; /* extra inode attribute size */
1069 __le16 i_inline_xattr_size; /* inline xattr size, unit: 4 bytes */
1070 __le32 i_projid; /* project id */
1071 __le32 i_inode_checksum;/* inode meta checksum */
1072 __le64 i_crtime; /* creation time */
1073 __le32 i_crtime_nsec; /* creation time in nano scale */
1074 __le64 i_compr_blocks; /* # of compressed blocks */
1075 __u8 i_compress_algorithm; /* compress algorithm */
1076 __u8 i_log_cluster_size; /* log of cluster size */
1077 __le16 i_compress_flag; /* compress flag */
1078 /* 0 bit: chksum flag
1079 * [8,15] bits: compress level
1080 */
1081 __le32 i_extra_end[0]; /* for attribute size calculation */
1082 } __attribute__((packed));
1083 __le32 i_addr[0]; /* Pointers to DEF_ADDRS_PER_INODE data blocks */
1084 };
1085};
1087 __le32 i_nid[5]; /* direct(2), indirect(2),
1088 double_indirect(1) node id */
1089};
1090
1091#define F2FS_INODE_NIDS(inode) ((struct f2fs_inode_nids *)(&(inode)->i_addr[DEF_ADDRS_PER_INODE]))
1092#define F2FS_INODE_I_NID(inode, i) (F2FS_INODE_NIDS((inode))->i_nid[(i)])
1093
1094static_assert(offsetof(struct f2fs_inode, i_extra_end) -
1095 offsetof(struct f2fs_inode, i_extra_isize) == 36, "");
1096
1098 __le32 addr[0]; /* array of DEF_ADDRS_PER_BLOCK data block address */
1099};
1100
1102 __le32 nid[0]; /* array of NIDS_PER_BLOCK data block address */
1103};
1104
1105enum {
1111
1112#define XATTR_NODE_OFFSET ((((unsigned int)-1) << OFFSET_BIT_SHIFT) \
1113 >> OFFSET_BIT_SHIFT)
1114/*
1115 * On disk format is:
1116 * struct f2fs_node
1117 * struct node_footer
1118 *
1119 * where the size of f2fs_node depends on Block Size.
1120 * Do NOT use sizeof. Use F2FS_BLKSIZE instead.
1121 */
1123 /* can be one of three types: inode, direct, and indirect types */
1124 union {
1129};
1130#define F2FS_NODE_FOOTER(blk) ((struct node_footer *)\
1131 &(((char *)(&(blk)->i))[F2FS_BLKSIZE - sizeof(struct node_footer)]))
1132
1133/*
1134 * For NAT entries
1135 */
1136#define NAT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / sizeof(struct f2fs_nat_entry))
1137#define NAT_BLOCK_OFFSET(start_nid) (start_nid / NAT_ENTRY_PER_BLOCK)
1138
1139#define DEFAULT_NAT_ENTRY_RATIO 20
1140
1142 __u8 version; /* latest version of cached nat entry */
1143 __le32 ino; /* inode number */
1144 __le32 block_addr; /* block address */
1145} __attribute__((packed));
1146
1147static_assert(sizeof(struct f2fs_nat_entry) == 9, "");
1148
1150 struct f2fs_nat_entry entries[0]; /* NAT_ENTRY_PER_BLOCK */
1151};
1152
1153/*
1154 * For SIT entries
1155 *
1156 * Each segment is 2MB in size by default so that a bitmap for validity of
1157 * there-in blocks should occupy 64 bytes, 512 bits.
1158 * Not allow to change this.
1159 */
1160#define SIT_VBLOCK_MAP_SIZE 64
1161#define SIT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / sizeof(struct f2fs_sit_entry))
1162
1163/*
1164 * F2FS uses 4 bytes to represent block address. As a result, supported size of
1165 * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
1166 */
1167#define F2FS_MIN_SEGMENT 9 /* SB + 2 (CP + SIT + NAT) + SSA + MAIN */
1168#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
1169#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
1170 SIT_ENTRY_PER_BLOCK)) * \
1171 c.blks_per_seg / 8)
1172#define MAX_CP_PAYLOAD (SEG_ALIGN(SIZE_ALIGN(UINT32_MAX, NAT_ENTRY_PER_BLOCK)) * \
1173 DEFAULT_NAT_ENTRY_RATIO / 100 * \
1174 c.blks_per_seg / 8 + \
1175 MAX_SIT_BITMAP_SIZE - MAX_BITMAP_SIZE_IN_CKPT)
1176
1177/*
1178 * Note that f2fs_sit_entry->vblocks has the following bit-field information.
1179 * [15:10] : allocation type such as CURSEG_XXXX_TYPE
1180 * [9:0] : valid block count
1181 */
1182#define SIT_VBLOCKS_SHIFT 10
1183#define SIT_VBLOCKS_MASK ((1 << SIT_VBLOCKS_SHIFT) - 1)
1184#define GET_SIT_VBLOCKS(raw_sit) \
1185 (le16_to_cpu((raw_sit)->vblocks) & SIT_VBLOCKS_MASK)
1186#define GET_SIT_TYPE(raw_sit) \
1187 ((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \
1188 >> SIT_VBLOCKS_SHIFT)
1189
1191 __le16 vblocks; /* reference above */
1192 __u8 valid_map[SIT_VBLOCK_MAP_SIZE]; /* bitmap for valid blocks */
1193 __le64 mtime; /* segment age for cleaning */
1194} __attribute__((packed));
1195
1196static_assert(sizeof(struct f2fs_sit_entry) == 74, "");
1197
1198/*
1199 * On disk layout is:
1200 * struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK];
1201 */
1204};
1205
1206/*
1207 * For segment summary
1208 *
1209 * One summary block contains exactly 2048 summary entries, which represents
1210 * exactly 32MB segment by default. Not allow to change the basic units.
1211 *
1212 * NOTE: For initializing fields, you must use set_summary
1213 *
1214 * - If data page, nid represents dnode's nid
1215 * - If node page, nid represents the node page's nid.
1216 *
1217 * The ofs_in_node is used by only data page. It represents offset
1218 * from node's page's beginning to get a data block address.
1219 * ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node)
1220 */
1221#define ENTRIES_IN_SUM (F2FS_BLKSIZE / 8)
1222#define SUMMARY_SIZE (7) /* sizeof(struct summary) */
1223#define SUM_FOOTER_SIZE (5) /* sizeof(struct summary_footer) */
1224#define SUM_ENTRIES_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM)
1225
1226/* a summary entry for a 4KB-sized block in a segment */
1228 __le32 nid; /* parent node id */
1229 union {
1231 struct {
1232 __u8 version; /* node version number */
1233 __le16 ofs_in_node; /* block index in parent node */
1234 } __attribute__((packed));
1235 };
1236} __attribute__((packed));
1237
1238static_assert(sizeof(struct f2fs_summary) == 7, "");
1239
1240/* summary block type, node or data, is stored to the summary_footer */
1241#define SUM_TYPE_NODE (1)
1242#define SUM_TYPE_DATA (0)
1243
1245 unsigned char entry_type; /* SUM_TYPE_XXX */
1246 __le32 check_sum __attribute__((packed)); /* summary checksum */
1247};
1248
1249static_assert(sizeof(struct summary_footer) == 5, "");
1250
1251#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\
1252 SUM_ENTRIES_SIZE)
1253#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
1254 sizeof(struct nat_journal_entry))
1255#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
1256 sizeof(struct nat_journal_entry))
1257#define SIT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\
1258 sizeof(struct sit_journal_entry))
1259#define SIT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\
1260 sizeof(struct sit_journal_entry))
1261
1262/*
1263 * Reserved area should make size of f2fs_extra_info equals to
1264 * that of nat_journal and sit_journal.
1265 */
1266#define EXTRA_INFO_RESERVED (SUM_JOURNAL_SIZE - 2 - 8)
1267
1268/*
1269 * frequently updated NAT/SIT entries can be stored in the spare area in
1270 * summary blocks
1271 */
1272enum {
1276
1280} __attribute__((packed));
1281
1282static_assert(sizeof(struct nat_journal_entry) == 13, "");
1283
1284/*
1285 * Layout is as follows:
1286 * struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES];
1287 * __u8 reserved[NAT_JOURNAL_RESERVED];
1288 */
1291};
1292
1296} __attribute__((packed));
1297
1298static_assert(sizeof(struct sit_journal_entry) == 78, "");
1299
1300/*
1301 * Layout is as follows:
1302 * struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES];
1303 * __u8 reserved[SIT_JOURNAL_RESERVED];
1304 */
1307};
1308
1309/*
1310 * Layout is as follows:
1311 * __le64 kbytes_written;
1312 * __u8 reserved[EXTRA_INFO_RESERVED];
1313 */
1317} __attribute__((packed));
1318
1319/*
1320 * This struct's used size depends on F2FS_BLKSIZE. DO NOT use sizeof
1321 */
1323 union {
1327 /* spare area is used by NAT or SIT journals or extra info */
1328 union {
1332 };
1333} __attribute__((packed));
1334
1335/*
1336 * Block-sized summary block structure
1337 * Layout of f2fs_summary block is
1338 * struct f2fs_summary entries[ENTRIES_IN_SUM];
1339 * struct f2fs_journal journal;
1340 * struct summary_footer footer;
1341 *
1342 * Do NOT use sizeof, use F2FS_BLKSIZE
1343 *
1344 */
1347};
1348#define F2FS_SUMMARY_BLOCK_JOURNAL(blk) ((struct f2fs_journal *)(&(blk)->entries[ENTRIES_IN_SUM]))
1349#define F2FS_SUMMARY_BLOCK_FOOTER(blk) ((struct summary_footer *)&((char *)\
1350 (&(blk)->entries[0]))[F2FS_BLKSIZE - SUM_FOOTER_SIZE])
1351
1352/*
1353 * For directory operations
1354 */
1355#define F2FS_DOT_HASH 0
1356#define F2FS_DDOT_HASH F2FS_DOT_HASH
1357#define F2FS_MAX_HASH (~((0x3ULL) << 62))
1358#define F2FS_HASH_COL_BIT ((0x1ULL) << 63)
1359
1361
1362/* One directory entry slot covers 8bytes-long file name */
1363#define F2FS_SLOT_LEN 8
1364#define F2FS_SLOT_LEN_BITS 3
1365
1366#define GET_DENTRY_SLOTS(x) ((x + F2FS_SLOT_LEN - 1) >> F2FS_SLOT_LEN_BITS)
1367
1368/* the number of dentry in a block */
1369#define NR_DENTRY_IN_BLOCK ((BITS_PER_BYTE * F2FS_BLKSIZE) / \
1370 ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * BITS_PER_BYTE + 1))
1371/* MAX level for dir lookup */
1372#define MAX_DIR_HASH_DEPTH 63
1373
1374/* MAX buckets in one level of dir */
1375#define MAX_DIR_BUCKETS (1 << ((MAX_DIR_HASH_DEPTH / 2) - 1))
1376
1377#define SIZE_OF_DIR_ENTRY 11 /* by byte */
1378#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \
1379 BITS_PER_BYTE)
1380#define SIZE_OF_RESERVED (F2FS_BLKSIZE - ((SIZE_OF_DIR_ENTRY + \
1381 F2FS_SLOT_LEN) * \
1382 NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
1383#define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */
1384
1385/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */
1387 __le32 hash_code; /* hash code of file name */
1388 __le32 ino; /* inode number */
1389 __le16 name_len; /* lengh of file name */
1390 __u8 file_type; /* file type */
1391} __attribute__((packed));
1392
1393static_assert(sizeof(struct f2fs_dir_entry) == 11, "");
1394
1395/*
1396 * Block-sized directory entry block
1397 * On disk structure:
1398 * struct f2fs_dentry_block;
1399 * __u8 reserved[SIZE_OF_RESERVED];
1400 * struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK];
1401 * __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN];
1402 *
1403 * Do NOT use sizeof. Use F2FS_BLKSIZE instead
1404 */
1406 /* validity bitmap for directory entries in each block */
1407 __u8 dentry_bitmap[0]; /* size is SIZE_OF_DENTRY_BITMAP, based on block size */
1408};
1409
1410#define F2FS_DENTRY_BLOCK_DENTRIES(blk) ((struct f2fs_dir_entry *)\
1411 &((blk)->dentry_bitmap[SIZE_OF_DENTRY_BITMAP + SIZE_OF_RESERVED]))
1412#define F2FS_DENTRY_BLOCK_DENTRY(blk, i) (F2FS_DENTRY_BLOCK_DENTRIES((blk))[(i)])
1413
1414#define F2FS_DENTRY_BLOCK_FILENAMES(blk) ((__u8(*)[F2FS_SLOT_LEN])&F2FS_DENTRY_BLOCK_DENTRY(blk,\
1415 NR_DENTRY_IN_BLOCK))
1416#define F2FS_DENTRY_BLOCK_FILENAME(blk, i) (&((__u8 *)&F2FS_DENTRY_BLOCK_DENTRY(blk,\
1417 NR_DENTRY_IN_BLOCK))[(i) * F2FS_SLOT_LEN])
1418
1419/* for inline stuff */
1420#define DEF_INLINE_RESERVED_SIZE 1
1421
1422/* for inline dir */
1423#define NR_INLINE_DENTRY(node) (MAX_INLINE_DATA(node) * BITS_PER_BYTE / \
1424 ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
1425 BITS_PER_BYTE + 1))
1426#define INLINE_DENTRY_BITMAP_SIZE(node) ((NR_INLINE_DENTRY(node) + \
1427 BITS_PER_BYTE - 1) / BITS_PER_BYTE)
1428#define INLINE_RESERVED_SIZE(node) (MAX_INLINE_DATA(node) - \
1429 ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
1430 NR_INLINE_DENTRY(node) + \
1431 INLINE_DENTRY_BITMAP_SIZE(node)))
1432
1433/* file types used in inode_info->flags */
1444 /* added for fsck */
1448};
1449
1455
1456#define LINUX_S_IFMT 00170000
1457#define LINUX_S_IFREG 0100000
1458#define LINUX_S_IFDIR 0040000
1459#define LINUX_S_ISREG(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
1460#define LINUX_S_ISDIR(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
1461
1462/* from f2fs/segment.h */
1463enum {
1464 LFS = 0,
1465 SSR
1467
1468/* invalid sb types */
1469#define SB_FORCE_STOP 0x1 /* s_stop_reason is set */
1470#define SB_ABNORMAL_STOP 0x2 /* s_stop_reason is set except shutdown */
1471#define SB_FS_ERRORS 0x4 /* s_erros is set */
1472#define SB_INVALID 0x8 /* sb is invalid */
1473#define SB_ENCODE_FLAG 0x16 /* encode_flag */
1474#define SB_NEED_FIX (SB_ABNORMAL_STOP | SB_FS_ERRORS | \
1475 SB_INVALID | SB_ENCODE_FLAG)
1476
1477#define MAX_CACHE_SUMS 8
1478
1479/* feature list in Android */
1480enum {
1482};
1483
1484/* nolinear lookup tune */
1485enum {
1489};
1490
1491/* Fault inject control */
1492enum {
1504 FAULT_MAX
1506
1507#define F2FS_ALL_FAULT_TYPE ((1UL << (FAULT_MAX)) - 1)
1508
1512 unsigned int inject_type;
1513 unsigned int fault_cnt[FAULT_MAX];
1514};
1515
1516extern const char *f2fs_fault_name[FAULT_MAX];
1517#define IS_FAULT_SET(fi, type) ((fi)->inject_type & (1UL << (type)))
1518
1535 uint32_t sector_size;
1536 uint64_t device_size;
1548 uint16_t s_encoding;
1550 int32_t kd;
1551 int32_t dump_fd;
1557 const char *rootdev_name;
1560 int trim;
1562 int func;
1563 void *private;
1571 unsigned int invalid_sb;
1581 int ro;
1582 int preserve_limits; /* preserve quota limits */
1584 int fix_chksum; /* fix old cp.chksum position */
1585 int nolinear_lookup; /* disable linear lookup */
1586 unsigned int feature; /* defined features */
1587 unsigned int disabled_feature; /* disabled feature, used for Android only */
1588 unsigned int quota_bits; /* quota bits */
1596
1597 /* mkfs parameters */
1600 uint32_t lpf_ino;
1602 uint32_t root_uid;
1603 uint32_t root_gid;
1604 uint32_t blksize;
1606
1607 /* defragmentation parameters */
1610 uint64_t defrag_len;
1612
1613 /* sload parameters */
1618#ifdef HAVE_LIBSELINUX
1619 struct selinux_opt seopt_file[8];
1620 int nr_opt;
1621#endif
1622
1623 /* dump parameters */
1626
1627 /* resize parameters */
1629
1630 /* precomputed fs UUID checksum for seeding other checksums */
1631 uint32_t chksum_seed;
1632
1633 /* cache parameters */
1635
1636 /* compression support for sload.f2fs */
1638
1641 union {
1644 };
1645 union {
1648 };
1649
1650 /* Fault injection control */
1652};
1653
1654extern int utf8_to_utf16(char *, const char *, size_t, size_t);
1655extern int utf16_to_utf8(char *, const char *, size_t, size_t);
1656extern int log_base_2(uint32_t);
1657extern unsigned int addrs_per_page(struct f2fs_inode *, bool);
1658extern u64 f2fs_max_file_offset(struct f2fs_inode *);
1659extern __u32 f2fs_inode_chksum(struct f2fs_node *);
1661extern int write_inode(struct f2fs_node *, u64, enum rw_hint);
1662
1663extern int get_bits_in_byte(unsigned char n);
1664extern int test_and_set_bit_le(u32, u8 *);
1665extern int test_and_clear_bit_le(u32, u8 *);
1666extern int test_bit_le(u32, const u8 *);
1667extern int f2fs_test_bit(unsigned int, const char *);
1668extern int f2fs_set_bit(unsigned int, char *);
1669extern int f2fs_clear_bit(unsigned int, char *);
1670extern u64 find_next_bit_le(const u8 *, u64, u64);
1671extern u64 find_next_zero_bit_le(const u8 *, u64, u64);
1672
1673extern uint32_t f2fs_cal_crc32(uint32_t, void *, int);
1674extern int f2fs_crc_valid(uint32_t blk_crc, void *buf, int len);
1675
1676extern void f2fs_init_configuration(void);
1677extern int f2fs_devs_are_umounted(void);
1678extern int f2fs_dev_is_writable(void);
1679extern int f2fs_dev_is_umounted(char *);
1680extern int f2fs_get_device_info(void);
1681extern int f2fs_get_f2fs_info(void);
1682extern unsigned int calc_extra_isize(void);
1683extern int get_device_info(int);
1684extern int f2fs_init_sparse_file(void);
1685extern void f2fs_release_sparse_resource(void);
1686extern int f2fs_finalize_device(void);
1687extern int f2fs_fsync_device(void);
1688
1689extern void dcache_init(void);
1690extern void dcache_release(void);
1691
1692extern int dev_read(void *, __u64, size_t);
1693#ifdef POSIX_FADV_WILLNEED
1694extern int dev_readahead(__u64, size_t);
1695#else
1696extern int dev_readahead(__u64, size_t UNUSED(len));
1697#endif
1698extern enum rw_hint f2fs_io_type_to_rw_hint(int);
1699extern int dev_write(void *, __u64, size_t, enum rw_hint);
1700extern int dev_write_block(void *, __u64, enum rw_hint);
1701extern int dev_write_dump(void *, __u64, size_t);
1702#if !defined(__MINGW32__)
1703extern int dev_write_symlink(char *, size_t);
1704#endif
1705/* All bytes in the buffer must be 0 use dev_fill(). */
1706extern int dev_fill(void *, __u64, size_t, enum rw_hint);
1707extern int dev_fill_block(void *, __u64, enum rw_hint);
1708
1709extern int dev_read_block(void *, __u64);
1710extern int dev_reada_block(__u64);
1711
1712extern int dev_read_version(void *, __u64, size_t);
1713extern void get_kernel_version(__u8 *);
1714extern void get_kernel_uname_version(__u8 *);
1715f2fs_hash_t f2fs_dentry_hash(int, int, const unsigned char *, int);
1716
1717static inline bool f2fs_has_extra_isize(struct f2fs_inode *inode)
1718{
1719 return (inode->i_inline & F2FS_EXTRA_ATTR);
1720}
1721
1722static inline int __get_extra_isize(struct f2fs_inode *inode)
1723{
1724 if (f2fs_has_extra_isize(inode))
1725 return le16_to_cpu(inode->i_extra_isize) / sizeof(__le32);
1726 return 0;
1727}
1728
1729extern struct f2fs_configuration c;
1730static inline int get_inline_xattr_addrs(struct f2fs_inode *inode)
1731{
1733 return le16_to_cpu(inode->i_inline_xattr_size);
1734 else if (inode->i_inline & F2FS_INLINE_XATTR ||
1737 else
1738 return 0;
1739}
1740
1741#define get_extra_isize(node) __get_extra_isize(&node->i)
1742
1743#define F2FS_ZONED_NONE 0
1744#define F2FS_ZONED_HA 1
1745#define F2FS_ZONED_HM 2
1746
1747#ifdef HAVE_LINUX_BLKZONED_H
1748
1749/* Let's just use v2, since v1 should be compatible with v2 */
1750#define BLK_ZONE_REP_CAPACITY (1 << 0)
1751struct blk_zone_v2 {
1752 __u64 start; /* Zone start sector */
1753 __u64 len; /* Zone length in number of sectors */
1754 __u64 wp; /* Zone write pointer position */
1755 __u8 type; /* Zone type */
1756 __u8 cond; /* Zone condition */
1757 __u8 non_seq; /* Non-sequential write resources active */
1758 __u8 reset; /* Reset write pointer recommended */
1759 __u8 resv[4];
1760 __u64 capacity; /* Zone capacity in number of sectors */
1761 __u8 reserved[24];
1762};
1763#define blk_zone blk_zone_v2
1764
1765struct blk_zone_report_v2 {
1766 __u64 sector;
1767 __u32 nr_zones;
1768 __u32 flags;
1769 struct blk_zone zones[0];
1770};
1771#define blk_zone_report blk_zone_report_v2
1772
1773#define blk_zone_type(z) (z)->type
1774#define blk_zone_conv(z) ((z)->type == BLK_ZONE_TYPE_CONVENTIONAL)
1775#define blk_zone_seq_req(z) ((z)->type == BLK_ZONE_TYPE_SEQWRITE_REQ)
1776#define blk_zone_seq_pref(z) ((z)->type == BLK_ZONE_TYPE_SEQWRITE_PREF)
1777#define blk_zone_seq(z) (blk_zone_seq_req(z) || blk_zone_seq_pref(z))
1778
1779static inline const char *
1780blk_zone_type_str(struct blk_zone *blkz)
1781{
1782 switch (blk_zone_type(blkz)) {
1783 case BLK_ZONE_TYPE_CONVENTIONAL:
1784 return( "Conventional" );
1785 case BLK_ZONE_TYPE_SEQWRITE_REQ:
1786 return( "Sequential-write-required" );
1787 case BLK_ZONE_TYPE_SEQWRITE_PREF:
1788 return( "Sequential-write-preferred" );
1789 }
1790 return( "Unknown-type" );
1791}
1792
1793#define blk_zone_cond(z) (z)->cond
1794
1795static inline const char *
1796blk_zone_cond_str(struct blk_zone *blkz)
1797{
1798 switch (blk_zone_cond(blkz)) {
1799 case BLK_ZONE_COND_NOT_WP:
1800 return "Not-write-pointer";
1801 case BLK_ZONE_COND_EMPTY:
1802 return "Empty";
1803 case BLK_ZONE_COND_IMP_OPEN:
1804 return "Implicit-open";
1805 case BLK_ZONE_COND_EXP_OPEN:
1806 return "Explicit-open";
1807 case BLK_ZONE_COND_CLOSED:
1808 return "Closed";
1809 case BLK_ZONE_COND_READONLY:
1810 return "Read-only";
1811 case BLK_ZONE_COND_FULL:
1812 return "Full";
1813 case BLK_ZONE_COND_OFFLINE:
1814 return "Offline";
1815 }
1816 return "Unknown-cond";
1817}
1818
1819/*
1820 * Handle kernel zone capacity support
1821 */
1822#define blk_zone_empty(z) (blk_zone_cond(z) == BLK_ZONE_COND_EMPTY)
1823#define blk_zone_open(z) (blk_zone_cond(z) == BLK_ZONE_COND_IMP_OPEN || \
1824 blk_zone_cond(z) == BLK_ZONE_COND_EXP_OPEN)
1825#define blk_zone_sector(z) (z)->start
1826#define blk_zone_length(z) (z)->len
1827#define blk_zone_wp_sector(z) (z)->wp
1828#define blk_zone_need_reset(z) (int)(z)->reset
1829#define blk_zone_non_seq(z) (int)(z)->non_seq
1830#define blk_zone_capacity(z, f) ((f & BLK_ZONE_REP_CAPACITY) ? \
1831 (z)->capacity : (z)->len)
1832
1833#endif
1834
1835struct blk_zone;
1836
1837extern int f2fs_get_zoned_model(int);
1838extern int f2fs_get_zone_blocks(int);
1839extern int f2fs_report_zone(int, uint64_t, struct blk_zone *);
1840typedef int (report_zones_cb_t)(int i, void *, void *);
1841extern int f2fs_report_zones(int, report_zones_cb_t *, void *);
1842extern int f2fs_check_zones(int);
1843int f2fs_reset_zone(int, void *);
1844extern int f2fs_reset_zones(int);
1845int f2fs_finish_zone(int i, void *blkzone);
1846extern uint32_t f2fs_get_usable_segments(struct f2fs_super_block *sb);
1847
1848#define SIZE_ALIGN(val, size) (((val) + (size) - 1) / (size))
1849#define SEG_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg)
1850#define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \
1851 c.segs_per_zone)
1852
1853static inline uint32_t get_reserved(struct f2fs_super_block *sb, double ovp)
1854{
1855 uint32_t usable_main_segs = f2fs_get_usable_segments(sb);
1856 uint32_t segs_per_sec = round_up(usable_main_segs, get_sb(section_count));
1857 uint32_t reserved;
1858
1861 else
1862 reserved = (100 / ovp + 1 + NR_CURSEG_TYPE) * segs_per_sec;
1863
1864 /* Let's keep the section alignment */
1866}
1867
1868static inline uint32_t overprovision_segment_buffer(struct f2fs_super_block *sb)
1869{
1870 /* Give 6 current sections to avoid huge GC overheads. */
1871 return 6 * get_sb(segs_per_sec);
1872}
1873
1874static inline double get_best_overprovision(struct f2fs_super_block *sb)
1875{
1876 double ovp, candidate, end, diff, space;
1877 double max_ovp = 0, max_space = 0;
1878 uint32_t usable_main_segs = f2fs_get_usable_segments(sb);
1879 uint32_t reserved;
1880
1881 if (get_sb(segment_count_main) < 256) {
1882 candidate = 10;
1883 end = 95;
1884 diff = 5;
1885 } else {
1886 candidate = 0.01;
1887 end = 10;
1888 diff = 0.01;
1889 }
1890
1891 for (; candidate <= end; candidate += diff) {
1892 reserved = get_reserved(sb, candidate);
1893 ovp = (usable_main_segs - reserved) * candidate / 100;
1894 if (ovp < 0)
1895 continue;
1896 space = usable_main_segs - max((double)reserved, ovp) -
1898 if (max_space < space) {
1899 max_space = space;
1900 max_ovp = candidate;
1901 }
1902 }
1903 return max_ovp;
1904}
1905
1906static inline __le64 get_cp_crc(struct f2fs_checkpoint *cp)
1907{
1908 uint64_t cp_ver = get_cp(checkpoint_ver);
1909 size_t crc_offset = get_cp(checksum_offset);
1910 uint32_t crc = le32_to_cpu(*(__le32 *)((unsigned char *)cp +
1911 crc_offset));
1912
1913 cp_ver |= ((uint64_t)crc << 32);
1914 return cpu_to_le64(cp_ver);
1915}
1916
1917static inline int exist_qf_ino(struct f2fs_super_block *sb)
1918{
1919 int i;
1920
1921 for (i = 0; i < F2FS_MAX_QUOTAS; i++)
1922 if (sb->qf_ino[i])
1923 return 1;
1924 return 0;
1925}
1926
1927static inline int is_qf_ino(struct f2fs_super_block *sb, nid_t ino)
1928{
1929 int i;
1930
1931 for (i = 0; i < F2FS_MAX_QUOTAS; i++)
1932 if (sb->qf_ino[i] == ino)
1933 return 1;
1934 return 0;
1935}
1936
1937static inline void show_version(const char *prog)
1938{
1939#if defined(F2FS_TOOLS_VERSION) && defined(F2FS_TOOLS_DATE)
1940 MSG(0, "%s %s (%s)\n", prog, F2FS_TOOLS_VERSION, F2FS_TOOLS_DATE);
1941#else
1942 MSG(0, "%s -- version not supported\n", prog);
1943#endif
1944}
1945
1946static inline void f2fs_init_inode(struct f2fs_super_block *sb,
1947 struct f2fs_node *raw_node, nid_t ino, time_t mtime, mode_t mode)
1948{
1949 F2FS_NODE_FOOTER(raw_node)->nid = cpu_to_le32(ino);
1950 F2FS_NODE_FOOTER(raw_node)->ino = cpu_to_le32(ino);
1951 F2FS_NODE_FOOTER(raw_node)->cp_ver = cpu_to_le64(1);
1952
1953 raw_node->i.i_uid = cpu_to_le32(c.root_uid);
1954 raw_node->i.i_gid = cpu_to_le32(c.root_gid);
1955
1956 raw_node->i.i_atime = cpu_to_le32(mtime);
1957 raw_node->i.i_atime_nsec = 0;
1958 raw_node->i.i_ctime = cpu_to_le32(mtime);
1959 raw_node->i.i_ctime_nsec = 0;
1960 raw_node->i.i_mtime = cpu_to_le32(mtime);
1961 raw_node->i.i_mtime_nsec = 0;
1962 raw_node->i.i_generation = 0;
1963 raw_node->i.i_xattr_nid = 0;
1964 raw_node->i.i_flags = 0;
1965 raw_node->i.i_current_depth = cpu_to_le32(LINUX_S_ISDIR(mode) ? 1 : 0);
1966 raw_node->i.i_dir_level = DEF_DIR_LEVEL;
1967 raw_node->i.i_mode = cpu_to_le16(mode);
1968 raw_node->i.i_links = cpu_to_le32(LINUX_S_ISDIR(mode) ? 2 : 1);
1969
1970 /* for dentry block in directory */
1971 raw_node->i.i_size = cpu_to_le64(1 << get_sb(log_blocksize));
1972 raw_node->i.i_blocks = cpu_to_le64(2);
1973
1975 raw_node->i.i_inline = F2FS_EXTRA_ATTR;
1977 }
1978
1981
1983 raw_node->i.i_crtime = cpu_to_le32(mtime);
1984 raw_node->i.i_crtime_nsec = 0;
1985 }
1986
1988 raw_node->i.i_compr_blocks = 0;
1989 raw_node->i.i_compress_algorithm = 0;
1990 raw_node->i.i_log_cluster_size = 0;
1991 raw_node->i.i_compress_flag = 0;
1992 }
1993
1994 raw_node->i.i_ext.fofs = 0;
1995 raw_node->i.i_ext.blk_addr = 0;
1996 raw_node->i.i_ext.len = 0;
1997}
1998
1999struct feature {
2000 char *name;
2003};
2004
2005#define INIT_FEATURE_TABLE \
2006struct feature feature_table[] = { \
2007 { "encrypt", F2FS_FEATURE_ENCRYPT, 1}, \
2008 { "blkzoned", F2FS_FEATURE_BLKZONED, 0}, \
2009 { "extra_attr", F2FS_FEATURE_EXTRA_ATTR, 1}, \
2010 { "project_quota", F2FS_FEATURE_PRJQUOTA, 1}, \
2011 { "inode_checksum", F2FS_FEATURE_INODE_CHKSUM, 1}, \
2012 { "flexible_inline_xattr", F2FS_FEATURE_FLEXIBLE_INLINE_XATTR,1}, \
2013 { "quota", F2FS_FEATURE_QUOTA_INO, 1}, \
2014 { "inode_crtime", F2FS_FEATURE_INODE_CRTIME, 1}, \
2015 { "lost_found", F2FS_FEATURE_LOST_FOUND, 1}, \
2016 { "verity", F2FS_FEATURE_VERITY, 1}, \
2017 { "sb_checksum", F2FS_FEATURE_SB_CHKSUM, 1}, \
2018 { "casefold", F2FS_FEATURE_CASEFOLD, 1}, \
2019 { "compression", F2FS_FEATURE_COMPRESSION, 1}, \
2020 { "ro", F2FS_FEATURE_RO, 1}, \
2021 { NULL, 0x0, 0}, \
2022};
2023
2024static inline u32 feature_map(struct feature *table, char *feature)
2025{
2026 struct feature *p;
2027 for (p = table; p->name; p++) {
2028 if (!p->settable)
2029 continue;
2030 if (strcmp(p->name, feature))
2031 continue;
2032 break;
2033 }
2034 return p->mask;
2035}
2036
2037static inline char *feature_name(struct feature *table, u32 mask)
2038{
2039 struct feature *p;
2040 for (p = table; p->name; p++) {
2041 if (p->mask != mask)
2042 continue;
2043 break;
2044 }
2045 return p->name;
2046}
2047
2048static inline int set_feature_bits(struct feature *table, char *features)
2049{
2050 u32 mask = feature_map(table, features);
2051 if (mask) {
2052 c.feature |= mask;
2053 } else {
2054 MSG(0, "Error: Wrong features %s\n", features);
2055 return -1;
2056 }
2057 return 0;
2058}
2059
2060static inline int parse_feature(struct feature *table, const char *features)
2061{
2062 char *buf, *sub, *next;
2063
2064 buf = strdup(features);
2065 if (!buf)
2066 return -1;
2067
2068 for (sub = buf; sub && *sub; sub = next ? next + 1 : NULL) {
2069 /* Skip the beginning blanks */
2070 while (*sub && *sub == ' ')
2071 sub++;
2072 next = sub;
2073 /* Skip a feature word */
2074 while (*next && *next != ' ' && *next != ',')
2075 next++;
2076
2077 if (*next == 0)
2078 next = NULL;
2079 else
2080 *next = 0;
2081
2082 if (set_feature_bits(table, sub)) {
2083 free(buf);
2084 return -1;
2085 }
2086 }
2087 free(buf);
2088 return 0;
2089}
2090
2091static inline int parse_root_owner(char *ids,
2092 uint32_t *root_uid, uint32_t *root_gid)
2093{
2094 char *uid = ids;
2095 char *gid = NULL;
2096 int i;
2097
2098 /* uid:gid */
2099 for (i = 0; i < strlen(ids) - 1; i++)
2100 if (*(ids + i) == ':')
2101 gid = ids + i + 1;
2102 if (!gid)
2103 return -1;
2104
2105 *root_uid = atoi(uid);
2106 *root_gid = atoi(gid);
2107 return 0;
2108}
2109
2110/*
2111 * NLS definitions
2112 */
2115 const struct f2fs_nls_ops *ops;
2116};
2117
2119 int (*casefold)(const struct f2fs_nls_table *charset,
2120 const unsigned char *str, size_t len,
2121 unsigned char *dest, size_t dlen);
2122};
2123
2124extern const struct f2fs_nls_table *f2fs_load_nls_table(int encoding);
2125#define F2FS_ENC_UTF8_12_0 1
2126
2127extern int f2fs_str2encoding(const char *string);
2128extern char *f2fs_encoding2str(const int encoding);
2129extern int f2fs_get_encoding_flags(int encoding);
2130extern int f2fs_str2encoding_flags(char **param, __u16 *flags);
2131
2132static inline void check_block_struct_sizes(void)
2133{
2134 /* Check Orphan Block Size */
2135 assert(F2FS_ORPHANS_PER_BLOCK * sizeof(__le32)
2136 + sizeof(struct orphan_block_footer) == F2FS_BLKSIZE);
2137
2138 /* Check Inode Block Size */
2139 assert(offsetof(struct f2fs_inode, i_extra_isize) + DEF_ADDRS_PER_INODE * sizeof(__le32)
2140 + sizeof(struct f2fs_inode_nids) + sizeof(struct node_footer) == F2FS_BLKSIZE);
2141
2142 /* Check Direct Block Size */
2143 assert(DEF_ADDRS_PER_BLOCK * sizeof(__le32) + sizeof(struct node_footer) == F2FS_BLKSIZE);
2144
2145 /* Check Indirect Block Size */
2146 assert(NIDS_PER_BLOCK * sizeof(__le32) + sizeof(struct node_footer) == F2FS_BLKSIZE);
2147
2148 /* Check NAT Block Size */
2149 assert((NAT_ENTRY_PER_BLOCK + 1) * sizeof(struct f2fs_nat_entry) > F2FS_BLKSIZE);
2150 assert(NAT_ENTRY_PER_BLOCK * sizeof(struct f2fs_nat_entry) <= F2FS_BLKSIZE);
2151
2152 /* Check SIT Block Size */
2153 assert((SIT_ENTRY_PER_BLOCK + 1) * sizeof(struct f2fs_sit_entry) > F2FS_BLKSIZE);
2154 assert(SIT_ENTRY_PER_BLOCK * sizeof(struct f2fs_sit_entry) <= F2FS_BLKSIZE);
2155
2156 /* Check NAT Journal Block Size */
2157 assert(sizeof(struct f2fs_summary) * ENTRIES_IN_SUM
2158 + offsetof(struct f2fs_journal, nat_j)
2159 + NAT_JOURNAL_ENTRIES * sizeof(struct nat_journal_entry)
2160 + NAT_JOURNAL_RESERVED + sizeof(struct summary_footer) == F2FS_BLKSIZE);
2161
2162 /* Check SIT Journal Block Size */
2163 assert(sizeof(struct f2fs_summary) * ENTRIES_IN_SUM
2164 + offsetof(struct f2fs_journal, sit_j)
2165 + SIT_JOURNAL_ENTRIES * sizeof(struct sit_journal_entry)
2166 + SIT_JOURNAL_RESERVED + sizeof(struct summary_footer) == F2FS_BLKSIZE);
2167
2168 /* Check Info Journal Block Size */
2169 assert(sizeof(struct f2fs_summary) * ENTRIES_IN_SUM + sizeof(__le64)
2170 + offsetof(struct f2fs_journal, info)
2171 + EXTRA_INFO_RESERVED + sizeof(struct summary_footer) == F2FS_BLKSIZE);
2172
2173 /* Check Dentry Block Size */
2174 assert(sizeof(__u8) * (SIZE_OF_DENTRY_BITMAP + SIZE_OF_RESERVED)
2175 + NR_DENTRY_IN_BLOCK * sizeof(struct f2fs_dir_entry)
2177}
2178
2179/* Fault inject control */
2180#define time_to_inject(type) __time_to_inject(type, __func__, \
2181 __builtin_return_address(0))
2182static inline bool __time_to_inject(int type, const char *func,
2183 const char *parent_func)
2184{
2185 struct f2fs_fault_info *ffi = &c.fault_info;
2186
2187 if (!ffi->inject_rate)
2188 return false;
2189
2190 if (!IS_FAULT_SET(ffi, type))
2191 return false;
2192
2193 ffi->inject_ops++;
2194 if (ffi->inject_ops >= ffi->inject_rate) {
2195 ffi->inject_ops = 0;
2196 if (ffi->fault_cnt[type] != UINT_MAX)
2197 ffi->fault_cnt[type]++;
2198 MSG(0, "inject %s in %s of %p\n",
2199 f2fs_fault_name[type], func, parent_func);
2200 return true;
2201 }
2202 return false;
2203}
2204
2205#endif /*__F2FS_FS_H */
unsigned long long __u64
Definition: blkid_types.h:16
__u64 __bitwise __le64
Definition: blkid_types.h:40
unsigned int __u32
Definition: blkid_types.h:14
__u32 __bitwise __le32
Definition: blkid_types.h:39
__u16 __bitwise __le16
Definition: blkid_types.h:38
unsigned char __u8
Definition: blkid_types.h:10
unsigned short __u16
Definition: blkid_types.h:12
unsigned int u32
Definition: ext4_utils.h:68
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
struct f2fs_checkpoint * cp
Definition: f2fs_format.c:41
struct f2fs_super_block * sb
Definition: f2fs_format.c:40
const struct f2fs_nls_table * f2fs_load_nls_table(int encoding)
Definition: nls_utf8.c:929
u64 find_next_bit_le(const u8 *, u64, u64)
Definition: libf2fs.c:392
static int parse_root_owner(char *ids, uint32_t *root_uid, uint32_t *root_gid)
Definition: f2fs_fs.h:2091
#define MAX_VOLUME_NAME
Definition: f2fs_fs.h:721
int test_and_clear_bit_le(u32, u8 *)
Definition: libf2fs.c:298
u16 __u16
Definition: f2fs_fs.h:129
int get_bits_in_byte(unsigned char n)
Definition: libf2fs.c:282
__le16 i_extra_isize
Definition: f2fs_fs.h:0
struct f2fs_extra_info info
Definition: f2fs_fs.h:8
#define NAT_JOURNAL_ENTRIES
Definition: f2fs_fs.h:1253
#define MAX_ACTIVE_NODE_LOGS
Definition: f2fs_fs.h:699
#define VERSION_LEN
Definition: f2fs_fs.h:425
int dev_fill(void *, __u64, size_t, enum rw_hint)
Definition: libf2fs_io.c:709
const char * f2fs_fault_name[FAULT_MAX]
Definition: fsck.c:19
#define NR_CURSEG_TYPE
Definition: f2fs_fs.h:623
@ LINEAR_LOOKUP_DEFAULT
Definition: f2fs_fs.h:1486
@ LINEAR_LOOKUP_DISABLE
Definition: f2fs_fs.h:1488
@ LINEAR_LOOKUP_ENABLE
Definition: f2fs_fs.h:1487
#define F2FS_MAX_QUOTAS
Definition: f2fs_fs.h:670
stop_cp_reason
Definition: f2fs_fs.h:734
@ STOP_CP_REASON_FAULT_INJECT
Definition: f2fs_fs.h:736
@ STOP_CP_REASON_CORRUPTED_SUMMARY
Definition: f2fs_fs.h:739
@ STOP_CP_REASON_SHUTDOWN
Definition: f2fs_fs.h:735
@ STOP_CP_REASON_UPDATE_INODE
Definition: f2fs_fs.h:740
@ STOP_CP_REASON_NO_SEGMENT
Definition: f2fs_fs.h:742
@ STOP_CP_REASON_CORRUPTED_FREE_BITMAP
Definition: f2fs_fs.h:743
@ STOP_CP_REASON_WRITE_FAIL
Definition: f2fs_fs.h:738
@ STOP_CP_REASON_FLUSH_FAIL
Definition: f2fs_fs.h:741
@ STOP_CP_REASON_META_PAGE
Definition: f2fs_fs.h:737
@ STOP_CP_REASON_MAX
Definition: f2fs_fs.h:744
__le32 section_count
Definition: f2fs_fs.h:12
__le32 crc
Definition: f2fs_fs.h:46
#define SIZE_OF_RESERVED
Definition: f2fs_fs.h:1380
#define F2FS_NODE_FOOTER(blk)
Definition: f2fs_fs.h:1130
u8 __u8
Definition: f2fs_fs.h:128
static u32 feature_map(struct feature *table, char *feature)
Definition: f2fs_fs.h:2024
#define ENTRIES_IN_SUM
Definition: f2fs_fs.h:1221
#define cpu_to_le32(x)
Definition: f2fs_fs.h:227
@ FAULT_COMPR
Definition: f2fs_fs.h:1499
@ FAULT_QUOTA
Definition: f2fs_fs.h:1503
@ FAULT_DENTRY
Definition: f2fs_fs.h:1501
@ FAULT_SUM_TYPE
Definition: f2fs_fs.h:1494
@ FAULT_XATTR_ENT
Definition: f2fs_fs.h:1498
@ FAULT_NAT
Definition: f2fs_fs.h:1496
@ FAULT_SEG_TYPE
Definition: f2fs_fs.h:1493
@ FAULT_DATA
Definition: f2fs_fs.h:1502
@ FAULT_NODE
Definition: f2fs_fs.h:1497
@ FAULT_MAX
Definition: f2fs_fs.h:1504
@ FAULT_INODE
Definition: f2fs_fs.h:1500
@ FAULT_SUM_ENT
Definition: f2fs_fs.h:1495
int dev_read(void *, __u64, size_t)
Definition: libf2fs_io.c:532
int f2fs_reset_zone(int, void *)
static uint32_t overprovision_segment_buffer(struct f2fs_super_block *sb)
Definition: f2fs_fs.h:1868
int get_device_info(int)
Definition: libf2fs.c:959
void dcache_init(void)
Definition: libf2fs_io.c:203
#define F2FS_ORPHANS_PER_BLOCK
Definition: f2fs_fs.h:891
@ NAT_JOURNAL
Definition: f2fs_fs.h:1273
@ SIT_JOURNAL
Definition: f2fs_fs.h:1274
#define SIT_ENTRY_PER_BLOCK
Definition: f2fs_fs.h:1161
static int set_feature_bits(struct feature *table, char *features)
Definition: f2fs_fs.h:2048
int dev_fill_block(void *, __u64, enum rw_hint)
Definition: libf2fs_io.c:722
enum rw_hint f2fs_io_type_to_rw_hint(int)
Definition: libf2fs_io.c:607
@ CURSEG_RO_HOT_DATA
Definition: f2fs_fs.h:636
@ NR_RO_CURSEG_TYPE
Definition: f2fs_fs.h:638
@ CURSEG_RO_HOT_NODE
Definition: f2fs_fs.h:637
uint32_t f2fs_get_usable_segments(struct f2fs_super_block *sb)
Definition: libf2fs_zoned.c:632
void f2fs_init_configuration(void)
Definition: libf2fs.c:682
u64 __le64
Definition: f2fs_fs.h:134
void get_kernel_version(__u8 *)
Definition: libf2fs.c:893
default_set
Definition: f2fs_fs.h:446
@ CONF_ANDROID
Definition: f2fs_fs.h:448
@ CONF_NONE
Definition: f2fs_fs.h:447
#define NR_DENTRY_IN_BLOCK
Definition: f2fs_fs.h:1369
#define MAX_CACHE_SUMS
Definition: f2fs_fs.h:1477
#define get_cp(member)
Definition: f2fs_fs.h:588
void get_kernel_uname_version(__u8 *)
Definition: libf2fs.c:903
int dev_write(void *, __u64, size_t, enum rw_hint)
Definition: libf2fs_io.c:661
__le32 i_extra_end[0]
Definition: f2fs_fs.h:13
#define DEFAULT_INLINE_XATTR_ADDRS
Definition: f2fs_fs.h:930
int f2fs_get_f2fs_info(void)
Definition: libf2fs.c:1294
uint64_t u64
Definition: f2fs_fs.h:118
#define MAX_ACTIVE_LOGS
Definition: f2fs_fs.h:698
int dev_readahead(__u64, size_t UNUSED(len))
Definition: libf2fs_io.c:565
#define le32_to_cpu(x)
Definition: f2fs_fs.h:224
int dev_reada_block(__u64)
Definition: libf2fs_io.c:732
__u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint *)
Definition: libf2fs.c:592
#define MAX_DEVICES
Definition: f2fs_fs.h:412
int utf16_to_utf8(char *, const char *, size_t, size_t)
Definition: libf2fs.c:216
static int is_qf_ino(struct f2fs_super_block *sb, nid_t ino)
Definition: f2fs_fs.h:1927
void dcache_release(void)
Definition: libf2fs_io.c:139
static bool __time_to_inject(int type, const char *func, const char *parent_func)
Definition: f2fs_fs.h:2182
__le32 segs_per_sec
Definition: f2fs_fs.h:7
uint32_t f2fs_cal_crc32(uint32_t, void *, int)
Definition: libf2fs.c:543
#define MAX_STOP_REASON
Definition: f2fs_fs.h:747
int test_and_set_bit_le(u32, u8 *)
Definition: libf2fs.c:287
#define F2FS_EXTRA_ATTR
Definition: f2fs_fs.h:968
__u8 reserved[258]
Definition: f2fs_fs.h:45
u64 find_next_zero_bit_le(const u8 *, u64, u64)
Definition: libf2fs.c:398
static uint32_t bswap_32(uint32_t val)
Definition: f2fs_fs.h:190
f2fs_hash_t f2fs_dentry_hash(int, int, const unsigned char *, int)
Definition: libf2fs.c:494
int f2fs_crc_valid(uint32_t blk_crc, void *buf, int len)
Definition: libf2fs.c:555
#define DEF_ADDRS_PER_BLOCK
Definition: f2fs_fs.h:952
int log_base_2(uint32_t)
Definition: libf2fs.c:249
#define IS_FAULT_SET(fi, type)
Definition: f2fs_fs.h:1517
compress_algorithms
Definition: f2fs_fs.h:488
@ COMPR_LZO
Definition: f2fs_fs.h:489
@ MAX_COMPRESS_ALGS
Definition: f2fs_fs.h:491
@ COMPR_LZ4
Definition: f2fs_fs.h:490
#define le16_to_cpu(x)
Definition: f2fs_fs.h:223
__le32 f2fs_hash_t
Definition: f2fs_fs.h:1360
u32 block_t
Definition: f2fs_fs.h:122
#define SIT_JOURNAL_RESERVED
Definition: f2fs_fs.h:1259
static void show_version(const char *prog)
Definition: f2fs_fs.h:1937
struct f2fs_configuration c
Definition: libf2fs_io.c:47
#define F2FS_SLOT_LEN
Definition: f2fs_fs.h:1363
int dev_read_version(void *, __u64, size_t)
Definition: libf2fs_io.c:399
__le32 checksum_offset
Definition: f2fs_fs.h:9
int f2fs_init_sparse_file(void)
Definition: libf2fs_io.c:755
@ DENT_BIT_SHIFT
Definition: f2fs_fs.h:1108
@ COLD_BIT_SHIFT
Definition: f2fs_fs.h:1106
@ OFFSET_BIT_SHIFT
Definition: f2fs_fs.h:1109
@ FSYNC_BIT_SHIFT
Definition: f2fs_fs.h:1107
__u32 f2fs_inode_chksum(struct f2fs_node *)
Definition: libf2fs.c:570
#define EXTRA_INFO_RESERVED
Definition: f2fs_fs.h:1266
#define F2FS_FEATURE_PRJQUOTA
Definition: f2fs_fs.h:706
int f2fs_check_zones(int)
Definition: libf2fs_zoned.c:608
@ CURSEG_WARM_NODE
Definition: f2fs_fs.h:630
@ CURSEG_COLD_DATA
Definition: f2fs_fs.h:628
@ CURSEG_HOT_NODE
Definition: f2fs_fs.h:629
@ CURSEG_HOT_DATA
Definition: f2fs_fs.h:626
@ NO_CHECK_TYPE
Definition: f2fs_fs.h:632
@ CURSEG_WARM_DATA
Definition: f2fs_fs.h:627
@ CURSEG_COLD_NODE
Definition: f2fs_fs.h:631
int f2fs_get_encoding_flags(int encoding)
Definition: libf2fs.c:1446
__le64 mtime
Definition: f2fs_fs.h:2
int dev_write_block(void *, __u64, enum rw_hint)
Definition: libf2fs_io.c:680
#define MSG(n, fmt,...)
Definition: f2fs_fs.h:286
static uint16_t bswap_16(uint16_t val)
Definition: f2fs_fs.h:176
#define SIT_VBLOCK_MAP_SIZE
Definition: f2fs_fs.h:1160
@ SSR
Definition: f2fs_fs.h:1465
@ LFS
Definition: f2fs_fs.h:1464
#define MAX_F2FS_ERRORS
Definition: f2fs_fs.h:771
static int parse_feature(struct feature *table, const char *features)
Definition: f2fs_fs.h:2060
dot_type
Definition: f2fs_fs.h:1450
@ TYPE_DOT
Definition: f2fs_fs.h:1452
@ NON_DOT
Definition: f2fs_fs.h:1451
@ TYPE_DOTDOT
Definition: f2fs_fs.h:1453
static int get_inline_xattr_addrs(struct f2fs_inode *inode)
Definition: f2fs_fs.h:1730
static int __get_extra_isize(struct f2fs_inode *inode)
Definition: f2fs_fs.h:1722
#define UNUSED(x)
Definition: f2fs_fs.h:91
u32 nid_t
Definition: f2fs_fs.h:123
#define SIT_JOURNAL_ENTRIES
Definition: f2fs_fs.h:1257
#define F2FS_NAME_LEN
Definition: f2fs_fs.h:924
unsigned long pgoff_t
Definition: f2fs_fs.h:124
#define F2FS_MAX_BLKSIZE
Definition: f2fs_fs.h:656
#define F2FS_FEATURE_COMPRESSION
Definition: f2fs_fs.h:715
void f2fs_release_sparse_resource(void)
Definition: libf2fs_io.c:800
int dev_read_block(void *, __u64)
Definition: libf2fs_io.c:727
rw_hint
Definition: f2fs_fs.h:68
@ WRITE_LIFE_EXTREME
Definition: f2fs_fs.h:74
@ WRITE_LIFE_NONE
Definition: f2fs_fs.h:70
@ WRITE_LIFE_NOT_SET
Definition: f2fs_fs.h:69
@ WRITE_LIFE_LONG
Definition: f2fs_fs.h:73
@ WRITE_LIFE_SHORT
Definition: f2fs_fs.h:71
@ WRITE_LIFE_MEDIUM
Definition: f2fs_fs.h:72
u64 __be64
Definition: f2fs_fs.h:137
int f2fs_get_zoned_model(int)
Definition: libf2fs_zoned.c:587
uint8_t u8
Definition: f2fs_fs.h:121
int dev_write_symlink(char *, size_t)
Definition: libf2fs_io.c:700
struct sit_journal sit_j
Definition: f2fs_fs.h:7
int f2fs_str2encoding(const char *string)
Definition: libf2fs.c:1424
FILE_TYPE
Definition: f2fs_fs.h:1434
@ F2FS_FT_MAX
Definition: f2fs_fs.h:1443
@ F2FS_FT_CHRDEV
Definition: f2fs_fs.h:1438
@ F2FS_FT_DIR
Definition: f2fs_fs.h:1437
@ F2FS_FT_ORPHAN
Definition: f2fs_fs.h:1445
@ F2FS_FT_XATTR
Definition: f2fs_fs.h:1446
@ F2FS_FT_REG_FILE
Definition: f2fs_fs.h:1436
@ F2FS_FT_LAST_FILE_TYPE
Definition: f2fs_fs.h:1447
@ F2FS_FT_FIFO
Definition: f2fs_fs.h:1440
@ F2FS_FT_UNKNOWN
Definition: f2fs_fs.h:1435
@ F2FS_FT_SYMLINK
Definition: f2fs_fs.h:1442
@ F2FS_FT_SOCK
Definition: f2fs_fs.h:1441
@ F2FS_FT_BLKDEV
Definition: f2fs_fs.h:1439
static char * feature_name(struct feature *table, u32 mask)
Definition: f2fs_fs.h:2037
static void check_block_struct_sizes(void)
Definition: f2fs_fs.h:2132
#define get_sb(member)
Definition: f2fs_fs.h:550
#define F2FS_FEATURE_FLEXIBLE_INLINE_XATTR
Definition: f2fs_fs.h:708
#define MAX_ACTIVE_DATA_LOGS
Definition: f2fs_fs.h:700
u32 __le32
Definition: f2fs_fs.h:133
unsigned short umode_t
Definition: f2fs_fs.h:125
int f2fs_devs_are_umounted(void)
Definition: libf2fs.c:881
#define cpu_to_le64(x)
Definition: f2fs_fs.h:228
#define NIDS_PER_BLOCK
Definition: f2fs_fs.h:955
static bool f2fs_has_extra_isize(struct f2fs_inode *inode)
Definition: f2fs_fs.h:1717
int f2fs_str2encoding_flags(char **param, __u16 *flags)
Definition: libf2fs.c:1457
#define F2FS_BLKSIZE
Definition: f2fs_fs.h:657
#define DEF_ADDRS_PER_INODE
Definition: f2fs_fs.h:945
#define SIZE_OF_DENTRY_BITMAP
Definition: f2fs_fs.h:1378
int dev_write_dump(void *, __u64, size_t)
Definition: libf2fs_io.c:685
__le32 log_blocksize
Definition: f2fs_fs.h:5
int utf8_to_utf16(char *, const char *, size_t, size_t)
Definition: libf2fs.c:121
#define DEF_DIR_LEVEL
Definition: f2fs_fs.h:994
int f2fs_report_zone(int, uint64_t, struct blk_zone *)
int f2fs_report_zones(int, report_zones_cb_t *, void *)
#define F2FS_FEATURE_EXTRA_ATTR
Definition: f2fs_fs.h:705
#define round_up(x, y)
Definition: f2fs_fs.h:617
#define LINUX_S_ISDIR(m)
Definition: f2fs_fs.h:1460
u32 __be32
Definition: f2fs_fs.h:136
f2fs_error
Definition: f2fs_fs.h:750
@ ERROR_CORRUPTED_DIRENT
Definition: f2fs_fs.h:754
@ ERROR_INCONSISTENT_FOOTER
Definition: f2fs_fs.h:757
@ ERROR_INVALID_NODE_REFERENCE
Definition: f2fs_fs.h:766
@ ERROR_INVALID_CURSEG
Definition: f2fs_fs.h:762
@ ERROR_MAX
Definition: f2fs_fs.h:768
@ ERROR_INVALID_BLKADDR
Definition: f2fs_fs.h:753
@ ERROR_CORRUPTED_VERITY_XATTR
Definition: f2fs_fs.h:764
@ ERROR_INCONSISTENT_SUM_TYPE
Definition: f2fs_fs.h:758
@ ERROR_INCONSISTENT_SIT
Definition: f2fs_fs.h:763
@ ERROR_INCONSISTENT_NODE_COUNT
Definition: f2fs_fs.h:760
@ ERROR_CORRUPTED_XATTR
Definition: f2fs_fs.h:765
@ ERROR_CORRUPTED_INODE
Definition: f2fs_fs.h:755
@ ERROR_CORRUPTED_JOURNAL
Definition: f2fs_fs.h:759
@ ERROR_INCONSISTENT_NAT
Definition: f2fs_fs.h:767
@ ERROR_INCONSISTENT_SUMMARY
Definition: f2fs_fs.h:756
@ ERROR_FAIL_DECOMPRESSION
Definition: f2fs_fs.h:752
@ ERROR_CORRUPTED_CLUSTER
Definition: f2fs_fs.h:751
@ ERROR_INCONSISTENT_BLOCK_COUNT
Definition: f2fs_fs.h:761
int f2fs_fsync_device(void)
Definition: libf2fs_io.c:737
int f2fs_reset_zones(int)
Definition: libf2fs_zoned.c:620
u64 f2fs_max_file_offset(struct f2fs_inode *)
Definition: libf2fs.c:530
#define MAX_PATH_LEN
Definition: f2fs_fs.h:411
struct f2fs_checkpoint __attribute__
@ F2FS_FEATURE_NAT_BITS
Definition: f2fs_fs.h:1481
#define max(x, y)
Definition: f2fs_fs.h:611
int f2fs_get_device_info(void)
Definition: libf2fs.c:1284
char * f2fs_encoding2str(const int encoding)
Definition: libf2fs.c:1435
#define COMPRESS_DATA_RESERVED_SIZE
Definition: f2fs_fs.h:146
u32 __u32
Definition: f2fs_fs.h:130
int write_inode(struct f2fs_node *, u64, enum rw_hint)
Definition: libf2fs.c:606
unsigned int calc_extra_isize(void)
Definition: libf2fs.c:1381
int f2fs_finish_zone(int i, void *blkzone)
#define F2FS_MAX_EXTENSION
Definition: f2fs_fs.h:658
uint16_t u16
Definition: f2fs_fs.h:120
#define F2FS_INLINE_XATTR
Definition: f2fs_fs.h:963
u16 __le16
Definition: f2fs_fs.h:132
int f2fs_dev_is_writable(void)
Definition: libf2fs.c:724
static void f2fs_init_inode(struct f2fs_super_block *sb, struct f2fs_node *raw_node, nid_t ino, time_t mtime, mode_t mode)
Definition: f2fs_fs.h:1946
int f2fs_test_bit(unsigned int, const char *)
Definition: libf2fs.c:314
#define F2FS_DEF_PROJID
Definition: f2fs_fs.h:977
int test_bit_le(u32, const u8 *)
Definition: libf2fs.c:309
static int exist_qf_ino(struct f2fs_super_block *sb)
Definition: f2fs_fs.h:1917
#define NAT_JOURNAL_RESERVED
Definition: f2fs_fs.h:1255
int f2fs_set_bit(unsigned int, char *)
Definition: libf2fs.c:324
int f2fs_clear_bit(unsigned int, char *)
Definition: libf2fs.c:336
struct nat_journal nat_j
Definition: f2fs_fs.h:6
int() report_zones_cb_t(int i, void *, void *)
Definition: f2fs_fs.h:1840
filter_policy
Definition: f2fs_fs.h:494
@ COMPR_FILTER_UNASSIGNED
Definition: f2fs_fs.h:495
@ COMPR_FILTER_DENY
Definition: f2fs_fs.h:497
@ COMPR_FILTER_ALLOW
Definition: f2fs_fs.h:496
static __le64 get_cp_crc(struct f2fs_checkpoint *cp)
Definition: f2fs_fs.h:1906
#define F2FS_FEATURE_INODE_CRTIME
Definition: f2fs_fs.h:710
#define cpu_to_le16(x)
Definition: f2fs_fs.h:226
unsigned int addrs_per_page(struct f2fs_inode *, bool)
Definition: libf2fs.c:519
#define F2FS_INLINE_DENTRY
Definition: f2fs_fs.h:965
__le32 ino
Definition: f2fs_fs.h:1
__le32 segment_count_main
Definition: f2fs_fs.h:18
#define NAT_ENTRY_PER_BLOCK
Definition: f2fs_fs.h:1136
int f2fs_dev_is_umounted(char *)
Definition: libf2fs.c:753
static double get_best_overprovision(struct f2fs_super_block *sb)
Definition: f2fs_fs.h:1874
static uint32_t get_reserved(struct f2fs_super_block *sb, double ovp)
Definition: f2fs_fs.h:1853
u64 __u64
Definition: f2fs_fs.h:131
u16 __be16
Definition: f2fs_fs.h:135
int f2fs_finalize_device(void)
Definition: libf2fs_io.c:822
uint32_t u32
Definition: f2fs_fs.h:119
int f2fs_get_zone_blocks(int)
Definition: libf2fs_zoned.c:596
f2fs_config_func
Definition: f2fs_fs.h:435
@ MKFS
Definition: f2fs_fs.h:436
@ LABEL
Definition: f2fs_fs.h:442
@ FSCK
Definition: f2fs_fs.h:437
@ SLOAD
Definition: f2fs_fs.h:441
@ DEFRAG
Definition: f2fs_fs.h:439
@ INJECT
Definition: f2fs_fs.h:443
@ DUMP
Definition: f2fs_fs.h:438
@ RESIZE
Definition: f2fs_fs.h:440
int capacity()
Definition: health.cpp:66
BinOp< T1, T2, Numeric, Sub > sub
Definition: utils.h:265
BinOp< T1, T2, Numeric, Add > add
Definition: utils.h:264
constexpr const char * str
Definition: utils.h:180
__u32 mask
Definition: nl80211.h:0
uint8_t type
Definition: pairing_connection.h:0
Definition: f2fs_fs.h:506
bool required
Definition: f2fs_fs.h:508
compress_ops * ops
Definition: f2fs_fs.h:512
enum filter_policy filter
Definition: f2fs_fs.h:514
filter_ops * filter_ops
Definition: f2fs_fs.h:515
unsigned int min_blocks
Definition: f2fs_fs.h:513
bool enabled
Definition: f2fs_fs.h:507
enum compress_algorithms alg
Definition: f2fs_fs.h:511
bool readonly
Definition: f2fs_fs.h:509
Definition: f2fs_fs.h:155
struct compress_data * cbuf
Definition: f2fs_fs.h:159
size_t rlen
Definition: f2fs_fs.h:160
size_t clen
Definition: f2fs_fs.h:161
unsigned int log_cluster_size
Definition: f2fs_fs.h:157
unsigned int cluster_size
Definition: f2fs_fs.h:156
void * rbuf
Definition: f2fs_fs.h:158
Definition: f2fs_fs.h:147
__le32 chksum
Definition: f2fs_fs.h:149
__le32 reserved[COMPRESS_DATA_RESERVED_SIZE]
Definition: f2fs_fs.h:150
u8 cdata[]
Definition: f2fs_fs.h:151
__le32 clen
Definition: f2fs_fs.h:148
Definition: f2fs_fs.h:481
Definition: f2fs_fs.h:470
bool dbg_en
Definition: f2fs_fs.h:477
long num_cache_entry
Definition: f2fs_fs.h:472
unsigned max_hash_collision
Definition: f2fs_fs.h:475
Definition: f2fs_fs.h:451
size_t zone_blocks
Definition: f2fs_fs.h:465
uint32_t nr_zones
Definition: f2fs_fs.h:463
int32_t fd
Definition: f2fs_fs.h:453
uint32_t total_segments
Definition: f2fs_fs.h:458
uint32_t nr_rnd_zones
Definition: f2fs_fs.h:464
uint64_t end_blkaddr
Definition: f2fs_fs.h:457
int zoned_model
Definition: f2fs_fs.h:462
char * alias_filename
Definition: f2fs_fs.h:459
uint64_t zone_size
Definition: f2fs_fs.h:466
size_t * zone_cap_blocks
Definition: f2fs_fs.h:467
char * path
Definition: f2fs_fs.h:452
uint64_t start_blkaddr
Definition: f2fs_fs.h:456
uint32_t sector_size
Definition: f2fs_fs.h:454
uint64_t total_sectors
Definition: f2fs_fs.h:455
Definition: f2fs_fs.h:1097
__le32 addr[0]
Definition: f2fs_fs.h:1098
Definition: f2fs_fs.h:845
__le32 cp_pack_start_sum
Definition: f2fs_fs.h:861
__le32 next_free_nid
Definition: f2fs_fs.h:864
__le64 user_block_count
Definition: f2fs_fs.h:847
__le32 rsvd_segment_count
Definition: f2fs_fs.h:849
__le32 valid_node_count
Definition: f2fs_fs.h:862
unsigned char sit_nat_version_bitmap[]
Definition: f2fs_fs.h:873
__le64 elapsed_time
Definition: f2fs_fs.h:868
__le64 checkpoint_ver
Definition: f2fs_fs.h:846
__le32 cur_node_segno[MAX_ACTIVE_NODE_LOGS]
Definition: f2fs_fs.h:854
__le32 free_segment_count
Definition: f2fs_fs.h:851
__le32 sit_ver_bitmap_bytesize
Definition: f2fs_fs.h:865
__le32 cp_pack_total_block_count
Definition: f2fs_fs.h:860
unsigned char alloc_type[MAX_ACTIVE_LOGS]
Definition: f2fs_fs.h:870
__le64 valid_block_count
Definition: f2fs_fs.h:848
__le16 cur_node_blkoff[MAX_ACTIVE_NODE_LOGS]
Definition: f2fs_fs.h:855
__le32 cur_data_segno[MAX_ACTIVE_DATA_LOGS]
Definition: f2fs_fs.h:857
__le32 overprov_segment_count
Definition: f2fs_fs.h:850
__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
__le16 cur_data_blkoff[MAX_ACTIVE_DATA_LOGS]
Definition: f2fs_fs.h:858
__le32 valid_inode_count
Definition: f2fs_fs.h:863
Definition: f2fs_fs.h:1014
u32 cheader_pgofs
Definition: f2fs_fs.h:1022
u32 cnt
Definition: f2fs_fs.h:1016
Definition: f2fs_fs.h:1519
uint32_t new_reserved_segments
Definition: f2fs_fs.h:1522
uint32_t next_free_nid
Definition: f2fs_fs.h:1599
int layout
Definition: f2fs_fs.h:1576
uint32_t chksum_seed
Definition: f2fs_fs.h:1631
int dry_run
Definition: f2fs_fs.h:1564
uint32_t cur_seg[NR_CURSEG_TYPE]
Definition: f2fs_fs.h:1529
int func
Definition: f2fs_fs.h:1562
int dump_sym_target_len
Definition: f2fs_fs.h:1553
uint64_t wanted_total_sectors
Definition: f2fs_fs.h:1538
bool need_fsync
Definition: f2fs_fs.h:1591
time_t fixed_time
Definition: f2fs_fs.h:1589
int fix_on
Definition: f2fs_fs.h:1566
int nolinear_lookup
Definition: f2fs_fs.h:1585
uint16_t s_encoding_flags
Definition: f2fs_fs.h:1549
uint32_t segs_per_sec
Definition: f2fs_fs.h:1530
char nat_bytes[F2FS_MAX_BLKSIZE]
Definition: f2fs_fs.h:1647
int show_file_map
Definition: f2fs_fs.h:1577
int whint
Definition: f2fs_fs.h:1593
int alloc_failed
Definition: f2fs_fs.h:1574
uint32_t reserved_segments
Definition: f2fs_fs.h:1521
const char * rootdev_name
Definition: f2fs_fs.h:1557
dev_cache_config_t cache_config
Definition: f2fs_fs.h:1634
uint32_t total_segments
Definition: f2fs_fs.h:1534
char * extension_list[2]
Definition: f2fs_fs.h:1556
compress_config_t compress
Definition: f2fs_fs.h:1637
unsigned int invalid_sb
Definition: f2fs_fs.h:1571
char * vol_uuid
Definition: f2fs_fs.h:1547
struct f2fs_journal nat_jnl
Definition: f2fs_fs.h:1646
double new_overprovision
Definition: f2fs_fs.h:1528
__u8 version[VERSION_LEN+1]
Definition: f2fs_fs.h:1545
char * from_dir
Definition: f2fs_fs.h:1614
char * vol_label
Definition: f2fs_fs.h:1546
char sit_bytes[F2FS_MAX_BLKSIZE]
Definition: f2fs_fs.h:1643
uint32_t blksize
Definition: f2fs_fs.h:1604
int ro
Definition: f2fs_fs.h:1581
uint64_t defrag_target
Definition: f2fs_fs.h:1611
int bug_nat_bits
Definition: f2fs_fs.h:1572
int32_t dump_fd
Definition: f2fs_fs.h:1551
struct device_info devices[MAX_DEVICES]
Definition: f2fs_fs.h:1554
int fix_chksum
Definition: f2fs_fs.h:1584
unsigned int feature
Definition: f2fs_fs.h:1586
uint32_t root_uid
Definition: f2fs_fs.h:1602
uint32_t first_alias_ino
Definition: f2fs_fs.h:1601
int sparse_mode
Definition: f2fs_fs.h:1523
unsigned int disabled_feature
Definition: f2fs_fs.h:1587
bool need_whint
Definition: f2fs_fs.h:1592
struct f2fs_summary sum[NR_CURSEG_TYPE][MAX_CACHE_SUMS]
Definition: f2fs_fs.h:1640
uint32_t sectors_per_blk
Definition: f2fs_fs.h:1541
uint32_t start_sector
Definition: f2fs_fs.h:1533
int show_dentry
Definition: f2fs_fs.h:1559
int aliased_devices
Definition: f2fs_fs.h:1594
int32_t kd
Definition: f2fs_fs.h:1550
uint32_t secs_per_zone
Definition: f2fs_fs.h:1531
uint16_t s_encoding
Definition: f2fs_fs.h:1548
uint32_t lpf_ino
Definition: f2fs_fs.h:1600
int force
Definition: f2fs_fs.h:1567
int trimmed
Definition: f2fs_fs.h:1561
uint64_t defrag_len
Definition: f2fs_fs.h:1610
int zoned_mode
Definition: f2fs_fs.h:1524
bool quota_fixed
Definition: f2fs_fs.h:1573
uint32_t sector_size
Definition: f2fs_fs.h:1535
__u8 sb_version[VERSION_LEN+1]
Definition: f2fs_fs.h:1544
double overprovision
Definition: f2fs_fs.h:1527
int bug_on
Definition: f2fs_fs.h:1570
uint32_t segs_per_zone
Definition: f2fs_fs.h:1532
char * dump_symlink
Definition: f2fs_fs.h:1552
int defset
Definition: f2fs_fs.h:1569
struct f2fs_fault_info fault_info
Definition: f2fs_fs.h:1651
char * fs_config_file
Definition: f2fs_fs.h:1617
uint32_t blks_per_seg
Definition: f2fs_fs.h:1542
int preserve_limits
Definition: f2fs_fs.h:1582
int ndevs
Definition: f2fs_fs.h:1555
struct f2fs_journal sit_jnl
Definition: f2fs_fs.h:1642
uint32_t blksize_bits
Definition: f2fs_fs.h:1605
size_t zone_blocks
Definition: f2fs_fs.h:1526
u64 show_file_map_max_offset
Definition: f2fs_fs.h:1578
int large_nat_bitmap
Definition: f2fs_fs.h:1583
int preserve_symlinks
Definition: f2fs_fs.h:1625
__u8 init_version[VERSION_LEN+1]
Definition: f2fs_fs.h:1543
int roll_forward
Definition: f2fs_fs.h:1590
uint64_t total_sectors
Definition: f2fs_fs.h:1537
int preen_mode
Definition: f2fs_fs.h:1580
uint32_t root_gid
Definition: f2fs_fs.h:1603
int fake_seed
Definition: f2fs_fs.h:1598
char * mount_point
Definition: f2fs_fs.h:1615
unsigned int quota_bits
Definition: f2fs_fs.h:1588
char * target_out_dir
Definition: f2fs_fs.h:1616
uint32_t conf_reserved_sections
Definition: f2fs_fs.h:1520
int ignore_error
Definition: f2fs_fs.h:1568
int trim
Definition: f2fs_fs.h:1560
uint64_t target_sectors
Definition: f2fs_fs.h:1540
uint32_t aliased_segments
Definition: f2fs_fs.h:1595
int quota_fix
Definition: f2fs_fs.h:1579
uint64_t device_size
Definition: f2fs_fs.h:1536
int auto_fix
Definition: f2fs_fs.h:1575
uint64_t wanted_sector_size
Definition: f2fs_fs.h:1539
int preserve_perms
Definition: f2fs_fs.h:1624
int zoned_model
Definition: f2fs_fs.h:1525
int safe_resize
Definition: f2fs_fs.h:1628
int defrag_shrink
Definition: f2fs_fs.h:1608
int no_kernel_check
Definition: f2fs_fs.h:1565
uint64_t defrag_start
Definition: f2fs_fs.h:1609
block_t curseg_offset[NR_CURSEG_TYPE]
Definition: f2fs_fs.h:1639
int dbg_lv
Definition: f2fs_fs.h:1558
Definition: f2fs_fs.h:1405
__u8 dentry_bitmap[0]
Definition: f2fs_fs.h:1407
Definition: f2fs_fs.h:726
__le32 total_segments
Definition: f2fs_fs.h:728
__u8 path[MAX_PATH_LEN]
Definition: f2fs_fs.h:727
Definition: f2fs_fs.h:1386
__u8 file_type
Definition: f2fs_fs.h:1390
__le16 name_len
Definition: f2fs_fs.h:1389
__le32 ino
Definition: f2fs_fs.h:1388
__le32 hash_code
Definition: f2fs_fs.h:1387
Definition: f2fs_fs.h:916
__le32 blk_addr
Definition: f2fs_fs.h:918
__le32 len
Definition: f2fs_fs.h:919
__le32 fofs
Definition: f2fs_fs.h:917
Definition: f2fs_fs.h:1314
__u8 reserved[0]
Definition: f2fs_fs.h:1316
__le64 kbytes_written
Definition: f2fs_fs.h:1315
Definition: f2fs_fs.h:1509
int inject_rate
Definition: f2fs_fs.h:1511
unsigned int fault_cnt[FAULT_MAX]
Definition: f2fs_fs.h:1513
unsigned int inject_type
Definition: f2fs_fs.h:1512
int inject_ops
Definition: f2fs_fs.h:1510
Definition: f2fs_fs.h:1086
__le32 i_nid[5]
Definition: f2fs_fs.h:1087
Definition: f2fs_fs.h:1034
__u8 i_name[F2FS_NAME_LEN]
Definition: f2fs_fs.h:1061
__le32 i_extra_end[0]
Definition: f2fs_fs.h:1081
__le32 i_atime_nsec
Definition: f2fs_fs.h:1046
__le16 i_gc_failures
Definition: f2fs_fs.h:1052
struct f2fs_extent i_ext __attribute__((packed))
__le64 i_crtime
Definition: f2fs_fs.h:1072
__le32 i_namelen
Definition: f2fs_fs.h:1060
__le32 i_crtime_nsec
Definition: f2fs_fs.h:1073
__le16 i_extra_isize
Definition: f2fs_fs.h:1068
__le64 i_mtime
Definition: f2fs_fs.h:1045
__le64 i_atime
Definition: f2fs_fs.h:1043
__le64 i_compr_blocks
Definition: f2fs_fs.h:1074
__le16 i_compress_flag
Definition: f2fs_fs.h:1077
__le32 i_inode_checksum
Definition: f2fs_fs.h:1071
__u8 i_advise
Definition: f2fs_fs.h:1036
__le32 i_addr[0]
Definition: f2fs_fs.h:1083
__le64 i_blocks
Definition: f2fs_fs.h:1042
__le32 i_flags
Definition: f2fs_fs.h:1058
__le32 i_uid
Definition: f2fs_fs.h:1038
__u8 i_dir_level
Definition: f2fs_fs.h:1062
__le64 i_ctime
Definition: f2fs_fs.h:1044
__le32 i_current_depth
Definition: f2fs_fs.h:1051
__u8 i_log_cluster_size
Definition: f2fs_fs.h:1076
__le32 i_generation
Definition: f2fs_fs.h:1049
__le32 i_links
Definition: f2fs_fs.h:1040
__le16 i_mode
Definition: f2fs_fs.h:1035
__le32 i_ctime_nsec
Definition: f2fs_fs.h:1047
__u8 i_inline
Definition: f2fs_fs.h:1037
__u8 i_compress_algorithm
Definition: f2fs_fs.h:1075
__le32 i_mtime_nsec
Definition: f2fs_fs.h:1048
__le16 i_inline_xattr_size
Definition: f2fs_fs.h:1069
__le32 i_pino
Definition: f2fs_fs.h:1059
__le32 i_gid
Definition: f2fs_fs.h:1039
__le32 i_xattr_nid
Definition: f2fs_fs.h:1057
__le32 i_projid
Definition: f2fs_fs.h:1070
__le64 i_size
Definition: f2fs_fs.h:1041
Definition: f2fs_fs.h:1322
struct sit_journal sit_j
Definition: f2fs_fs.h:1330
__le16 n_nats
Definition: f2fs_fs.h:1324
__le16 n_sits
Definition: f2fs_fs.h:1325
struct nat_journal nat_j
Definition: f2fs_fs.h:1329
struct f2fs_extra_info info
Definition: f2fs_fs.h:1331
Definition: f2fs_fs.h:1149
struct f2fs_nat_entry entries[0]
Definition: f2fs_fs.h:1150
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_fs.h:2118
int(* casefold)(const struct f2fs_nls_table *charset, const unsigned char *str, size_t len, unsigned char *dest, size_t dlen)
Definition: f2fs_fs.h:2119
Definition: f2fs_fs.h:2113
int version
Definition: f2fs_fs.h:2114
const struct f2fs_nls_ops * ops
Definition: f2fs_fs.h:2115
Definition: f2fs_fs.h:1122
struct f2fs_inode i
Definition: f2fs_fs.h:1125
struct direct_node dn
Definition: f2fs_fs.h:1126
struct indirect_node in
Definition: f2fs_fs.h:1127
Definition: f2fs_fs.h:900
__le32 ino[0]
Definition: f2fs_fs.h:901
Definition: f2fs_fs.h:1202
struct f2fs_sit_entry entries[0]
Definition: f2fs_fs.h:1203
Definition: f2fs_fs.h:1190
__le16 vblocks
Definition: f2fs_fs.h:1191
__u8 valid_map[SIT_VBLOCK_MAP_SIZE]
Definition: f2fs_fs.h:1192
__le64 mtime
Definition: f2fs_fs.h:1193
Definition: f2fs_fs.h:1345
struct f2fs_summary entries[0]
Definition: f2fs_fs.h:1346
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
__u8 reserved[3]
Definition: f2fs_fs.h:1230
Definition: f2fs_fs.h:773
__le32 secs_per_zone
Definition: f2fs_fs.h:782
__le32 segs_per_sec
Definition: f2fs_fs.h:781
__le32 cp_blkaddr
Definition: f2fs_fs.h:794
__le32 root_ino
Definition: f2fs_fs.h:799
__u8 extension_list[F2FS_MAX_EXTENSION][8]
Definition: f2fs_fs.h:805
__u8 s_stop_reason[MAX_STOP_REASON]
Definition: f2fs_fs.h:817
__le32 segment_count_ckpt
Definition: f2fs_fs.h:788
__le32 extension_count
Definition: f2fs_fs.h:804
__le32 cp_payload
Definition: f2fs_fs.h:806
__le16 volume_name[MAX_VOLUME_NAME]
Definition: f2fs_fs.h:803
__le32 log_blocksize
Definition: f2fs_fs.h:779
__le32 magic
Definition: f2fs_fs.h:774
__le16 minor_ver
Definition: f2fs_fs.h:776
__le32 feature
Definition: f2fs_fs.h:809
__le32 segment_count_main
Definition: f2fs_fs.h:792
__le32 main_blkaddr
Definition: f2fs_fs.h:798
__le16 s_encoding
Definition: f2fs_fs.h:815
__le32 checksum_offset
Definition: f2fs_fs.h:783
__u8 init_version[VERSION_LEN]
Definition: f2fs_fs.h:808
__le32 nat_blkaddr
Definition: f2fs_fs.h:796
__u8 s_errors[MAX_F2FS_ERRORS]
Definition: f2fs_fs.h:818
__le16 s_encoding_flags
Definition: f2fs_fs.h:816
__le32 meta_ino
Definition: f2fs_fs.h:801
__le32 segment_count_nat
Definition: f2fs_fs.h:790
__le32 log_sectors_per_block
Definition: f2fs_fs.h:778
__le32 log_sectorsize
Definition: f2fs_fs.h:777
__le32 qf_ino[F2FS_MAX_QUOTAS] __attribute__((packed))
__u8 reserved[258]
Definition: f2fs_fs.h:819
__le32 segment_count
Definition: f2fs_fs.h:787
__u8 version[VERSION_LEN]
Definition: f2fs_fs.h:807
__le32 ssa_blkaddr
Definition: f2fs_fs.h:797
__le32 log_blocks_per_seg
Definition: f2fs_fs.h:780
__le32 crc
Definition: f2fs_fs.h:820
__u8 encryption_level
Definition: f2fs_fs.h:810
__le32 node_ino
Definition: f2fs_fs.h:800
__le32 segment0_blkaddr
Definition: f2fs_fs.h:793
__u8 hot_ext_count
Definition: f2fs_fs.h:814
__le32 section_count
Definition: f2fs_fs.h:786
__le16 major_ver
Definition: f2fs_fs.h:775
__le32 segment_count_ssa
Definition: f2fs_fs.h:791
__u8 encrypt_pw_salt[16]
Definition: f2fs_fs.h:811
__le32 segment_count_sit
Definition: f2fs_fs.h:789
__u8 uuid[16]
Definition: f2fs_fs.h:802
__le64 block_count __attribute__((packed))
__le32 sit_blkaddr
Definition: f2fs_fs.h:795
Definition: f2fs_fs.h:1999
u32 mask
Definition: f2fs_fs.h:2001
u32 settable
Definition: f2fs_fs.h:2002
char * name
Definition: f2fs_fs.h:2000
Definition: f2fs_fs.h:500
Definition: f2fs_fs.h:1101
__le32 nid[0]
Definition: f2fs_fs.h:1102
Definition: f2fs_fs.h:1277
__le32 nid
Definition: f2fs_fs.h:1278
struct f2fs_nat_entry ne
Definition: f2fs_fs.h:1279
Definition: f2fs_fs.h:1289
struct nat_journal_entry entries[0]
Definition: f2fs_fs.h:1290
Definition: f2fs_fs.h:1293
struct f2fs_sit_entry se
Definition: f2fs_fs.h:1295
__le32 segno
Definition: f2fs_fs.h:1294
Definition: f2fs_fs.h:1305
struct sit_journal_entry entries[0]
Definition: f2fs_fs.h:1306