All of lore.kernel.org
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH] fsck.f2fs: support to repair corrupted i_links
@ 2025-02-25  4:27 Chao Yu via Linux-f2fs-devel
  0 siblings, 0 replies; only message in thread
From: Chao Yu via Linux-f2fs-devel @ 2025-02-25  4:27 UTC (permalink / raw)
  To: jaegeuk; +Cc: linux-f2fs-devel

Previous, fsck.f2fs only support i_links check and repair for orphan
and directory inode, this patch starts to check and repair i_links for
char, block, fifo, sock, symlink and regular inode.

Tested w/ below testcase:

dev=/dev/vda
mp=/mnt/f2fs
for ((i=0;i<8;i++)) do
	mkfs.f2fs -f $dev
	mount $dev $mp
	cd $mp

	if [ $i == 0 ]; then
		touch file
		nlink=0
	elif [ $i == 1 ]; then
		mkdir dir
		nlink=1
	elif [ $i == 2 ]; then
		mknod charactor c 9 0
		nlink=0
	elif [ $i == 3 ]; then
		mknod blockdev b 8 0
		nlink=0
	elif [ $i == 4 ]; then
		mkfifo pipe
		nlink=0
	elif [ $i == 5 ]; then
		socket -s $mp/sock & fuser -k $mp/sock
		nlink=0
	elif [ $i == 6 ]; then
		ln -s file symlink
		nlink=0
	elif [ $i == 7 ]; then
		touch atomic
		f2fs_io write 1 0 1 zero atomic_commit ./atomic 2000 &
		rm atomic
		sync
		f2fs_io shutdown 2 ./
		nlink=1
		sleep 2
	fi

	cd ~/
	umount $mp

	inject.f2fs --node --mb i_links --nid 4 --val $nlink $dev

	fsck.f2fs -f $dev
	fsck.f2fs $dev
done

Signed-off-by: Chao Yu <chao@kernel.org>
---
 fsck/fsck.c | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/fsck/fsck.c b/fsck/fsck.c
index ef9662b..ce88cfe 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -902,7 +902,9 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
 	int need_fix = 0;
 	int ret;
 	u32 cluster_size = 1 << node_blk->i.i_log_cluster_size;
+	u32 target_links;
 	bool is_aliasing = IS_DEVICE_ALIASING(&node_blk->i);
+	bool corrupted_nlink = false;
 
 	if (!compressed)
 		goto check_next;
@@ -1413,14 +1415,33 @@ skip_dot_fix:
 					nid, (unsigned long)F2FS_BLKSIZE);
 	}
 
-	if (ftype == F2FS_FT_ORPHAN && i_links) {
-		ASSERT_MSG("ino: 0x%x is orphan inode, but has i_links: %u",
-				nid, i_links);
+	if (ftype == F2FS_FT_ORPHAN) {
+		if (i_links) {
+			corrupted_nlink = true;
+			target_links = 0;
+		}
+	} else if (ftype == F2FS_FT_CHRDEV || ftype == F2FS_FT_BLKDEV ||
+			ftype == F2FS_FT_FIFO || ftype == F2FS_FT_SOCK ||
+			ftype == F2FS_FT_SYMLINK) {
+		if (i_links != 1) {
+			corrupted_nlink = true;
+			target_links = 1;
+		}
+	} else if (ftype == F2FS_FT_REG_FILE) {
+		if (i_links == 0) {
+			corrupted_nlink = true;
+			target_links = 1;
+		}
+	}
+
+	if (corrupted_nlink) {
+		ASSERT_MSG("ino: 0x%x ftype: %d has i_links: %u",
+					nid, ftype, i_links);
 		if (c.fix_on) {
-			node_blk->i.i_links = 0;
+			node_blk->i.i_links = cpu_to_le32(target_links);
 			need_fix = 1;
-			FIX_MSG("ino: 0x%x orphan_inode, i_links= 0x%x -> 0",
-					nid, i_links);
+			FIX_MSG("ino: 0x%x ftype: %d fix i_links: %u -> %u",
+				nid, ftype, i_links, target_links);
 		}
 	}
 
-- 
2.48.1.658.g4767266eb4-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2025-02-25  4:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-25  4:27 [f2fs-dev] [PATCH] fsck.f2fs: support to repair corrupted i_links Chao Yu via Linux-f2fs-devel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.