On 2026/2/16 19:28, Yongpeng Yang wrote:
From: Yongpeng Yang <[email protected]>
After the device is mounted, f2fs updates on-disk metadata without
updating the block device page cache. As a result, f2fs-tools may read
stale metadata from the page cache.
For example:
mount /dev/vdb /mnt/f2fs
touch mx // ino = 4
sync
dump.f2fs -i 4 /dev/vdb
touch mx2 // ino = 5
sync
dump.f2fs -i 5 /dev/vdb // block addr is 0
Actually, it will be better to wait for /mnt/f2fs being umounted first and then
call dump.f2fs, as if there are two users on the device, we can not guarantee
dump.f2fs can always flush and clean up all cache while another user continue
to update the data via /mnt/f2fs mount point.
Thanks,
Since `dump.f2fs -i 4 /dev/vdb` has already populated the metadata area
into the block device page cache, the cached pages remain resident in
memory. After creating mx2, the page cache is not updated accordingly.
Therefore, `dump.f2fs -i 5 /dev/vdb` reads stale metadata, and the
physical block address of inode 5 is incorrectly reported as 0.
This patch issues a BLKFLSBUF ioctl to the block device before reading
metadata. The kernel then invalidates the block device page cache,
ensuring that subsequent reads fetch uptodate metadata from disk.
Signed-off-by: Yongpeng Yang <[email protected]>
---
lib/libf2fs.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 1a496b7..31b5924 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -1027,6 +1027,7 @@ int get_device_info(int i)
}
dev->fd = fd;
+ ioctl(fd, BLKFLSBUF);
if (c.sparse_mode && i == 0) {
if (f2fs_init_sparse_file()) {
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel