On Thu, Jan 26, 2023 at 6:02 PM Boris Burkov <boris@xxxxxx> wrote: > > Add a new test which checks that size classes in freshly loaded block > groups after a cycle mount match size classes before going down > > Depends on the kernel patch: > btrfs: add size class stats to sysfs > > Signed-off-by: Boris Burkov <boris@xxxxxx> > --- > Changelog: > v4: > Fix dump typo in _fixed_by_kernel_commit (left out leading underscore > copy+pasting). Re-tested happy and sad case... > > v3: > Re-add fixed_by_kernel_commit, but for the stats patch which is > required, but not a fix in the strictest sense. > > v2: > Drop the fixed_by_kernel_commit since the fix is not out past the btrfs > development tree, so the fix is getting rolled in to the original broken > commit. Modified the commit message to note the dependency on the new > sysfs counters. > > > tests/btrfs/283 | 50 +++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/283.out | 2 ++ > 2 files changed, 52 insertions(+) > create mode 100755 tests/btrfs/283 > create mode 100644 tests/btrfs/283.out > > diff --git a/tests/btrfs/283 b/tests/btrfs/283 > new file mode 100755 > index 00000000..2176c8e4 > --- /dev/null > +++ b/tests/btrfs/283 > @@ -0,0 +1,50 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2023 Meta Platforms, Inc. All Rights Reserved. > +# > +# FS QA Test 283 > +# > +# Test that mounting a btrfs filesystem properly loads block group size classes. > +# > +. ./common/preamble > +_begin_fstest auto quick mount Why the mount group? We aren't testing mount options. It's a bit odd to me. > +_fixed_by_kernel_commit xxxxxxxx "btrfs: add size class stats to sysfs". Should be _wants_kernel_commit here, because it's a new feature and not a bug fix. > + > +sysfs_size_classes() { > + local uuid="$(findmnt -n -o UUID "$SCRATCH_MNT")" > + cat "/sys/fs/btrfs/$uuid/allocation/data/size_classes" > +} > + > +_supported_fs btrfs > +_require_scratch > +_require_btrfs_fs_sysfs This alone is not enough. What if we are running in a kernel with btrfs' sysfs support but without the size classes? I.e. the allocation/data/size_classes path does not exist. Then the test fails with: cat: /sys/fs/btrfs/95da1e36-8411-468a-abeb-71652dc2092b/allocation/data/size_classes: No such file or directory Instead the test just be skipped, i.e. calling: _notrun "allocation size classes not supported" Thanks. > + > +f="$SCRATCH_MNT/f" > +small=$((16 * 1024)) > +medium=$((1024 * 1024)) > +large=$((16 * 1024 * 1024)) > + > +_scratch_mkfs >/dev/null > +_scratch_mount > +# Write files with extents in each size class > +$XFS_IO_PROG -fc "pwrite -q 0 $small" $f.small > +$XFS_IO_PROG -fc "pwrite -q 0 $medium" $f.medium > +$XFS_IO_PROG -fc "pwrite -q 0 $large" $f.large > +# Sync to force the extent allocation > +sync > +pre=$(sysfs_size_classes) > + > +# cycle mount to drop the block group cache > +_scratch_cycle_mount > + > +# Another write causes us to actually load the block groups > +$XFS_IO_PROG -fc "pwrite -q 0 $large" $f.large.2 > +sync > + > +post=$(sysfs_size_classes) > +diff <(echo $pre) <(echo $post) > + > +echo "Silence is golden" > +# success, all done > +status=0 > +exit > diff --git a/tests/btrfs/283.out b/tests/btrfs/283.out > new file mode 100644 > index 00000000..efb2c583 > --- /dev/null > +++ b/tests/btrfs/283.out > @@ -0,0 +1,2 @@ > +QA output created by 283 > +Silence is golden > -- > 2.39.1 >