if (err)
                goto restore_opts;
 
+#ifdef CONFIG_BLK_DEV_ZONED
+       if (f2fs_sb_has_blkzoned(sbi) &&
+               sbi->max_open_zones < F2FS_OPTION(sbi).active_logs) {
+               f2fs_err(sbi,
+                       "zoned: max open zones %u is too small, need at least %u open zones",
+                                sbi->max_open_zones, F2FS_OPTION(sbi).active_logs);
+               err = -EINVAL;
+               goto restore_opts;
+       }
+#endif
+
        /* flush outstanding errors before changing fs state */
        flush_work(&sbi->s_error_work);
 
        sector_t nr_sectors = bdev_nr_sectors(bdev);
        struct f2fs_report_zones_args rep_zone_arg;
        u64 zone_sectors;
+       unsigned int max_open_zones;
        int ret;
 
        if (!f2fs_sb_has_blkzoned(sbi))
                return 0;
 
+       if (bdev_is_zoned(FDEV(devi).bdev)) {
+               max_open_zones = bdev_max_open_zones(bdev);
+               if (max_open_zones && (max_open_zones < sbi->max_open_zones))
+                       sbi->max_open_zones = max_open_zones;
+               if (sbi->max_open_zones < F2FS_OPTION(sbi).active_logs) {
+                       f2fs_err(sbi,
+                               "zoned: max open zones %u is too small, need at least %u open zones",
+                               sbi->max_open_zones, F2FS_OPTION(sbi).active_logs);
+                       return -EINVAL;
+               }
+       }
+
        zone_sectors = bdev_zone_sectors(bdev);
        if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
                                SECTOR_TO_BLOCK(zone_sectors))
 
        logical_blksize = bdev_logical_block_size(sbi->sb->s_bdev);
        sbi->aligned_blksize = true;
+#ifdef CONFIG_BLK_DEV_ZONED
+       sbi->max_open_zones = UINT_MAX;
+#endif
 
        for (i = 0; i < max_devices; i++) {
                if (i == 0)