f2fs: fix write pointers all the time
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 16 Feb 2024 21:23:30 +0000 (13:23 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 29 Feb 2024 16:34:35 +0000 (08:34 -0800)
Even if the roll forward recovery stopped due to any error, we have to fix
the write pointers in order to mount the disk from the previous checkpoint.

Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/recovery.c
fs/f2fs/super.c

index b3baec666afefd11e6784246b42ea9c8f98670e9..3078d5613748036a75281eea1075775e0527f8cb 100644 (file)
@@ -863,7 +863,6 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
        int ret = 0;
        unsigned long s_flags = sbi->sb->s_flags;
        bool need_writecp = false;
-       bool fix_curseg_write_pointer = false;
 
        if (is_sbi_flag_set(sbi, SBI_IS_WRITABLE))
                f2fs_info(sbi, "recover fsync data on readonly fs");
@@ -894,8 +893,6 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
        else
                f2fs_bug_on(sbi, sbi->sb->s_flags & SB_ACTIVE);
 skip:
-       fix_curseg_write_pointer = !check_only || list_empty(&inode_list);
-
        destroy_fsync_dnodes(&inode_list, err);
        destroy_fsync_dnodes(&tmp_inode_list, err);
 
@@ -913,11 +910,13 @@ skip:
         * and the f2fs is not read only, check and fix zoned block devices'
         * write pointer consistency.
         */
-       if (!err && fix_curseg_write_pointer && !f2fs_readonly(sbi->sb) &&
-                       f2fs_sb_has_blkzoned(sbi)) {
-               err = f2fs_fix_curseg_write_pointer(sbi);
-               if (!err)
-                       err = f2fs_check_write_pointer(sbi);
+       if (f2fs_sb_has_blkzoned(sbi) && !f2fs_readonly(sbi->sb)) {
+               int err2 = f2fs_fix_curseg_write_pointer(sbi);
+
+               if (!err2)
+                       err2 = f2fs_check_write_pointer(sbi);
+               if (err2)
+                       err = err2;
                ret = err;
        }
 
index b36c840b85ae39b33cfa6c6c98699611eb65e883..32c23a0caf04aff20a5e34246560b949a3a2f91a 100644 (file)
@@ -4674,11 +4674,14 @@ reset_checkpoint:
         * If the f2fs is not readonly and fsync data recovery succeeds,
         * check zoned block devices' write pointer consistency.
         */
-       if (!err && !f2fs_readonly(sb) && f2fs_sb_has_blkzoned(sbi)) {
-               err = f2fs_check_write_pointer(sbi);
-               if (err)
-                       goto free_meta;
+       if (f2fs_sb_has_blkzoned(sbi) && !f2fs_readonly(sb)) {
+               int err2 = f2fs_check_write_pointer(sbi);
+
+               if (err2)
+                       err = err2;
        }
+       if (err)
+               goto free_meta;
 
        f2fs_init_inmem_curseg(sbi);