[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240529112411.380453-1-shengyong@oppo.com>
Date: Wed, 29 May 2024 19:24:11 +0800
From: Sheng Yong <shengyong@...o.com>
To: jaegeuk@...nel.org,
chao@...nel.org
Cc: linux-f2fs-devel@...ts.sourceforge.net,
linux-kernel@...r.kernel.org,
Sheng Yong <shengyong@...o.com>
Subject: [PATCH] f2fs: avoid resetting non empty zone
If curseg is not the first segment in its zone, the zone is not empty,
and it should not be reset. This issue could be reproduced by:
modprobe null_blk nr_devices=1 zoned=1 zone_max_open=6 zone_max_active=6 zone_size=1024 gb=30
# /dev/vda is 4G
mkfs.f2fs -m -c /dev/nullb0 /dev/vda -f
while :; do
mount /dev/vda /mnt/
dd if=/dev/zero of=/mnt/file bs=4K count=11 conv=fsync status=none
if [ $? -ne 0 ]; then
umount /mnt
break
fi
f2fs_io shutdown 1 /mnt/file
umount /mnt
done
And the error looks like:
[ 123.169852] I/O error, dev nullb0, sector 41951232 op 0x1:(WRITE) flags 0x800 phys_seg 10 prio class 0
[ 123.173070] F2FS-fs (vda): do_checkpoint failed err:-5, stop checkpoint
dd: error writing '/mnt/testfile': Input/output error
Signed-off-by: Sheng Yong <shengyong@...o.com>
---
fs/f2fs/segment.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 4c8836ded90fc..50b38cbe33401 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -5004,7 +5004,8 @@ static int fix_curseg_write_pointer(struct f2fs_sb_info *sbi, int type)
}
/* Allocate a new section if it's not new. */
- if (cs->next_blkoff) {
+ if (cs->next_blkoff ||
+ cs->segno != GET_SEG_FROM_SEC(sbi, GET_ZONE_FROM_SEC(sbi, cs_section))) {
unsigned int old_segno = cs->segno, old_blkoff = cs->next_blkoff;
f2fs_allocate_new_section(sbi, type, true);
--
2.40.1
Powered by blists - more mailing lists