On Mon, Nov 02, 2020 at 03:37:35PM -0500, Josef Bacik wrote:
On 10/30/20 9:51 AM, Naohiro Aota wrote:
Conventional zones do not have a write pointer, so we cannot use it to
determine the allocation offset if a block group contains a conventional
zone.
But instead, we can consider the end of the last allocated extent in the
block group as an allocation offset.
Signed-off-by: Naohiro Aota <naohiro.aota@xxxxxxx>
---
fs/btrfs/zoned.c | 119 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 113 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 0aa821893a51..8f58d0853cc3 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -740,6 +740,104 @@ int btrfs_ensure_empty_zones(struct btrfs_device *device, u64 start, u64 size)
return 0;
}
+static int emulate_write_pointer(struct btrfs_block_group *cache,
+ u64 *offset_ret)
+{
+ struct btrfs_fs_info *fs_info = cache->fs_info;
+ struct btrfs_root *root = fs_info->extent_root;
+ struct btrfs_path *path;
+ struct extent_buffer *leaf;
+ struct btrfs_key search_key;
+ struct btrfs_key found_key;
+ int slot;
+ int ret;
+ u64 length;
+
+ path = btrfs_alloc_path();
+ if (!path)
+ return -ENOMEM;
+
+ search_key.objectid = cache->start + cache->length;
+ search_key.type = 0;
+ search_key.offset = 0;
+
You can just use 'key', don't have to use 'search_key'.
Fixed.
Also you don't check for things like BTRFS_TREE_BLOCK_REF_KEY or
whatever in the case that we don't have an inline extent ref, so this
could error out with a fs with lots of snapshots and different
references. What you need is to search back until you hit an
BTRFS_METADATA_ITEM_KEY or a BTRFS_EXTENT_ITEM_KEY, and then check the
offset of that thing. Otherwise this will screw up. Thanks,
Josef
I overlooked that case. And, I just noticed we can use
btrfs_previous_extent_item() here. It looks much simpler now. Thanks.