]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: add definitions and constants for remap-tree
authorMark Harmstone <mark@harmstone.com>
Wed, 7 Jan 2026 14:09:01 +0000 (14:09 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Feb 2026 06:54:02 +0000 (07:54 +0100)
Add an incompat flag for the new remap-tree feature, and the constants
and definitions needed to support it.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Mark Harmstone <mark@harmstone.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/accessors.h
fs/btrfs/locking.c
fs/btrfs/sysfs.c
fs/btrfs/tree-checker.c
fs/btrfs/tree-checker.h
fs/btrfs/volumes.c
include/uapi/linux/btrfs.h
include/uapi/linux/btrfs_tree.h

index 78721412951c5a81005eddcaf811e3fe2a141de9..09cdd6bfddf509e7be81982fe4e47312154d66c1 100644 (file)
@@ -1010,6 +1010,10 @@ BTRFS_SETGET_STACK_FUNCS(stack_verity_descriptor_encryption,
 BTRFS_SETGET_STACK_FUNCS(stack_verity_descriptor_size,
                         struct btrfs_verity_descriptor_item, size, 64);
 
+BTRFS_SETGET_FUNCS(remap_address, struct btrfs_remap_item, address, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_remap_address, struct btrfs_remap_item,
+                        address, 64);
+
 /* Cast into the data area of the leaf. */
 #define btrfs_item_ptr(leaf, slot, type)                               \
        ((type *)(btrfs_item_nr_offset(leaf, 0) + btrfs_item_offset(leaf, slot)))
index 0035851d72b00f69229dd21c6102d47c20dcb8d3..e3df5ca0b552a000cd83b680c3f077a7a2a6d1a9 100644 (file)
@@ -73,6 +73,7 @@ static struct btrfs_lockdep_keyset {
        { .id = BTRFS_FREE_SPACE_TREE_OBJECTID, DEFINE_NAME("free-space") },
        { .id = BTRFS_BLOCK_GROUP_TREE_OBJECTID, DEFINE_NAME("block-group") },
        { .id = BTRFS_RAID_STRIPE_TREE_OBJECTID, DEFINE_NAME("raid-stripe") },
+       { .id = BTRFS_REMAP_TREE_OBJECTID,      DEFINE_NAME("remap") },
        { .id = 0,                              DEFINE_NAME("tree")     },
 };
 
index ebd6d1d6778ba76c6e2354f1f214317bb01ae9a7..8834a1dd499c9bdf9140049d4fed9e13af338b30 100644 (file)
@@ -299,6 +299,8 @@ BTRFS_FEAT_ATTR_INCOMPAT(zoned, ZONED);
 BTRFS_FEAT_ATTR_INCOMPAT(extent_tree_v2, EXTENT_TREE_V2);
 /* Remove once support for raid stripe tree is feature complete. */
 BTRFS_FEAT_ATTR_INCOMPAT(raid_stripe_tree, RAID_STRIPE_TREE);
+/* Remove once support for remap tree is feature complete. */
+BTRFS_FEAT_ATTR_INCOMPAT(remap_tree, REMAP_TREE);
 #endif
 #ifdef CONFIG_FS_VERITY
 BTRFS_FEAT_ATTR_COMPAT_RO(verity, VERITY);
@@ -331,6 +333,7 @@ static struct attribute *btrfs_supported_feature_attrs[] = {
 #ifdef CONFIG_BTRFS_EXPERIMENTAL
        BTRFS_FEAT_ATTR_PTR(extent_tree_v2),
        BTRFS_FEAT_ATTR_PTR(raid_stripe_tree),
+       BTRFS_FEAT_ATTR_PTR(remap_tree),
 #endif
 #ifdef CONFIG_FS_VERITY
        BTRFS_FEAT_ATTR_PTR(verity),
index c21c21adf61ed1116e8b50d190a53a76b4a754af..aedc208a95b83a252ad405f3719e0fee05a5b309 100644 (file)
@@ -913,12 +913,10 @@ int btrfs_check_chunk_valid(const struct btrfs_fs_info *fs_info,
                          length, btrfs_stripe_nr_to_offset(U32_MAX));
                return -EUCLEAN;
        }
-       if (unlikely(type & ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
-                             BTRFS_BLOCK_GROUP_PROFILE_MASK))) {
+       if (unlikely(type & ~BTRFS_BLOCK_GROUP_VALID)) {
                chunk_err(fs_info, leaf, chunk, logical,
                          "unrecognized chunk type: 0x%llx",
-                         ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
-                           BTRFS_BLOCK_GROUP_PROFILE_MASK) & type);
+                         type & ~BTRFS_BLOCK_GROUP_VALID);
                return -EUCLEAN;
        }
 
index eb201f4ec3c7e7f30a2ad0e4736369023d12ede1..833e2fd989ebb2ebf40a22ab6720cff240a0c136 100644 (file)
@@ -57,6 +57,11 @@ enum btrfs_tree_block_status {
        BTRFS_TREE_BLOCK_WRITTEN_NOT_SET,
 };
 
+
+#define BTRFS_BLOCK_GROUP_VALID        (BTRFS_BLOCK_GROUP_TYPE_MASK | \
+                                BTRFS_BLOCK_GROUP_PROFILE_MASK | \
+                                BTRFS_BLOCK_GROUP_REMAPPED)
+
 /*
  * Exported simply for btrfs-progs which wants to have the
  * btrfs_tree_block_status return codes.
index c4be17fcb87a404a8de6c6357f2eb3402e51278c..d2b7352eb7cbeb80d45e1d6d2633db80ea925066 100644 (file)
@@ -231,6 +231,7 @@ void btrfs_describe_block_groups(u64 bg_flags, char *buf, u32 size_buf)
        DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_DATA, "data");
        DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_SYSTEM, "system");
        DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_METADATA, "metadata");
+       DESCRIBE_FLAG(BTRFS_BLOCK_GROUP_REMAPPED, "remapped");
 
        DESCRIBE_FLAG(BTRFS_AVAIL_ALLOC_BIT_SINGLE, "single");
        for (i = 0; i < BTRFS_NR_RAID_TYPES; i++)
index e8fd92789423e12c17366b5b204bde71ca928ba6..9165154a274d949238361aebb4f1127e26e22df8 100644 (file)
@@ -336,6 +336,7 @@ struct btrfs_ioctl_fs_info_args {
 #define BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2  (1ULL << 13)
 #define BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE        (1ULL << 14)
 #define BTRFS_FEATURE_INCOMPAT_SIMPLE_QUOTA    (1ULL << 16)
+#define BTRFS_FEATURE_INCOMPAT_REMAP_TREE      (1ULL << 17)
 
 struct btrfs_ioctl_feature_flags {
        __u64 compat_flags;
index fc29d273845d8406cec45ffb4eaba284f1016c50..f011d34cb699b335dff4f7f438ba1f2b81f5fe2e 100644 (file)
@@ -76,6 +76,9 @@
 /* Tracks RAID stripes in block groups. */
 #define BTRFS_RAID_STRIPE_TREE_OBJECTID 12ULL
 
+/* Holds details of remapped addresses after relocation. */
+#define BTRFS_REMAP_TREE_OBJECTID 13ULL
+
 /* device stats in the device tree */
 #define BTRFS_DEV_STATS_OBJECTID 0ULL
 
 
 #define BTRFS_RAID_STRIPE_KEY  230
 
+#define BTRFS_IDENTITY_REMAP_KEY       234
+#define BTRFS_REMAP_KEY                        235
+#define BTRFS_REMAP_BACKREF_KEY                236
+
 /*
  * Records the overall state of the qgroups.
  * There's only one instance of this key present,
@@ -1161,6 +1168,7 @@ struct btrfs_dev_replace_item {
 #define BTRFS_BLOCK_GROUP_RAID6         (1ULL << 8)
 #define BTRFS_BLOCK_GROUP_RAID1C3       (1ULL << 9)
 #define BTRFS_BLOCK_GROUP_RAID1C4       (1ULL << 10)
+#define BTRFS_BLOCK_GROUP_REMAPPED      (1ULL << 11)
 #define BTRFS_BLOCK_GROUP_RESERVED     (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
                                         BTRFS_SPACE_INFO_GLOBAL_RSV)
 
@@ -1323,4 +1331,13 @@ struct btrfs_verity_descriptor_item {
        __u8 encryption;
 } __attribute__ ((__packed__));
 
+/*
+ * For a range identified by a BTRFS_REMAP_KEY item in the remap tree, gives
+ * the address that the start of the range will get remapped to.  This
+ * structure is also shared by BTRFS_REMAP_BACKREF_KEY.
+ */
+struct btrfs_remap_item {
+       __le64 address;
+} __attribute__ ((__packed__));
+
 #endif /* _BTRFS_CTREE_H_ */