On Wed, Dec 04, 2019 at 05:17:12PM +0900, Naohiro Aota wrote: > As updates to the space cache are in-place, the space cache cannot be > located over sequential zones and there is no guarantees that the device > will have enough conventional zones to store this cache. Resolve this > problem by disabling completely the space cache. This does not introduces > any problems with sequential block groups: all the free space is located > after the allocation pointer and no free space before the pointer. There is > no need to have such cache. > > Signed-off-by: Naohiro Aota <naohiro.aota@xxxxxxx> > --- > fs/btrfs/hmzoned.c | 18 ++++++++++++++++++ > fs/btrfs/hmzoned.h | 5 +++++ > fs/btrfs/super.c | 10 ++++++++-- > 3 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/fs/btrfs/hmzoned.c b/fs/btrfs/hmzoned.c > index b74581133a72..1c015ed050fc 100644 > --- a/fs/btrfs/hmzoned.c > +++ b/fs/btrfs/hmzoned.c > @@ -253,3 +253,21 @@ int btrfs_check_hmzoned_mode(struct btrfs_fs_info *fs_info) > out: > return ret; > } > + > +int btrfs_check_mountopts_hmzoned(struct btrfs_fs_info *info) > +{ > + if (!btrfs_fs_incompat(info, HMZONED)) > + return 0; > + > + /* > + * SPACE CACHE writing is not CoWed. Disable that to avoid > + * write errors in sequential zones. Please format comments to 80 columns > + */ > + 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; > 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.