On 2026/3/12 11:56, Yongpeng Yang wrote:
On 3/12/26 08:49, Chao Yu via Linux-f2fs-devel wrote:On 2026/2/16 19:27, Yongpeng Yang wrote:From: Yongpeng Yang <[email protected]> Neither F2FS nor VFS invalidates the block device page cache, which results in reading stale metadata. An example scenario is shown below: Terminal A Terminal B mount /dev/vdb /mnt/f2fs touch mx // ino = 4 sync dump.f2fs -i 4 /dev/vdb// block on "[Y/N]" touch mx2 // ino = 5 sync umount /mnt/f2fs dump.f2fs -i 5 /dev/vdb // block addr is 0 After umount, the block device page cache is not purged, causing `dump.f2fs -i 5 /dev/vdb` to read stale metadata and see inode 5 with block address 0. This patch calls invalidate_bdev during umount to invalidate the block device page cache, preventing stale metadata from being read. Signed-off-by: Yongpeng Yang <[email protected]> --- fs/f2fs/super.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 1a755997aff5..39d3b52ceac1 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2091,6 +2091,12 @@ static void f2fs_put_super(struct super_block *sb) #if IS_ENABLED(CONFIG_UNICODE) utf8_unload(sb->s_encoding); #endif + sync_blockdev(sb->s_bdev);We will call sync_blockdev in below path? - kill_f2fs_super - kill_block_super - generic_shutdown_super - put_super - sync_blockdev 1721 void kill_block_super(struct super_block *sb) 1722 { 1723 struct block_device *bdev = sb->s_bdev; 1724 1725 generic_shutdown_super(sb); 1726 if (bdev) { 1727 sync_blockdev(bdev); 1728 bdev_fput(sb->s_bdev_file); 1729 } 1730 }+ invalidate_bdev(sb->s_bdev);This works for an f2fs instance mounted on a single device, but it does not work for multi-device configurations, because the vfs cannot be aware of FDEV(1).
Yeah, I meant we can avoid duplicated sync_blockdev() for main device in f2fs_put_super().
I guess we can leave the device w/ uptodate cache, in case if there are multiple user on the device?The page cache of the block device file may contain data that is not uptodate. For example, data may first be read directly through the block
> device file, and then the same blocks may be written through f2fs. Since> f2fs writes to the block device via the submit_bio path, it does not
update the page cache of the block device file. As a result, the data in the block device file’s page cache may become stale. Therefore, the page cache must be invalidated during unmount.
Well, can we call ioctl(fd, BLKFLSBUF) for all devices belong to f2fs img like
you did in ("f2fs-tools: invalidate block device page cache before reading
metadata"), does that fix the issue?
Thanks,
Thanks Yongpeng,Thanks,+ for (i = 1; i < sbi->s_ndevs; i++) { + sync_blockdev(FDEV(i).bdev); + invalidate_bdev(FDEV(i).bdev); + } } int f2fs_sync_fs(struct super_block *sb, int sync)_______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
_______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
