]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/f2fs/recovery.c
Merge tag 'audit-pr-20200226' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoor...
[linux.git] / fs / f2fs / recovery.c
index 76477f71d4ee9b82123aab7d72ed9f3a0c05e2a1..763d5c0951d1c063baabcba3e0587ad7293c2bee 100644 (file)
@@ -723,6 +723,7 @@ 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;
 #ifdef CONFIG_QUOTA
        int quota_enabled;
 #endif
@@ -774,6 +775,8 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
                sbi->sb->s_flags = s_flags;
        }
 skip:
+       fix_curseg_write_pointer = !check_only || list_empty(&inode_list);
+
        destroy_fsync_dnodes(&inode_list, err);
        destroy_fsync_dnodes(&tmp_inode_list, err);
 
@@ -784,9 +787,22 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
        if (err) {
                truncate_inode_pages_final(NODE_MAPPING(sbi));
                truncate_inode_pages_final(META_MAPPING(sbi));
-       } else {
-               clear_sbi_flag(sbi, SBI_POR_DOING);
        }
+
+       /*
+        * If fsync data succeeds or there is no fsync data to recover,
+        * 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);
+               ret = err;
+       }
+
+       if (!err)
+               clear_sbi_flag(sbi, SBI_POR_DOING);
+
        mutex_unlock(&sbi->cp_mutex);
 
        /* let's drop all the directory inodes for clean checkpoint */