]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
f2fs: fix to avoid changing 'check only' behaior of recovery
authorZhiguo Niu <zhiguo.niu@unisoc.com>
Tue, 21 Jan 2025 02:15:41 +0000 (10:15 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 22 Jan 2025 21:04:56 +0000 (21:04 +0000)
The following two 'check only recovery' processes are very dependent on
the return value of f2fs_recover_fsync_data, especially when the return
value is greater than 0.
1. when device has readonly mode, shown as commit
23738e74472f ("f2fs: fix to restrict mount condition on readonly block device")
2. mount optiont NORECOVERY or DISABLE_ROLL_FORWARD is set, shown as commit
6781eabba1bd ("f2fs: give -EINVAL for norecovery and rw mount")

However, commit c426d99127b1 ("f2fs: Check write pointer consistency of open zones")
will change the return value unexpectedly, thereby changing the caller's behavior

This patch let the f2fs_recover_fsync_data return correct value,and not do
f2fs_check_and_fix_write_pointer when the device is read-only.

Fixes: c426d99127b1 ("f2fs: Check write pointer consistency of open zones")
Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/recovery.c
fs/f2fs/segment.c

index f35be2c48e3c0897dd65b056691b26455cc37e4f..69a2027e3ebcf5841b06c2d629bddca2b49834fe 100644 (file)
@@ -899,10 +899,8 @@ skip:
         * and the f2fs is not read only, check and fix zoned block devices'
         * write pointer consistency.
         */
-       if (!err) {
+       if (!err)
                err = f2fs_check_and_fix_write_pointer(sbi);
-               ret = err;
-       }
 
        if (!err)
                clear_sbi_flag(sbi, SBI_POR_DOING);
index b3a82a8cdc5fd800da361321cc27119c5bba181c..dc1b47f9269a6945dad3b436c2b48e0adba1194e 100644 (file)
@@ -5462,7 +5462,8 @@ int f2fs_check_and_fix_write_pointer(struct f2fs_sb_info *sbi)
 {
        int ret;
 
-       if (!f2fs_sb_has_blkzoned(sbi) || f2fs_readonly(sbi->sb))
+       if (!f2fs_sb_has_blkzoned(sbi) || f2fs_readonly(sbi->sb) ||
+           f2fs_hw_is_readonly(sbi))
                return 0;
 
        f2fs_notice(sbi, "Checking entire write pointers");