summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-python/btrfs/files/13-004-add-Block-Group-Tree.patch')
-rw-r--r--dev-python/btrfs/files/13-004-add-Block-Group-Tree.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/dev-python/btrfs/files/13-004-add-Block-Group-Tree.patch b/dev-python/btrfs/files/13-004-add-Block-Group-Tree.patch
new file mode 100644
index 000000000000..8e21581237bc
--- /dev/null
+++ b/dev-python/btrfs/files/13-004-add-Block-Group-Tree.patch
@@ -0,0 +1,110 @@
+
+Patch from:
+https://github.com/knorrie/python-btrfs/commit/7d8dca5bf1211843d8fd5c02b118afddaa53bee8
+
+From 7d8dca5bf1211843d8fd5c02b118afddaa53bee8 Mon Sep 17 00:00:00 2001
+From: Hans van Kranenburg <hans@knorrie.org>
+Date: Sun, 21 May 2023 17:46:06 +0200
+Subject: [PATCH] WIP ctree,ioctl,utils: Add Block Group Tree
+
+When the block_group_tree feature is enabled on a filesystem, we have to
+look up Block Group metadata items in the new Block Group Tree, instead
+of the Extent Tree, where they always were located before.
+
+WIP: We don't want to call the get_features ioctl *every* time we look
+up 1 block group object, but we also cannot just cache the result of it,
+since some feature flags can change while the fs is mounted.
+
+So, this needs some extra work in the features department first to make
+this more nice.
+--- a/btrfs/ctree.py
++++ b/btrfs/ctree.py
+@@ -91,6 +91,7 @@ def _struct_format(s):
+ QUOTA_TREE_OBJECTID = 8 #: Quota tree
+ UUID_TREE_OBJECTID = 9 #: Subvolume UUID tree
+ FREE_SPACE_TREE_OBJECTID = 10 #: Free space tree
++BLOCK_GROUP_TREE_OBJECTID = 11 #: Block group tree
+
+ DEV_STATS_OBJECTID = 0 #: Object ID of device statistics in the Device tree.
+ BALANCE_OBJECTID = ULL(-4) #: Object ID to store balance status. (-4)
+@@ -346,6 +347,7 @@ def _qgroup_objectid(level, subvid):
+ QUOTA_TREE_OBJECTID: 'QUOTA_TREE',
+ UUID_TREE_OBJECTID: 'UUID_TREE',
+ FREE_SPACE_TREE_OBJECTID: 'FREE_SPACE_TREE',
++ BLOCK_GROUP_TREE_OBJECTID: 'BLOCK_GROUP_TREE',
+ BALANCE_OBJECTID: 'BALANCE',
+ ORPHAN_OBJECTID: 'ORPHAN',
+ TREE_LOG_OBJECTID: 'TREE_LOG',
+@@ -765,6 +767,11 @@ def __init__(self, path):
+ self.fsid = _fs_info.fsid
+ self.nodesize = _fs_info.nodesize
+ self.sectorsize = _fs_info.sectorsize
++ # TEMP cached feature flag for block_group_tree TEMP
++ _features = self.features()
++ self._block_group_tree = self.features().compat_ro_flags & \
++ btrfs.ioctl.FEATURE_COMPAT_RO_BLOCK_GROUP_TREE != 0
++ # TEMP cached feature flag for block_group_tree TEMP
+
+ def __enter__(self):
+ return self
+@@ -870,7 +877,10 @@ def block_group(self, vaddr, length=None):
+ :raises: :class:`ItemNotFoundError` if no Block Group Item can be found
+ at the address.
+ """
+- tree = EXTENT_TREE_OBJECTID
++ if not self._block_group_tree:
++ tree = EXTENT_TREE_OBJECTID
++ else:
++ tree = BLOCK_GROUP_TREE_OBJECTID
+ min_offset = length if length is not None else 0
+ max_offset = length if length is not None else ULLONG_MAX
+ min_key = Key(vaddr, BLOCK_GROUP_ITEM_KEY, min_offset)
+@@ -1240,11 +1250,14 @@ class BlockGroupItem(ItemData):
+ The `Block Group` has a 1 to 1 relationship with a `Chunk` and tracks some
+ usage information about a range of virtual address space.
+
+- * Tree: `EXTENT_TREE_OBJECTID` (2)
++ * Tree: `EXTENT_TREE_OBJECTID` (2) or `BLOCK_GROUP_TREE_OBJECTID` (11)
+ * Key objectid: Virtual address.
+ * Key type: `BLOCK_GROUP_ITEM_KEY` (192)
+ * Key offset: Block Group length.
+
++ If the block_group_tree feature is enabled on the filesystem, these items
++ can be found inside the Block Group Tree instead of the Extent Tree.
++
+ :ivar int vaddr: Virtual address where the Bock Group starts (taken from
+ the objectid field of the item key).
+ :ivar int length: Block Group length in bytes (taken from the offset field
+--- a/btrfs/ioctl.py
++++ b/btrfs/ioctl.py
+@@ -1325,10 +1325,12 @@ def _compat_flags_str(flags):
+
+ FEATURE_COMPAT_RO_FREE_SPACE_TREE = 1 << 0
+ FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID = 1 << 1
++FEATURE_COMPAT_RO_BLOCK_GROUP_TREE = 1 << 3
+
+ _feature_compat_ro_str_map = {
+ FEATURE_COMPAT_RO_FREE_SPACE_TREE: 'free_space_tree',
+ FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID: 'free_space_tree_valid',
++ FEATURE_COMPAT_RO_BLOCK_GROUP_TREE : 'block_group_tree',
+ }
+
+
+@@ -1383,6 +1385,7 @@ class FeatureFlags(object):
+
+ - FEATURE_COMPAT_RO_FREE_SPACE_TREE
+ - FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID
++ - FEATURE_COMPAT_RO_BLOCK_GROUP_TREE
+
+ Known incompat_flags (available as attribute of this module) are:
+
+--- a/btrfs/utils.py
++++ b/btrfs/utils.py
+@@ -436,6 +436,7 @@ def embedded_text_for_str(text):
+ 'quota': btrfs.ctree.QUOTA_TREE_OBJECTID,
+ 'uuid': btrfs.ctree.UUID_TREE_OBJECTID,
+ 'free_space': btrfs.ctree.FREE_SPACE_TREE_OBJECTID,
++ 'block_group': btrfs.ctree.BLOCK_GROUP_TREE_OBJECTID,
+ 'tree_log': btrfs.ctree.TREE_LOG_OBJECTID,
+ 'tree_log_fixup': btrfs.ctree.TREE_LOG_FIXUP_OBJECTID,
+ 'tree_reloc': btrfs.ctree.TREE_RELOC_OBJECTID,