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>] [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

Powered by Openwall GNU/*/Linux Powered by OpenVZ