btrfs: allow debug builds to accept 2K block size
authorQu Wenruo <wqu@suse.com>
Tue, 25 Feb 2025 02:33:03 +0000 (13:03 +1030)
committerDavid Sterba <dsterba@suse.com>
Tue, 18 Mar 2025 19:35:49 +0000 (20:35 +0100)
Currently we only support two block sizes, 4K and PAGE_SIZE.

This means on the most common architecture x86_64, we have no way to
test subpage block size.  And that's exactly I have an aarch64 machine
dedicated for subpage tests.

But this is still a hurdle for a lot of btrfs developers, and to improve
the test coverage mostly on x86_64, here we enable debug builds to
accept 2K block size.

This involves:

- Introduce a dedicated minimal block size macro
  BTRFS_MIN_BLOCKSIZE, which depends on if CONFIG_BTRFS_DEBUG is set.
  If so it's 2K, otherwise it's 4K as usual.

- Allow 4K, PAGE_SIZE and BTRFS_MIN_BLOCKSIZE as block size

- Update subpage block size checks to be based on BTRFS_MIN_BLOCKSIZE

- Export the new supported blocksize through sysfs interfaces

As most of the subpage support is already pretty mature, there is no
extra work needed to support the extra 2K block size.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/fs.h
fs/btrfs/subpage.h
fs/btrfs/sysfs.c

index 0cb55944893354d653261dbe3003b57b549724a1..d96ea974ef7359e01e4370ea9d77270e14f70212 100644 (file)
@@ -2442,21 +2442,27 @@ int btrfs_validate_super(const struct btrfs_fs_info *fs_info,
         * Check sectorsize and nodesize first, other check will need it.
         * Check all possible sectorsize(4K, 8K, 16K, 32K, 64K) here.
         */
-       if (!is_power_of_2(sectorsize) || sectorsize < 4096 ||
+       if (!is_power_of_2(sectorsize) || sectorsize < BTRFS_MIN_BLOCKSIZE ||
            sectorsize > BTRFS_MAX_METADATA_BLOCKSIZE) {
                btrfs_err(fs_info, "invalid sectorsize %llu", sectorsize);
                ret = -EINVAL;
        }
 
        /*
-        * We only support at most two sectorsizes: 4K and PAGE_SIZE.
+        * We only support at most 3 sectorsizes: 4K, PAGE_SIZE, MIN_BLOCKSIZE.
+        *
+        * For 4K page sized systems with non-debug builds, all 3 matches (4K).
+        * For 4K page sized systems with debug builds, there are two block sizes
+        * supported. (4K and 2K)
         *
         * We can support 16K sectorsize with 64K page size without problem,
         * but such sectorsize/pagesize combination doesn't make much sense.
         * 4K will be our future standard, PAGE_SIZE is supported from the very
         * beginning.
         */
-       if (sectorsize > PAGE_SIZE || (sectorsize != SZ_4K && sectorsize != PAGE_SIZE)) {
+       if (sectorsize > PAGE_SIZE || (sectorsize != SZ_4K &&
+                                      sectorsize != PAGE_SIZE &&
+                                      sectorsize != BTRFS_MIN_BLOCKSIZE)) {
                btrfs_err(fs_info,
                        "sectorsize %llu not yet supported for page size %lu",
                        sectorsize, PAGE_SIZE);
index 8e8ac7db1355476bd33edd9f975e3d0c0406b5ab..6710da812a380fe5ddb4f9157583014b48b7c653 100644 (file)
@@ -47,6 +47,18 @@ struct btrfs_subpage_info;
 struct btrfs_stripe_hash_table;
 struct btrfs_space_info;
 
+/*
+ * Minimum data and metadata block size.
+ *
+ * Normally it's 4K, but for testing subpage block size on 4K page systems, we
+ * allow DEBUG builds to accept 2K page size.
+ */
+#ifdef CONFIG_BTRFS_DEBUG
+#define BTRFS_MIN_BLOCKSIZE    (SZ_2K)
+#else
+#define BTRFS_MIN_BLOCKSIZE    (SZ_4K)
+#endif
+
 #define BTRFS_MAX_EXTENT_SIZE SZ_128M
 
 #define BTRFS_OLDEST_GENERATION        0ULL
index 2515e380e90419cb0f598df0d1635a86ca6680ee..9d1ad6c7c6bd085064e2d90dd09d5b8b2740006b 100644 (file)
@@ -70,7 +70,7 @@ enum btrfs_subpage_type {
        BTRFS_SUBPAGE_DATA,
 };
 
-#if PAGE_SIZE > SZ_4K
+#if PAGE_SIZE > BTRFS_MIN_BLOCKSIZE
 /*
  * Subpage support for metadata is more complex, as we can have dummy extent
  * buffers, where folios have no mapping to determine the owning inode.
index 974e8a75e3ab56ecac646466c0b2824664be4d2e..b9af74498b0c78f7b0d84614dc7e1e1bc9cdaebb 100644 (file)
@@ -411,7 +411,8 @@ static ssize_t supported_sectorsizes_show(struct kobject *kobj,
 {
        ssize_t ret = 0;
 
-       /* An artificial limit to only support 4K and PAGE_SIZE */
+       if (BTRFS_MIN_BLOCKSIZE != SZ_4K && BTRFS_MIN_BLOCKSIZE != PAGE_SIZE)
+               ret += sysfs_emit_at(buf, ret, "%u ", BTRFS_MIN_BLOCKSIZE);
        if (PAGE_SIZE > SZ_4K)
                ret += sysfs_emit_at(buf, ret, "%u ", SZ_4K);
        ret += sysfs_emit_at(buf, ret, "%lu\n", PAGE_SIZE);