Commit 1478143a authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: ref-verify: make sure owner is set for all refs

I noticed that shared ref entries in ref-verify didn't have the proper
owner set, which caused me to think there was something seriously wrong.
However the problem is if we have a parent we simply weren't filling out
the owner part of the reference, even though we have it.

Fix this by making sure we set all the proper fields when we modify a
reference, this way we'll have the proper owner if a problem happens and
we don't waste time thinking we're updating the wrong level.
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0d73a11c
...@@ -669,18 +669,18 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info, ...@@ -669,18 +669,18 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
u64 bytenr = generic_ref->bytenr; u64 bytenr = generic_ref->bytenr;
u64 num_bytes = generic_ref->len; u64 num_bytes = generic_ref->len;
u64 parent = generic_ref->parent; u64 parent = generic_ref->parent;
u64 ref_root; u64 ref_root = 0;
u64 owner; u64 owner = 0;
u64 offset; u64 offset = 0;
if (!btrfs_test_opt(fs_info, REF_VERIFY)) if (!btrfs_test_opt(fs_info, REF_VERIFY))
return 0; return 0;
if (generic_ref->type == BTRFS_REF_METADATA) { if (generic_ref->type == BTRFS_REF_METADATA) {
ref_root = generic_ref->tree_ref.root; if (!parent)
ref_root = generic_ref->tree_ref.root;
owner = generic_ref->tree_ref.level; owner = generic_ref->tree_ref.level;
offset = 0; } else if (!parent) {
} else {
ref_root = generic_ref->data_ref.ref_root; ref_root = generic_ref->data_ref.ref_root;
owner = generic_ref->data_ref.ino; owner = generic_ref->data_ref.ino;
offset = generic_ref->data_ref.offset; offset = generic_ref->data_ref.offset;
...@@ -696,13 +696,10 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info, ...@@ -696,13 +696,10 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
goto out; goto out;
} }
if (parent) { ref->parent = parent;
ref->parent = parent; ref->owner = owner;
} else { ref->root_objectid = ref_root;
ref->root_objectid = ref_root; ref->offset = offset;
ref->owner = owner;
ref->offset = offset;
}
ref->num_refs = (action == BTRFS_DROP_DELAYED_REF) ? -1 : 1; ref->num_refs = (action == BTRFS_DROP_DELAYED_REF) ? -1 : 1;
memcpy(&ra->ref, ref, sizeof(struct ref_entry)); memcpy(&ra->ref, ref, sizeof(struct ref_entry));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment