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.