On 17.02.20 г. 8:31 ч., Qu Wenruo wrote:
> Due to the complex nature of btrfs extent tree, when we want to iterate
> all backrefs of one extent, it involves quite a lot of work, like
> searching the EXTENT_ITEM/METADATA_ITEM, iteration through inline and keyed
> backrefs.
>
> Normally this would result pretty complex code, something like:
> btrfs_search_slot()
> /* Ensure we are at EXTENT_ITEM/METADATA_ITEM */
> while (1) { /* Loop for extent tree items */
> while (ptr < end) { /* Loop for inlined items */
> /* REAL WORK HERE */
> }
> next:
> ret = btrfs_next_item()
> /* Ensure we're still at keyed item for specified bytenr */
> }
>
> The idea of btrfs_backref_iterator is to avoid such complex and hard to
> read code structure, but something like the following:
>
> iterator = btrfs_backref_iterator_alloc();
> ret = btrfs_backref_iterator_start(iterator, bytenr);
> if (ret < 0)
> goto out;
> for (; ; ret = btrfs_backref_iterator_next(iterator)) {
> /* REAL WORK HERE */
> }
> out:
> btrfs_backref_iterator_free(iterator);
>
> This patch is just the skeleton + btrfs_backref_iterator_start() code.
>
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx>