Commit c3193108 authored by Jan Schmidt's avatar Jan Schmidt

Btrfs: fix tree mod log rewinded level and rewinding of moved keys

When we rewind REMOVE_WHILE_FREEING operations, there's code that allocates
a fresh buffer instead of cloning the old one. Setting that buffer's level
correctly was missing in this case.

When rewinding a MOVE_KEYS operation, btrfs_node_key_ptr_offset(slot) was
missing for memmove_extent_buffer()'s arguments.
Signed-off-by: default avatarJan Schmidt <list.btrfs@jan-o-sch.net>
parent f395694c
...@@ -1076,7 +1076,9 @@ __tree_mod_log_rewind(struct extent_buffer *eb, u64 time_seq, ...@@ -1076,7 +1076,9 @@ __tree_mod_log_rewind(struct extent_buffer *eb, u64 time_seq,
n--; n--;
break; break;
case MOD_LOG_MOVE_KEYS: case MOD_LOG_MOVE_KEYS:
memmove_extent_buffer(eb, tm->slot, tm->move.dst_slot, o_dst = btrfs_node_key_ptr_offset(tm->slot);
o_src = btrfs_node_key_ptr_offset(tm->move.dst_slot);
memmove_extent_buffer(eb, o_dst, o_src,
tm->move.nr_items * p_size); tm->move.nr_items * p_size);
break; break;
case MOD_LOG_ROOT_REPLACE: case MOD_LOG_ROOT_REPLACE:
...@@ -1127,6 +1129,7 @@ tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct extent_buffer *eb, ...@@ -1127,6 +1129,7 @@ tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
btrfs_set_header_backref_rev(eb_rewin, btrfs_set_header_backref_rev(eb_rewin,
btrfs_header_backref_rev(eb)); btrfs_header_backref_rev(eb));
btrfs_set_header_owner(eb_rewin, btrfs_header_owner(eb)); btrfs_set_header_owner(eb_rewin, btrfs_header_owner(eb));
btrfs_set_header_level(eb_rewin, btrfs_header_level(eb));
} else { } else {
eb_rewin = btrfs_clone_extent_buffer(eb); eb_rewin = btrfs_clone_extent_buffer(eb);
BUG_ON(!eb_rewin); BUG_ON(!eb_rewin);
...@@ -2609,7 +2612,6 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, ...@@ -2609,7 +2612,6 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key,
} }
again: again:
level = 0;
b = get_old_root(root, time_seq); b = get_old_root(root, time_seq);
extent_buffer_get(b); extent_buffer_get(b);
level = btrfs_header_level(b); level = btrfs_header_level(b);
......
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