lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-Id: <20240903075931.3339584-1-bo.wu@vivo.com>
Date: Tue,  3 Sep 2024 01:59:31 -0600
From: Wu Bo <bo.wu@...o.com>
To: linux-kernel@...r.kernel.org
Cc: Jaegeuk Kim <jaegeuk@...nel.org>,
	Chao Yu <chao@...nel.org>,
	linux-f2fs-devel@...ts.sourceforge.net,
	Wu Bo <wubo.oduw@...il.com>,
	Wu Bo <bo.wu@...o.com>
Subject: [PATCH] f2fs-tools: support inline tail

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.wu@...o.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


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ