To maximize the utilization of inode space, we introduced the inline tail feature. This feature modifies the inode structure, requiring support from the f2fs tools.
The inode layout /w inline tail: | inode block | 4096 | inline tail enable | | --------------- | ---- | --------------------------| | inode info | 360 | | | --------------- | ---- | --------------------------| | | | extra info | 0~36 | | | | **compact_addr[16] | 64 | | addr table[923] | 3692 | reserved | 4 | | | | **tail data | | | | | inline_xattr | 200 | | --------------- | ---- | --------------------------| | nid table[5] | 20 | | node footer | 24 | Change-Id: I1b7bc47f4567a6b6d433379e80ca1e76d678a104 Signed-off-by: Wu Bo <bo...@vivo.com> --- fsck/fsck.c | 24 ++++++++++++++++-------- fsck/fsck.h | 1 + include/f2fs_fs.h | 14 +++++++++++++- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/fsck/fsck.c b/fsck/fsck.c index a18bee9d0c3b..a794b8661ed7 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -1123,14 +1123,22 @@ check_next: } /* check data blocks in inode */ - addrs = ADDRS_PER_INODE(&node_blk->i); - if (cur_qtype != -1) { - u64 addrs_per_blk = (u64)ADDRS_PER_BLOCK(&node_blk->i); - qf_szchk_type[cur_qtype] = QF_SZCHK_REGFILE; - qf_maxsize[cur_qtype] = (u64)(addrs + 2 * addrs_per_blk + - 2 * addrs_per_blk * NIDS_PER_BLOCK + - addrs_per_blk * NIDS_PER_BLOCK * - NIDS_PER_BLOCK) * F2FS_BLKSIZE; + if (node_blk->i.i_flags & cpu_to_le32(F2FS_INLINE_TAIL)) { + DBG(3, "ino[0x%x] has inline tail data!\n", nid); + child.state |= FSCK_INLINE_TAIL; + addrs = COMPACT_ADDRS_PER_INODE; + if (cur_qtype != -1) + qf_szchk_type[cur_qtype] = QF_SZCHK_INLINE; + } else { + addrs = ADDRS_PER_INODE(&node_blk->i); + if (cur_qtype != -1) { + u64 addrs_per_blk = (u64)ADDRS_PER_BLOCK(&node_blk->i); + qf_szchk_type[cur_qtype] = QF_SZCHK_REGFILE; + qf_maxsize[cur_qtype] = (u64)(addrs + 2 * addrs_per_blk + + 2 * addrs_per_blk * NIDS_PER_BLOCK + + addrs_per_blk * NIDS_PER_BLOCK * + NIDS_PER_BLOCK) * F2FS_BLKSIZE; + } } for (idx = 0; idx < addrs; idx++, child.pgofs++) { block_t blkaddr = le32_to_cpu(node_blk->i.i_addr[ofs + idx]); diff --git a/fsck/fsck.h b/fsck/fsck.h index a8f187e07fe6..db7791ce7016 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -28,6 +28,7 @@ struct quota_ctx; #define FSCK_UNMATCHED_EXTENT 0x00000001 #define FSCK_INLINE_INODE 0x00000002 +#define FSCK_INLINE_TAIL 0x00000004 enum { PREEN_MODE_0, diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 15a1c82ae18f..e7c548ef3c2a 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -666,6 +666,7 @@ enum { #define F2FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ #define F2FS_NOATIME_FL 0x00000080 /* do not update atime */ #define F2FS_CASEFOLD_FL 0x40000000 /* Casefolded file */ +#define F2FS_INLINE_TAIL 0x80000000 /* Has inline tail */ #define F2FS_ENC_UTF8_12_1 1 #define F2FS_ENC_STRICT_MODE_FL (1 << 0) @@ -962,7 +963,7 @@ static_assert(sizeof(struct node_footer) == 24, ""); (DEF_ADDRS_PER_INODE - \ get_inline_xattr_addrs(&node->i) - \ get_extra_isize(node) - \ - DEF_INLINE_RESERVED_SIZE)) + get_reserved_addrs(&node->i))) #define DEF_MAX_INLINE_DATA (sizeof(__le32) * \ (DEF_ADDRS_PER_INODE - \ DEFAULT_INLINE_XATTR_ADDRS - \ @@ -1400,6 +1401,7 @@ struct f2fs_dentry_block { /* for inline stuff */ #define DEF_INLINE_RESERVED_SIZE 1 +#define COMPACT_ADDRS_PER_INODE 16 /* for inline dir */ #define NR_INLINE_DENTRY(node) (MAX_INLINE_DATA(node) * BITS_PER_BYTE / \ @@ -1660,6 +1662,16 @@ static inline int get_inline_xattr_addrs(struct f2fs_inode *inode) return 0; } +static inline int get_reserved_addrs(struct f2fs_inode *inode) +{ + int size = DEF_INLINE_RESERVED_SIZE; + + if (inode->i_flags & cpu_to_le32(F2FS_INLINE_TAIL)) + size += COMPACT_ADDRS_PER_INODE; + + return size; +} + #define get_extra_isize(node) __get_extra_isize(&node->i) #define F2FS_ZONED_NONE 0 -- 2.35.3 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel