Message ID | 20220302164829.17524-13-gniebler@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: Introduce macro to iterate over slots | expand |
On Wed, Mar 02, 2022 at 05:48:27PM +0100, Gabriel Niebler wrote: > This function can be simplified by refactoring to use the new iterator macro. > > No functional changes. > > Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com> > Signed-off-by: Gabriel Niebler <gniebler@suse.com> > --- > fs/btrfs/send.c | 36 +++++++++++++----------------------- > 1 file changed, 13 insertions(+), 23 deletions(-) > > diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c > index 7e40c73bb912..af3668279875 100644 > --- a/fs/btrfs/send.c > +++ b/fs/btrfs/send.c > @@ -6119,8 +6119,11 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) > { > LIST_HEAD(deleted_refs); > struct btrfs_path *path; > + struct btrfs_root *root = sctx->parent_root; > struct btrfs_key key; > + struct btrfs_key found_key; > struct parent_paths_ctx ctx; > + int iter_ret = 0; > int ret; > > path = alloc_path_for_send(); > @@ -6130,39 +6133,26 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) > key.objectid = sctx->cur_ino; > key.type = BTRFS_INODE_REF_KEY; > key.offset = 0; > - ret = btrfs_search_slot(NULL, sctx->parent_root, &key, path, 0, 0); > - if (ret < 0) > - goto out; > > ctx.refs = &deleted_refs; > ctx.sctx = sctx; > > - while (true) { > - struct extent_buffer *eb = path->nodes[0]; > - int slot = path->slots[0]; > - > - if (slot >= btrfs_header_nritems(eb)) { > - ret = btrfs_next_leaf(sctx->parent_root, path); > - if (ret < 0) > - goto out; > - else if (ret > 0) > - break; > - continue; > - } > - > - btrfs_item_key_to_cpu(eb, &key, slot); > - if (key.objectid != sctx->cur_ino) > + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { > + if (found_key.objectid != key.objectid) > break; > - if (key.type != BTRFS_INODE_REF_KEY && > - key.type != BTRFS_INODE_EXTREF_KEY) > + if (found_key.type != key.type && > + found_key.type != BTRFS_INODE_EXTREF_KEY) > break; > > - ret = iterate_inode_ref(sctx->parent_root, path, &key, 1, > + ret = iterate_inode_ref(root, path, &key, 1, > record_parent_ref, &ctx); This patch is causing btrfs/168 to fail, this should be &found_key, not &key. Thanks, Josef
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 7e40c73bb912..af3668279875 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -6119,8 +6119,11 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) { LIST_HEAD(deleted_refs); struct btrfs_path *path; + struct btrfs_root *root = sctx->parent_root; struct btrfs_key key; + struct btrfs_key found_key; struct parent_paths_ctx ctx; + int iter_ret = 0; int ret; path = alloc_path_for_send(); @@ -6130,39 +6133,26 @@ static int btrfs_unlink_all_paths(struct send_ctx *sctx) key.objectid = sctx->cur_ino; key.type = BTRFS_INODE_REF_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, sctx->parent_root, &key, path, 0, 0); - if (ret < 0) - goto out; ctx.refs = &deleted_refs; ctx.sctx = sctx; - while (true) { - struct extent_buffer *eb = path->nodes[0]; - int slot = path->slots[0]; - - if (slot >= btrfs_header_nritems(eb)) { - ret = btrfs_next_leaf(sctx->parent_root, path); - if (ret < 0) - goto out; - else if (ret > 0) - break; - continue; - } - - btrfs_item_key_to_cpu(eb, &key, slot); - if (key.objectid != sctx->cur_ino) + btrfs_for_each_slot(root, &key, &found_key, path, iter_ret) { + if (found_key.objectid != key.objectid) break; - if (key.type != BTRFS_INODE_REF_KEY && - key.type != BTRFS_INODE_EXTREF_KEY) + if (found_key.type != key.type && + found_key.type != BTRFS_INODE_EXTREF_KEY) break; - ret = iterate_inode_ref(sctx->parent_root, path, &key, 1, + ret = iterate_inode_ref(root, path, &key, 1, record_parent_ref, &ctx); if (ret < 0) goto out; - - path->slots[0]++; + } + /* Catch error found on iteration */ + if (iter_ret < 0) { + ret = iter_ret; + goto out; } while (!list_empty(&deleted_refs)) {