On Fri, Dec 06, 2019 at 02:32:44PM +0900, Naohiro Aota wrote:
> >> + */
> >> + if (btrfs_test_opt(info, SPACE_CACHE)) {
> >> + btrfs_err(info,
> >> + "cannot enable disk space caching with HMZONED mode");
> >
> >"space cache v1 not supported in HMZONED mode, use v2 (free-space-tree)"
> >
> >> + return -EINVAL;
>
> Yes, we can technically use free-space-tree on HMZONED mode. But,
> since HMZONED mode now always allocate extents in a block group
> sequentially regardless of underlying device zone type, it's no use to
> enable and maintain the tree anymore.
>
> So, just telling "space cache v1 not supported in HMZONED mode" is
> better?
Ok. That v2 is possible to use but not necessary is something to put to
documentation.
> >> static inline bool btrfs_dev_is_sequential(struct btrfs_device *device, u64 pos)
> >> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> >> index 616f5abec267..d411574298f4 100644
> >> --- a/fs/btrfs/super.c
> >> +++ b/fs/btrfs/super.c
> >> @@ -442,8 +442,12 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
> >> cache_gen = btrfs_super_cache_generation(info->super_copy);
> >> if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE))
> >> btrfs_set_opt(info->mount_opt, FREE_SPACE_TREE);
> >> - else if (cache_gen)
> >> - btrfs_set_opt(info->mount_opt, SPACE_CACHE);
> >> + else if (cache_gen) {
> >> + if (btrfs_fs_incompat(info, HMZONED))
> >> + WARN_ON(1);
> >
> >So this is supposed to catch invalid combination, hmzoned-compatible
> >options are verified at the beginning. 'cache_gen' can be potentially
> >non-zero (fuzzed image, accidental random overwrite from last time), so
> >I think a message should be printed. If it's possible to continue, eg.
> >completely ignoring the existing space cache that's more user friendly
> >than a plain unexplained WARN_ON.
>
> We can just ignore the generation value and continue. I'll rewrite to
> use btrfs_info(info, "ignoring existing space cache in HMZONED mode.")
> instead of WARN_ON.
Sounds good.