Merge tag 'f2fs-for-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[linux-block.git] / fs / f2fs / super.c
index 64d3556d61a55440027990068fd72f0baa0791c7..fbaaabbcd6de7aec74e20eb5940c762b76c918d6 100644 (file)
@@ -1288,19 +1288,18 @@ default_check:
         * zone alignment optimization. This is optional for host-aware
         * devices, but mandatory for host-managed zoned block devices.
         */
-#ifndef CONFIG_BLK_DEV_ZONED
-       if (f2fs_sb_has_blkzoned(sbi)) {
-               f2fs_err(sbi, "Zoned block device support is not enabled");
-               return -EINVAL;
-       }
-#endif
        if (f2fs_sb_has_blkzoned(sbi)) {
+#ifdef CONFIG_BLK_DEV_ZONED
                if (F2FS_OPTION(sbi).discard_unit !=
                                                DISCARD_UNIT_SECTION) {
                        f2fs_info(sbi, "Zoned block device doesn't need small discard, set discard_unit=section by default");
                        F2FS_OPTION(sbi).discard_unit =
                                        DISCARD_UNIT_SECTION;
                }
+#else
+               f2fs_err(sbi, "Zoned block device support is not enabled");
+               return -EINVAL;
+#endif
        }
 
 #ifdef CONFIG_F2FS_FS_COMPRESSION
@@ -1341,12 +1340,12 @@ default_check:
        }
 
        if (test_opt(sbi, DISABLE_CHECKPOINT) && f2fs_lfs_mode(sbi)) {
-               f2fs_err(sbi, "LFS not compatible with checkpoint=disable");
+               f2fs_err(sbi, "LFS is not compatible with checkpoint=disable");
                return -EINVAL;
        }
 
        if (test_opt(sbi, ATGC) && f2fs_lfs_mode(sbi)) {
-               f2fs_err(sbi, "LFS not compatible with ATGC");
+               f2fs_err(sbi, "LFS is not compatible with ATGC");
                return -EINVAL;
        }
 
@@ -1366,10 +1365,8 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
 {
        struct f2fs_inode_info *fi;
 
-       if (time_to_inject(F2FS_SB(sb), FAULT_SLAB_ALLOC)) {
-               f2fs_show_injection_info(F2FS_SB(sb), FAULT_SLAB_ALLOC);
+       if (time_to_inject(F2FS_SB(sb), FAULT_SLAB_ALLOC))
                return NULL;
-       }
 
        fi = alloc_inode_sb(sb, f2fs_inode_cachep, GFP_F2FS_ZERO);
        if (!fi)
@@ -1424,8 +1421,6 @@ static int f2fs_drop_inode(struct inode *inode)
                        atomic_inc(&inode->i_count);
                        spin_unlock(&inode->i_lock);
 
-                       f2fs_abort_atomic_write(inode, true);
-
                        /* should remain fi->extent_tree for writepage */
                        f2fs_destroy_extent_node(inode);
 
@@ -1543,7 +1538,7 @@ static void f2fs_put_super(struct super_block *sb)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
        int i;
-       bool dropped;
+       bool done;
 
        /* unregister procfs/sysfs entries in advance to avoid race case */
        f2fs_unregister_sysfs(sbi);
@@ -1573,9 +1568,8 @@ static void f2fs_put_super(struct super_block *sb)
        }
 
        /* be sure to wait for any on-going discard commands */
-       dropped = f2fs_issue_discard_timeout(sbi);
-
-       if (f2fs_realtime_discard_enable(sbi) && !sbi->discard_blks && !dropped) {
+       done = f2fs_issue_discard_timeout(sbi);
+       if (f2fs_realtime_discard_enable(sbi) && !sbi->discard_blks && done) {
                struct cp_control cpc = {
                        .reason = CP_UMOUNT | CP_TRIMMED,
                };
@@ -1900,15 +1894,24 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
 
        if (test_opt(sbi, GC_MERGE))
                seq_puts(seq, ",gc_merge");
+       else
+               seq_puts(seq, ",nogc_merge");
 
        if (test_opt(sbi, DISABLE_ROLL_FORWARD))
                seq_puts(seq, ",disable_roll_forward");
        if (test_opt(sbi, NORECOVERY))
                seq_puts(seq, ",norecovery");
-       if (test_opt(sbi, DISCARD))
+       if (test_opt(sbi, DISCARD)) {
                seq_puts(seq, ",discard");
-       else
+               if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_BLOCK)
+                       seq_printf(seq, ",discard_unit=%s", "block");
+               else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT)
+                       seq_printf(seq, ",discard_unit=%s", "segment");
+               else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
+                       seq_printf(seq, ",discard_unit=%s", "section");
+       } else {
                seq_puts(seq, ",nodiscard");
+       }
        if (test_opt(sbi, NOHEAP))
                seq_puts(seq, ",no_heap");
        else
@@ -2032,13 +2035,6 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
        if (test_opt(sbi, ATGC))
                seq_puts(seq, ",atgc");
 
-       if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_BLOCK)
-               seq_printf(seq, ",discard_unit=%s", "block");
-       else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT)
-               seq_printf(seq, ",discard_unit=%s", "segment");
-       else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
-               seq_printf(seq, ",discard_unit=%s", "section");
-
        if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_NORMAL)
                seq_printf(seq, ",memory=%s", "normal");
        else if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW)
@@ -2300,6 +2296,12 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
                }
        }
 #endif
+       if (f2fs_lfs_mode(sbi) && !IS_F2FS_IPU_DISABLE(sbi)) {
+               err = -EINVAL;
+               f2fs_warn(sbi, "LFS is not compatible with IPU");
+               goto restore_opts;
+       }
+
        /* disallow enable atgc dynamically */
        if (no_atgc == !!test_opt(sbi, ATGC)) {
                err = -EINVAL;
@@ -2589,10 +2591,8 @@ retry:
 
 int f2fs_dquot_initialize(struct inode *inode)
 {
-       if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT)) {
-               f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_DQUOT_INIT);
+       if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT))
                return -ESRCH;
-       }
 
        return dquot_initialize(inode);
 }
@@ -4083,8 +4083,9 @@ static void f2fs_tuning_parameters(struct f2fs_sb_info *sbi)
                if (f2fs_block_unit_discard(sbi))
                        SM_I(sbi)->dcc_info->discard_granularity =
                                                MIN_DISCARD_GRANULARITY;
-               SM_I(sbi)->ipu_policy = 1 << F2FS_IPU_FORCE |
-                                       1 << F2FS_IPU_HONOR_OPU_WRITE;
+               if (!f2fs_lfs_mode(sbi))
+                       SM_I(sbi)->ipu_policy = BIT(F2FS_IPU_FORCE) |
+                                               BIT(F2FS_IPU_HONOR_OPU_WRITE);
        }
 
        sbi->readdir_ra = true;