Merge tag 'f2fs-for-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[sfrench/cifs-2.6.git] / fs / f2fs / super.c
index f6ffbfe75653cf0de1741bf5094f4a6340faa659..a6867f26f141836dcd4a4f0136dd67a9de6c3c74 100644 (file)
@@ -44,24 +44,26 @@ static struct kmem_cache *f2fs_inode_cachep;
 #ifdef CONFIG_F2FS_FAULT_INJECTION
 
 const char *f2fs_fault_name[FAULT_MAX] = {
-       [FAULT_KMALLOC]         = "kmalloc",
-       [FAULT_KVMALLOC]        = "kvmalloc",
-       [FAULT_PAGE_ALLOC]      = "page alloc",
-       [FAULT_PAGE_GET]        = "page get",
-       [FAULT_ALLOC_NID]       = "alloc nid",
-       [FAULT_ORPHAN]          = "orphan",
-       [FAULT_BLOCK]           = "no more block",
-       [FAULT_DIR_DEPTH]       = "too big dir depth",
-       [FAULT_EVICT_INODE]     = "evict_inode fail",
-       [FAULT_TRUNCATE]        = "truncate fail",
-       [FAULT_READ_IO]         = "read IO error",
-       [FAULT_CHECKPOINT]      = "checkpoint error",
-       [FAULT_DISCARD]         = "discard error",
-       [FAULT_WRITE_IO]        = "write IO error",
-       [FAULT_SLAB_ALLOC]      = "slab alloc",
-       [FAULT_DQUOT_INIT]      = "dquot initialize",
-       [FAULT_LOCK_OP]         = "lock_op",
-       [FAULT_BLKADDR]         = "invalid blkaddr",
+       [FAULT_KMALLOC]                 = "kmalloc",
+       [FAULT_KVMALLOC]                = "kvmalloc",
+       [FAULT_PAGE_ALLOC]              = "page alloc",
+       [FAULT_PAGE_GET]                = "page get",
+       [FAULT_ALLOC_NID]               = "alloc nid",
+       [FAULT_ORPHAN]                  = "orphan",
+       [FAULT_BLOCK]                   = "no more block",
+       [FAULT_DIR_DEPTH]               = "too big dir depth",
+       [FAULT_EVICT_INODE]             = "evict_inode fail",
+       [FAULT_TRUNCATE]                = "truncate fail",
+       [FAULT_READ_IO]                 = "read IO error",
+       [FAULT_CHECKPOINT]              = "checkpoint error",
+       [FAULT_DISCARD]                 = "discard error",
+       [FAULT_WRITE_IO]                = "write IO error",
+       [FAULT_SLAB_ALLOC]              = "slab alloc",
+       [FAULT_DQUOT_INIT]              = "dquot initialize",
+       [FAULT_LOCK_OP]                 = "lock_op",
+       [FAULT_BLKADDR_VALIDITY]        = "invalid blkaddr",
+       [FAULT_BLKADDR_CONSISTENCE]     = "inconsistent blkaddr",
+       [FAULT_NO_SEGMENT]              = "no free segment",
 };
 
 void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
@@ -137,7 +139,6 @@ enum {
        Opt_resgid,
        Opt_resuid,
        Opt_mode,
-       Opt_io_size_bits,
        Opt_fault_injection,
        Opt_fault_type,
        Opt_lazytime,
@@ -216,7 +217,6 @@ static match_table_t f2fs_tokens = {
        {Opt_resgid, "resgid=%u"},
        {Opt_resuid, "resuid=%u"},
        {Opt_mode, "mode=%s"},
-       {Opt_io_size_bits, "io_bits=%u"},
        {Opt_fault_injection, "fault_injection=%u"},
        {Opt_fault_type, "fault_type=%u"},
        {Opt_lazytime, "lazytime"},
@@ -263,7 +263,8 @@ static match_table_t f2fs_tokens = {
        {Opt_err, NULL},
 };
 
-void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
+void f2fs_printk(struct f2fs_sb_info *sbi, bool limit_rate,
+                                               const char *fmt, ...)
 {
        struct va_format vaf;
        va_list args;
@@ -274,8 +275,12 @@ void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
        level = printk_get_level(fmt);
        vaf.fmt = printk_skip_level(fmt);
        vaf.va = &args;
-       printk("%c%cF2FS-fs (%s): %pV\n",
-              KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);
+       if (limit_rate)
+               printk_ratelimited("%c%cF2FS-fs (%s): %pV\n",
+                       KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);
+       else
+               printk("%c%cF2FS-fs (%s): %pV\n",
+                       KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);
 
        va_end(args);
 }
@@ -343,46 +348,6 @@ static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
                                           F2FS_OPTION(sbi).s_resgid));
 }
 
-static inline int adjust_reserved_segment(struct f2fs_sb_info *sbi)
-{
-       unsigned int sec_blks = sbi->blocks_per_seg * sbi->segs_per_sec;
-       unsigned int avg_vblocks;
-       unsigned int wanted_reserved_segments;
-       block_t avail_user_block_count;
-
-       if (!F2FS_IO_ALIGNED(sbi))
-               return 0;
-
-       /* average valid block count in section in worst case */
-       avg_vblocks = sec_blks / F2FS_IO_SIZE(sbi);
-
-       /*
-        * we need enough free space when migrating one section in worst case
-        */
-       wanted_reserved_segments = (F2FS_IO_SIZE(sbi) / avg_vblocks) *
-                                               reserved_segments(sbi);
-       wanted_reserved_segments -= reserved_segments(sbi);
-
-       avail_user_block_count = sbi->user_block_count -
-                               sbi->current_reserved_blocks -
-                               F2FS_OPTION(sbi).root_reserved_blocks;
-
-       if (wanted_reserved_segments * sbi->blocks_per_seg >
-                                       avail_user_block_count) {
-               f2fs_err(sbi, "IO align feature can't grab additional reserved segment: %u, available segments: %u",
-                       wanted_reserved_segments,
-                       avail_user_block_count >> sbi->log_blocks_per_seg);
-               return -ENOSPC;
-       }
-
-       SM_I(sbi)->additional_reserved_segments = wanted_reserved_segments;
-
-       f2fs_info(sbi, "IO align feature needs additional reserved segment: %u",
-                        wanted_reserved_segments);
-
-       return 0;
-}
-
 static inline void adjust_unusable_cap_perc(struct f2fs_sb_info *sbi)
 {
        if (!F2FS_OPTION(sbi).unusable_cap_perc)
@@ -663,7 +628,7 @@ static int f2fs_set_lz4hc_level(struct f2fs_sb_info *sbi, const char *str)
 #ifdef CONFIG_F2FS_FS_ZSTD
 static int f2fs_set_zstd_level(struct f2fs_sb_info *sbi, const char *str)
 {
-       unsigned int level;
+       int level;
        int len = 4;
 
        if (strlen(str) == len) {
@@ -677,9 +642,15 @@ static int f2fs_set_zstd_level(struct f2fs_sb_info *sbi, const char *str)
                f2fs_info(sbi, "wrong format, e.g. <alg_name>:<compr_level>");
                return -EINVAL;
        }
-       if (kstrtouint(str + 1, 10, &level))
+       if (kstrtoint(str + 1, 10, &level))
                return -EINVAL;
 
+       /* f2fs does not support negative compress level now */
+       if (level < 0) {
+               f2fs_info(sbi, "do not support negative compress level: %d", level);
+               return -ERANGE;
+       }
+
        if (!f2fs_is_compress_level_valid(COMPRESS_ZSTD, level)) {
                f2fs_info(sbi, "invalid zstd compress level: %d", level);
                return -EINVAL;
@@ -763,10 +734,8 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount)
                        clear_opt(sbi, DISCARD);
                        break;
                case Opt_noheap:
-                       set_opt(sbi, NOHEAP);
-                       break;
                case Opt_heap:
-                       clear_opt(sbi, NOHEAP);
+                       f2fs_warn(sbi, "heap/no_heap options were deprecated");
                        break;
 #ifdef CONFIG_F2FS_FS_XATTR
                case Opt_user_xattr:
@@ -913,16 +882,6 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount)
                        }
                        kfree(name);
                        break;
-               case Opt_io_size_bits:
-                       if (args->from && match_int(args, &arg))
-                               return -EINVAL;
-                       if (arg <= 0 || arg > __ilog2_u32(BIO_MAX_VECS)) {
-                               f2fs_warn(sbi, "Not support %ld, larger than %d",
-                                       BIT(arg), BIO_MAX_VECS);
-                               return -EINVAL;
-                       }
-                       F2FS_OPTION(sbi).write_io_size_bits = arg;
-                       break;
 #ifdef CONFIG_F2FS_FAULT_INJECTION
                case Opt_fault_injection:
                        if (args->from && match_int(args, &arg))
@@ -1392,12 +1351,6 @@ default_check:
        }
 #endif
 
-       if (F2FS_IO_SIZE_BITS(sbi) && !f2fs_lfs_mode(sbi)) {
-               f2fs_err(sbi, "Should set mode=lfs with %luKB-sized IO",
-                        F2FS_IO_SIZE_KB(sbi));
-               return -EINVAL;
-       }
-
        if (test_opt(sbi, INLINE_XATTR_SIZE)) {
                int min_size, max_size;
 
@@ -1718,7 +1671,6 @@ static void f2fs_put_super(struct super_block *sb)
 
        f2fs_destroy_page_array_cache(sbi);
        f2fs_destroy_xattr_caches(sbi);
-       mempool_destroy(sbi->write_io_dummy);
 #ifdef CONFIG_QUOTA
        for (i = 0; i < MAXQUOTAS; i++)
                kfree(F2FS_OPTION(sbi).s_qf_names[i]);
@@ -2009,10 +1961,6 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
        } else {
                seq_puts(seq, ",nodiscard");
        }
-       if (test_opt(sbi, NOHEAP))
-               seq_puts(seq, ",no_heap");
-       else
-               seq_puts(seq, ",heap");
 #ifdef CONFIG_F2FS_FS_XATTR
        if (test_opt(sbi, XATTR_USER))
                seq_puts(seq, ",user_xattr");
@@ -2078,9 +2026,6 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
                                        F2FS_OPTION(sbi).s_resuid),
                                from_kgid_munged(&init_user_ns,
                                        F2FS_OPTION(sbi).s_resgid));
-       if (F2FS_IO_SIZE_BITS(sbi))
-               seq_printf(seq, ",io_bits=%u",
-                               F2FS_OPTION(sbi).write_io_size_bits);
 #ifdef CONFIG_F2FS_FAULT_INJECTION
        if (test_opt(sbi, FAULT_INJECTION)) {
                seq_printf(seq, ",fault_injection=%u",
@@ -2192,7 +2137,6 @@ static void default_options(struct f2fs_sb_info *sbi, bool remount)
        set_opt(sbi, INLINE_XATTR);
        set_opt(sbi, INLINE_DATA);
        set_opt(sbi, INLINE_DENTRY);
-       set_opt(sbi, NOHEAP);
        set_opt(sbi, MERGE_CHECKPOINT);
        F2FS_OPTION(sbi).unusable_cap = 0;
        sbi->sb->s_flags |= SB_LAZYTIME;
@@ -2247,6 +2191,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
                        .init_gc_type = FG_GC,
                        .should_migrate_blocks = false,
                        .err_gc_skipped = true,
+                       .no_bg_gc = true,
                        .nr_free_secs = 1 };
 
                f2fs_down_write(&sbi->gc_lock);
@@ -2332,7 +2277,6 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
        bool no_read_extent_cache = !test_opt(sbi, READ_EXTENT_CACHE);
        bool no_age_extent_cache = !test_opt(sbi, AGE_EXTENT_CACHE);
        bool enable_checkpoint = !test_opt(sbi, DISABLE_CHECKPOINT);
-       bool no_io_align = !F2FS_IO_ALIGNED(sbi);
        bool no_atgc = !test_opt(sbi, ATGC);
        bool no_discard = !test_opt(sbi, DISCARD);
        bool no_compress_cache = !test_opt(sbi, COMPRESS_CACHE);
@@ -2440,12 +2384,6 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
                goto restore_opts;
        }
 
-       if (no_io_align == !!F2FS_IO_ALIGNED(sbi)) {
-               err = -EINVAL;
-               f2fs_warn(sbi, "switch io_bits option is not allowed");
-               goto restore_opts;
-       }
-
        if (no_compress_cache == !!test_opt(sbi, COMPRESS_CACHE)) {
                err = -EINVAL;
                f2fs_warn(sbi, "switch compress_cache option is not allowed");
@@ -3706,7 +3644,7 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi)
        }
 
        main_segs = le32_to_cpu(raw_super->segment_count_main);
-       blocks_per_seg = sbi->blocks_per_seg;
+       blocks_per_seg = BLKS_PER_SEG(sbi);
 
        for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
                if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs ||
@@ -3818,9 +3756,9 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
        sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
        sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
        sbi->total_sections = le32_to_cpu(raw_super->section_count);
-       sbi->total_node_count =
-               (le32_to_cpu(raw_super->segment_count_nat) / 2)
-                       * sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
+       sbi->total_node_count = SEGS_TO_BLKS(sbi,
+                       ((le32_to_cpu(raw_super->segment_count_nat) / 2) *
+                       NAT_ENTRY_PER_BLOCK));
        F2FS_ROOT_INO(sbi) = le32_to_cpu(raw_super->root_ino);
        F2FS_NODE_INO(sbi) = le32_to_cpu(raw_super->node_ino);
        F2FS_META_INO(sbi) = le32_to_cpu(raw_super->meta_ino);
@@ -3829,7 +3767,7 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
        sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
        sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
        sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
-       sbi->migration_granularity = sbi->segs_per_sec;
+       sbi->migration_granularity = SEGS_PER_SEC(sbi);
        sbi->seq_file_ra_mul = MIN_RA_MUL;
        sbi->max_fragment_chunk = DEF_FRAGMENT_SIZE;
        sbi->max_fragment_hole = DEF_FRAGMENT_SIZE;
@@ -3930,11 +3868,6 @@ static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
                return 0;
 
        zone_sectors = bdev_zone_sectors(bdev);
-       if (!is_power_of_2(zone_sectors)) {
-               f2fs_err(sbi, "F2FS does not support non power of 2 zone sizes\n");
-               return -EINVAL;
-       }
-
        if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
                                SECTOR_TO_BLOCK(zone_sectors))
                return -EINVAL;
@@ -4090,7 +4023,9 @@ static void f2fs_record_stop_reason(struct f2fs_sb_info *sbi)
 
        f2fs_up_write(&sbi->sb_lock);
        if (err)
-               f2fs_err(sbi, "f2fs_commit_super fails to record err:%d", err);
+               f2fs_err_ratelimited(sbi,
+                       "f2fs_commit_super fails to record stop_reason, err:%d",
+                       err);
 }
 
 void f2fs_save_errors(struct f2fs_sb_info *sbi, unsigned char flag)
@@ -4133,8 +4068,9 @@ static void f2fs_record_errors(struct f2fs_sb_info *sbi, unsigned char error)
 
        err = f2fs_commit_super(sbi, false);
        if (err)
-               f2fs_err(sbi, "f2fs_commit_super fails to record errors:%u, err:%d",
-                                                               error, err);
+               f2fs_err_ratelimited(sbi,
+                       "f2fs_commit_super fails to record errors:%u, err:%d",
+                       error, err);
 out_unlock:
        f2fs_up_write(&sbi->sb_lock);
 }
@@ -4259,14 +4195,14 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
                        if (i == 0) {
                                FDEV(i).start_blk = 0;
                                FDEV(i).end_blk = FDEV(i).start_blk +
-                                   (FDEV(i).total_segments <<
-                                   sbi->log_blocks_per_seg) - 1 +
-                                   le32_to_cpu(raw_super->segment0_blkaddr);
+                                       SEGS_TO_BLKS(sbi,
+                                       FDEV(i).total_segments) - 1 +
+                                       le32_to_cpu(raw_super->segment0_blkaddr);
                        } else {
                                FDEV(i).start_blk = FDEV(i - 1).end_blk + 1;
                                FDEV(i).end_blk = FDEV(i).start_blk +
-                                       (FDEV(i).total_segments <<
-                                       sbi->log_blocks_per_seg) - 1;
+                                               SEGS_TO_BLKS(sbi,
+                                               FDEV(i).total_segments) - 1;
                                FDEV(i).bdev_file = bdev_file_open_by_path(
                                        FDEV(i).path, mode, sbi->sb, NULL);
                        }
@@ -4305,8 +4241,6 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
                          FDEV(i).total_segments,
                          FDEV(i).start_blk, FDEV(i).end_blk);
        }
-       f2fs_info(sbi,
-                 "IO Block Size: %8ld KB", F2FS_IO_SIZE_KB(sbi));
        return 0;
 }
 
@@ -4519,19 +4453,10 @@ try_onemore:
        if (err)
                goto free_iostat;
 
-       if (F2FS_IO_ALIGNED(sbi)) {
-               sbi->write_io_dummy =
-                       mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
-               if (!sbi->write_io_dummy) {
-                       err = -ENOMEM;
-                       goto free_percpu;
-               }
-       }
-
        /* init per sbi slab cache */
        err = f2fs_init_xattr_caches(sbi);
        if (err)
-               goto free_io_dummy;
+               goto free_percpu;
        err = f2fs_init_page_array_cache(sbi);
        if (err)
                goto free_xattr_cache;
@@ -4619,10 +4544,6 @@ try_onemore:
                goto free_nm;
        }
 
-       err = adjust_reserved_segment(sbi);
-       if (err)
-               goto free_nm;
-
        /* For write statistics */
        sbi->sectors_written_start = f2fs_get_sectors_written(sbi);
 
@@ -4749,13 +4670,20 @@ 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_notice(sbi, "Checking entire write pointers");
+               err2 = f2fs_check_write_pointer(sbi);
+               if (err2)
+                       err = err2;
        }
+       if (err)
+               goto free_meta;
 
-       f2fs_init_inmem_curseg(sbi);
+       err = f2fs_init_inmem_curseg(sbi);
+       if (err)
+               goto sync_free_meta;
 
        /* f2fs_recover_fsync_data() cleared this already */
        clear_sbi_flag(sbi, SBI_POR_DOING);
@@ -4854,8 +4782,6 @@ free_page_array_cache:
        f2fs_destroy_page_array_cache(sbi);
 free_xattr_cache:
        f2fs_destroy_xattr_caches(sbi);
-free_io_dummy:
-       mempool_destroy(sbi->write_io_dummy);
 free_percpu:
        destroy_percpu_info(sbi);
 free_iostat: