]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix invalid extref key setup when replaying dentry
authorFilipe Manana <fdmanana@suse.com>
Wed, 3 Sep 2025 15:53:21 +0000 (16:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Sep 2025 09:16:41 +0000 (11:16 +0200)
[ Upstream commit b62fd63ade7cb573b114972ef8f9fa505be8d74a ]

The offset for an extref item's key is not the object ID of the parent
dir, otherwise we would not need the extref item and would use plain ref
items. Instead the offset is the result of a hash computation that uses
the object ID of the parent dir and the name associated to the entry.
So fix this by setting the key offset at replay_one_name() to be the
result of calling btrfs_extref_hash().

Fixes: 725af92a6251 ("btrfs: Open-code name_in_log_ref in replay_one_name")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/tree-log.c

index 56d30ec0f52fca905a42f33373873137a7d4b3cc..5466a93a28f58fc6020b6d96ce6c877bbf7bc643 100644 (file)
@@ -1933,7 +1933,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
 
        search_key.objectid = log_key.objectid;
        search_key.type = BTRFS_INODE_EXTREF_KEY;
-       search_key.offset = key->objectid;
+       search_key.offset = btrfs_extref_hash(key->objectid, name.name, name.len);
        ret = backref_in_log(root->log_root, &search_key, key->objectid, &name);
        if (ret < 0) {
                goto out;