On Fri, May 5, 2023 at 11:09 AM David Sterba dsterba@suse.cz wrote:
On Thu, May 04, 2023 at 11:12:03AM +0100, fdmanana@kernel.org wrote:
From: Filipe Manana fdmanana@suse.com
When using the logical to ino ioctl v2, if the flag to ignore offsets of file extent items (BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET) is given, the backref walking code ends up not returning references for all file offsets of an inode that point to the given logical bytenr. This happens since kernel 6.2, commit 6ce6ba534418 ("btrfs: use a single argument for extent offset in backref walking functions"), as it mistakenly skipped the search for file extent items in a leaf that point to the target extent if that flag is given. Instead it should only skip the filtering done by check_extent_in_eb() - that is, it should not avoid the calls to that function (or find_extent_in_eb(), which uses it).
So fix this by always calling check_extent_in_eb() and find_extent_in_eb() and have check_extent_in_eb() do the filtering only if the flag to ignore offsets is set.
Fixes: 6ce6ba534418 ("btrfs: use a single argument for extent offset in backref walking functions") Reported-by: Vladimir Panteleev git@vladimir.panteleev.md Link: https://lore.kernel.org/linux-btrfs/CAHhfkvwo=nmzrJSqZ2qMfF-rZB-ab6ahHnCD_sq... Tested-by: Vladimir Panteleev git@vladimir.panteleev.md CC: stable@vger.kernel.org # 6.2+ Signed-off-by: Filipe Manana fdmanana@suse.com
V2: Remove wrong check for a non-zero extent item offset. Apply the same logic at find_parent_nodes(), that is, search for file extent items on a leaf if the ignore flag is given - the filtering will be done later at check_extent_in_eb(). Spotted by Vladimir Panteleev in the thread mentioned above.
Replaced in misc-next, thanks for the quick fix.
Can you please remove it in the meanwhile? I noticed this isn't quite right and there's still two cases not working as they should be. I'll send a v3 after finishing some more tests, probably tomorrow if everything goes fine.
Thanks.