Message ID | 20210804184854.10696-3-mpdesouza@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: Use btrfs_find_item whenever possible | expand |
On 2021/8/5 上午2:48, Marcos Paulo de Souza wrote: > btrfs_find_one_extref is using btrfs_search_slot and iterating over the > slots, but in reality it only desires to find an extref, since there is > a break without any condition at the end of the while clause. > > The function can be dramatically simplified by using btrfs_find_item, which > calls the btrfs_search_slot, compares if the objectid and type found > are the same of those passed as search key, and calls > btrfs_item_key_to_cpu if no error was found. > > No functional changes. > > Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com> Reviewed-by: Qu Wenruo <wqu@suse.com> But a small nitpick inlined below. > --- > fs/btrfs/backref.c | 64 ++++++++-------------------------------------- > 1 file changed, 11 insertions(+), 53 deletions(-) > > diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c > index 9e92faaafa02..57b955c8a875 100644 > --- a/fs/btrfs/backref.c > +++ b/fs/btrfs/backref.c > @@ -1588,67 +1588,25 @@ int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid, > struct btrfs_inode_extref **ret_extref, > u64 *found_off) > { > - int ret, slot; > + int ret; > struct btrfs_key key; > - struct btrfs_key found_key; > struct btrfs_inode_extref *extref; > - const struct extent_buffer *leaf; > unsigned long ptr; > > - key.objectid = inode_objectid; > - key.type = BTRFS_INODE_EXTREF_KEY; > - key.offset = start_off; > - > - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); > + ret = btrfs_find_item(root, path, inode_objectid, BTRFS_INODE_EXTREF_KEY, > + start_off, &key); > if (ret < 0) > return ret; > + else if (ret > 0) > + return -ENOENT; > > - while (1) { > - leaf = path->nodes[0]; > - slot = path->slots[0]; > - if (slot >= btrfs_header_nritems(leaf)) { > - /* > - * If the item at offset is not found, > - * btrfs_search_slot will point us to the slot > - * where it should be inserted. In our case > - * that will be the slot directly before the > - * next INODE_REF_KEY_V2 item. In the case > - * that we're pointing to the last slot in a > - * leaf, we must move one leaf over. > - */ > - ret = btrfs_next_leaf(root, path); > - if (ret) { > - if (ret >= 1) > - ret = -ENOENT; > - break; > - } > - continue; > - } > - > - btrfs_item_key_to_cpu(leaf, &found_key, slot); > - > - /* > - * Check that we're still looking at an extended ref key for > - * this particular objectid. If we have different > - * objectid or type then there are no more to be found > - * in the tree and we can exit. > - */ > - ret = -ENOENT; > - if (found_key.objectid != inode_objectid) > - break; > - if (found_key.type != BTRFS_INODE_EXTREF_KEY) > - break; > - > - ret = 0; > - ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); > - extref = (struct btrfs_inode_extref *)ptr; > - *ret_extref = extref; > - if (found_off) > - *found_off = found_key.offset; > - break; > - } > + ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]); @ptr is only a temporary variable. We can replace it with: extref = btrfs_item_ptr(path->nodes[0], path->slots[0], struct btrfs_inode_extref); Thanks, Qu > + extref = (struct btrfs_inode_extref *)ptr; > + *ret_extref = extref; > + if (found_off) > + *found_off = key.offset; > > - return ret; > + return 0; > } > > /* >
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 9e92faaafa02..57b955c8a875 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1588,67 +1588,25 @@ int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid, struct btrfs_inode_extref **ret_extref, u64 *found_off) { - int ret, slot; + int ret; struct btrfs_key key; - struct btrfs_key found_key; struct btrfs_inode_extref *extref; - const struct extent_buffer *leaf; unsigned long ptr; - key.objectid = inode_objectid; - key.type = BTRFS_INODE_EXTREF_KEY; - key.offset = start_off; - - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + ret = btrfs_find_item(root, path, inode_objectid, BTRFS_INODE_EXTREF_KEY, + start_off, &key); if (ret < 0) return ret; + else if (ret > 0) + return -ENOENT; - while (1) { - leaf = path->nodes[0]; - slot = path->slots[0]; - if (slot >= btrfs_header_nritems(leaf)) { - /* - * If the item at offset is not found, - * btrfs_search_slot will point us to the slot - * where it should be inserted. In our case - * that will be the slot directly before the - * next INODE_REF_KEY_V2 item. In the case - * that we're pointing to the last slot in a - * leaf, we must move one leaf over. - */ - ret = btrfs_next_leaf(root, path); - if (ret) { - if (ret >= 1) - ret = -ENOENT; - break; - } - continue; - } - - btrfs_item_key_to_cpu(leaf, &found_key, slot); - - /* - * Check that we're still looking at an extended ref key for - * this particular objectid. If we have different - * objectid or type then there are no more to be found - * in the tree and we can exit. - */ - ret = -ENOENT; - if (found_key.objectid != inode_objectid) - break; - if (found_key.type != BTRFS_INODE_EXTREF_KEY) - break; - - ret = 0; - ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); - extref = (struct btrfs_inode_extref *)ptr; - *ret_extref = extref; - if (found_off) - *found_off = found_key.offset; - break; - } + ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]); + extref = (struct btrfs_inode_extref *)ptr; + *ret_extref = extref; + if (found_off) + *found_off = key.offset; - return ret; + return 0; } /*
btrfs_find_one_extref is using btrfs_search_slot and iterating over the slots, but in reality it only desires to find an extref, since there is a break without any condition at the end of the while clause. The function can be dramatically simplified by using btrfs_find_item, which calls the btrfs_search_slot, compares if the objectid and type found are the same of those passed as search key, and calls btrfs_item_key_to_cpu if no error was found. No functional changes. Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com> --- fs/btrfs/backref.c | 64 ++++++++-------------------------------------- 1 file changed, 11 insertions(+), 53 deletions(-)