Merge tag 'f2fs-for-5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[platform/kernel/linux-starfive.git] / fs / f2fs / super.c
index 75a3b72..95c3e86 100644 (file)
@@ -2316,13 +2316,27 @@ static bool f2fs_dummy_context(struct inode *inode)
        return DUMMY_ENCRYPTION_ENABLED(F2FS_I_SB(inode));
 }
 
+static bool f2fs_has_stable_inodes(struct super_block *sb)
+{
+       return true;
+}
+
+static void f2fs_get_ino_and_lblk_bits(struct super_block *sb,
+                                      int *ino_bits_ret, int *lblk_bits_ret)
+{
+       *ino_bits_ret = 8 * sizeof(nid_t);
+       *lblk_bits_ret = 8 * sizeof(block_t);
+}
+
 static const struct fscrypt_operations f2fs_cryptops = {
-       .key_prefix     = "f2fs:",
-       .get_context    = f2fs_get_context,
-       .set_context    = f2fs_set_context,
-       .dummy_context  = f2fs_dummy_context,
-       .empty_dir      = f2fs_empty_dir,
-       .max_namelen    = F2FS_NAME_LEN,
+       .key_prefix             = "f2fs:",
+       .get_context            = f2fs_get_context,
+       .set_context            = f2fs_set_context,
+       .dummy_context          = f2fs_dummy_context,
+       .empty_dir              = f2fs_empty_dir,
+       .max_namelen            = F2FS_NAME_LEN,
+       .has_stable_inodes      = f2fs_has_stable_inodes,
+       .get_ino_and_lblk_bits  = f2fs_get_ino_and_lblk_bits,
 };
 #endif
 
@@ -2881,15 +2895,21 @@ static int init_percpu_info(struct f2fs_sb_info *sbi)
 }
 
 #ifdef CONFIG_BLK_DEV_ZONED
+static int f2fs_report_zone_cb(struct blk_zone *zone, unsigned int idx,
+                              void *data)
+{
+       struct f2fs_dev_info *dev = data;
+
+       if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL)
+               set_bit(idx, dev->blkz_seq);
+       return 0;
+}
+
 static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
 {
        struct block_device *bdev = FDEV(devi).bdev;
        sector_t nr_sectors = bdev->bd_part->nr_sects;
-       sector_t sector = 0;
-       struct blk_zone *zones;
-       unsigned int i, nr_zones;
-       unsigned int n = 0;
-       int err = -EIO;
+       int ret;
 
        if (!f2fs_sb_has_blkzoned(sbi))
                return 0;
@@ -2914,38 +2934,13 @@ static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
        if (!FDEV(devi).blkz_seq)
                return -ENOMEM;
 
-#define F2FS_REPORT_NR_ZONES   4096
-
-       zones = f2fs_kzalloc(sbi,
-                            array_size(F2FS_REPORT_NR_ZONES,
-                                       sizeof(struct blk_zone)),
-                            GFP_KERNEL);
-       if (!zones)
-               return -ENOMEM;
-
        /* Get block zones type */
-       while (zones && sector < nr_sectors) {
-
-               nr_zones = F2FS_REPORT_NR_ZONES;
-               err = blkdev_report_zones(bdev, sector, zones, &nr_zones);
-               if (err)
-                       break;
-               if (!nr_zones) {
-                       err = -EIO;
-                       break;
-               }
-
-               for (i = 0; i < nr_zones; i++) {
-                       if (zones[i].type != BLK_ZONE_TYPE_CONVENTIONAL)
-                               set_bit(n, FDEV(devi).blkz_seq);
-                       sector += zones[i].len;
-                       n++;
-               }
-       }
-
-       kvfree(zones);
+       ret = blkdev_report_zones(bdev, 0, BLK_ALL_ZONES, f2fs_report_zone_cb,
+                                 &FDEV(devi));
+       if (ret < 0)
+               return ret;
 
-       return err;
+       return 0;
 }
 #endif