On 2020/2/14 下午2:33, Qu Wenruo wrote: > This function will go next inline/keyed backref for > btrfs_backref_iterator infrastructure. > > Signed-off-by: Qu Wenruo > --- > fs/btrfs/backref.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 48 insertions(+) > > diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c > index 73c4829609c9..0f231cd69675 100644 > --- a/fs/btrfs/backref.c > +++ b/fs/btrfs/backref.c > @@ -2310,3 +2310,51 @@ int btrfs_backref_iterator_start(struct btrfs_backref_iterator *iterator, > btrfs_release_path(path); > return ret; > } > + > +int btrfs_backref_iterator_next(struct btrfs_backref_iterator *iterator) > +{ > + struct extent_buffer *eb = btrfs_backref_get_eb(iterator); > + struct btrfs_path *path = iterator->path; > + struct btrfs_extent_inline_ref *iref; > + int ret; > + u32 size; > + > + if (iterator->cur_key.type == BTRFS_EXTENT_ITEM_KEY || > + iterator->cur_key.type == BTRFS_METADATA_ITEM_KEY) { > + /* We're still inside the inline refs */ > + if (btrfs_backref_has_tree_block_info(iterator)) { > + /* First tree block info */ > + size = sizeof(struct btrfs_tree_block_info); > + } else { > + /* Use inline ref type to determine the size */ > + int type; > + > + iref = (struct btrfs_extent_inline_ref *) > + (iterator->cur_ptr); > + type = btrfs_extent_inline_ref_offset(eb, iref); Oh, I'm blindly complete the function name without checking the last word. > + > + size = btrfs_extent_inline_ref_size(type); > + } > + iterator->cur_ptr += size; > + if (iterator->cur_ptr < iterator->end_ptr) > + return 0; > + > + /* All inline items iterated, fall through */ > + } > + /* We're at keyed items, there is no inline item, just go next item */ > + ret = btrfs_next_item(iterator->fs_info->extent_root, iterator->path); > + if (ret > 0 || ret < 0) > + return ret; > + > + btrfs_item_key_to_cpu(path->nodes[0], &iterator->cur_key, > + path->slots[0]); > + if (iterator->cur_key.objectid != iterator->bytenr || > + (iterator->cur_key.type != BTRFS_TREE_BLOCK_REF_KEY && > + iterator->cur_key.type != BTRFS_SHARED_BLOCK_REF_KEY)) > + return 1; > + iterator->item_ptr = btrfs_item_ptr_offset(path->nodes[0], > + path->slots[0]); > + iterator->cur_ptr = iterator->item_ptr; > + iterator->end_ptr = btrfs_item_end_nr(path->nodes[0], path->slots[0]); > + return 0; > +} >