btrfs: do not utilize goto to implement delayed inode ref deletion
authorQu Wenruo <wqu@suse.com>
Mon, 30 Oct 2023 21:07:20 +0000 (07:37 +1030)
committerDavid Sterba <dsterba@suse.com>
Fri, 15 Dec 2023 19:27:00 +0000 (20:27 +0100)
commit9ba7c686feb04f16088ca4523c204ed49b07fc0a
treebacd94b4a77f5492b20a3f06389833f37e2d5d1c
parent80d197fe04e87602be402337854321c59a31acf9
btrfs: do not utilize goto to implement delayed inode ref deletion

[PROBLEM]
The function __btrfs_update_delayed_inode() is doing something not
meeting the code standard of today:

path->slots[0]++
if (path->slots[0] >= btrfs_header_nritems(leaf))
goto search;
again:
if (!is_the_target_inode_ref())
goto out;
ret = btrfs_delete_item();
/* Some cleanup. */
return ret;

search:
ret = search_for_the_last_inode_ref();
goto again;

With the tag named "again", it's pretty common to think it's a loop, but
the truth is, we only need to do the search once, to locate the last
(also the first, since there should only be one INODE_REF or
INODE_EXTREF now) ref of the inode.

[FIX]
Instead of the weird jumps, just do them in a stream-lined fashion.
This removes those weird labels, and add extra comments on why we can do
the different searches.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c