btrfs: track changes to tree blocks' key
PATCH 2/5 btrfs: track changes to tree blocks' key
update key stored in back-reference after tree block's key changes.
Signed-off-by Yan Zheng <[email protected]>
---
fs/btrfs/ctree.c +60 -9
@@ -348,10 +348,8 @@ static noinline int update_ref_for_cow(sBUG_ON (ret); }if (new_flags !=0 ) { - ret =btrfs_set_disk_extent_flags (trans, root, - buf->start, - buf->len, - new_flags,0 ); + ret =btrfs_update_tree_block_info (trans, root, buf, +NULL , new_flags,0 );BUG_ON (ret); } }else {
@@ -1126,6 +1124,10 @@ static noinline int balance_level(structbtrfs_node_key (right, &right_key,0 );btrfs_set_node_key (parent, &right_key, pslot +1 );btrfs_mark_buffer_dirty (parent); + + wret =btrfs_update_tree_block_key (trans, root, + right, &right_key); +BUG_ON (wret); } }if (btrfs_header_nritems (mid) ==1 ) {
@@ -1167,6 +1169,10 @@ static noinline int balance_level(structbtrfs_node_key (mid, &mid_key,0 );btrfs_set_node_key (parent, &mid_key, pslot);btrfs_mark_buffer_dirty (parent); + + wret =btrfs_update_tree_block_key (trans, root, + mid, &mid_key); +BUG_ON (wret); }/* update the path */
@@ -1266,6 +1272,11 @@ static noinline int push_nodes_for_inserbtrfs_node_key (mid, &disk_key,0 );btrfs_set_node_key (parent, &disk_key, pslot);btrfs_mark_buffer_dirty (parent); + + wret =btrfs_update_tree_block_key (trans, root, + mid, &disk_key); +BUG_ON (wret); +if (btrfs_header_nritems (left) > orig_slot) { path->nodes[level] = left; path->slots[level +1 ] -=1 ;
@@ -1318,6 +1329,10 @@ static noinline int push_nodes_for_inserbtrfs_set_node_key (parent, &disk_key, pslot +1 );btrfs_mark_buffer_dirty (parent); + wret =btrfs_update_tree_block_key (trans, root, + right, &disk_key); +BUG_ON (wret); +if (btrfs_header_nritems (mid) <= orig_slot) { path->nodes[level] = right; path->slots[level +1 ] +=1 ;
@@ -1893,6 +1908,8 @@ static int fixup_low_keys(struct btrfs_tbtrfs_mark_buffer_dirty (path->nodes[i]);if (tslot !=0 )break ; + ret =btrfs_update_tree_block_key (trans, root, t, key); +BUG_ON (ret); }return ret; }
@@ -1927,9 +1944,13 @@ int btrfs_set_item_key_safe(struct btrfsbtrfs_cpu_key_to_disk (&disk_key, new_key);btrfs_set_item_key (eb, &disk_key, slot);btrfs_mark_buffer_dirty (eb); -if (slot ==0 ) +if (slot ==0 ) { +int ret; +btrfs_set_path_blocking (path); + ret =btrfs_update_tree_block_key (trans, root, eb, &disk_key); +BUG_ON (ret);fixup_low_keys (trans, root, path, &disk_key,1 ); - + }return 0 ; }
@@ -2312,6 +2333,7 @@ static noinline int __push_leaf_right(ststruct extent_buffer *upper = path->nodes[1 ];struct btrfs_disk_key disk_key;int slot; +int ret;u32 i;int push_space =0 ;int push_items =0 ;
@@ -2439,6 +2461,9 @@ static noinline int __push_leaf_right(stbtrfs_set_node_key (upper, &disk_key, slot +1 );btrfs_mark_buffer_dirty (upper); + ret =btrfs_update_tree_block_key (trans, root, right, &disk_key); +BUG_ON (ret); +/* then fixup the leaf pointer in the path */ if (path->slots[0 ] >= left_nritems) { path->slots[0 ] -= left_nritems;
@@ -2677,6 +2702,10 @@ static noinline int __push_leaf_left(strif (right_nritems) {btrfs_mark_buffer_dirty (right);btrfs_item_key (right, &disk_key,0 ); + wret =btrfs_update_tree_block_key (trans, root, right, + &disk_key); +BUG_ON (wret); + wret =fixup_low_keys (trans, root, path, &disk_key,1 );if (wret) ret = wret;
@@ -3324,8 +3353,13 @@ int btrfs_truncate_item(struct btrfs_tra offset =btrfs_disk_key_offset (&disk_key);btrfs_set_disk_key_offset (&disk_key, offset + size_diff);btrfs_set_item_key (leaf, &disk_key, slot); -if (slot ==0 ) +if (slot ==0 ) { +btrfs_set_path_blocking (path); + ret =btrfs_update_tree_block_key (trans, root, + leaf, &disk_key); +BUG_ON (ret);fixup_low_keys (trans, root, path, &disk_key,1 ); + } } item =btrfs_item_nr (leaf, slot);
@@ -3561,6 +3595,11 @@ int btrfs_insert_some_items(struct btrfs ret =0 ;if (slot ==0 ) {btrfs_cpu_key_to_disk (&disk_key, cpu_key); + +btrfs_set_path_blocking (path); + ret =btrfs_update_tree_block_key (trans, root, leaf, + &disk_key); +BUG_ON (ret); ret =fixup_low_keys (trans, root, path, &disk_key,1 ); }
@@ -3669,6 +3708,11 @@ setup_items_for_insert(struct btrfs_tranif (slot ==0 ) {struct btrfs_disk_key disk_key;btrfs_cpu_key_to_disk (&disk_key, cpu_key); + +btrfs_set_path_blocking (path); + ret =btrfs_update_tree_block_key (trans, root, leaf, + &disk_key); +BUG_ON (ret); ret =fixup_low_keys (trans, root, path, &disk_key,1 ); }btrfs_unlock_up_safe (path,1 );
@@ -3775,8 +3819,11 @@ static int del_ptr(struct btrfs_trans_habtrfs_set_header_level (root->node,0 ); }else if (slot ==0 ) {struct btrfs_disk_key disk_key; -btrfs_node_key (parent, &disk_key,0 ); + + ret =btrfs_update_tree_block_key (trans, root, parent, + &disk_key); +BUG_ON (ret); wret =fixup_low_keys (trans, root, path, &disk_key, level +1 );if (wret) ret = wret;
@@ -3893,8 +3940,12 @@ int btrfs_del_items(struct btrfs_trans_hint used =leaf_space_used (leaf,0 , nritems);if (slot ==0 ) {struct btrfs_disk_key disk_key; -btrfs_item_key (leaf, &disk_key,0 ); + +btrfs_set_path_blocking (path); + wret =btrfs_update_tree_block_key (trans, root, + leaf, &disk_key); +BUG_ON (wret); wret =fixup_low_keys (trans, root, path, &disk_key,1 );if (wret)
fs/btrfs/ctree.h +8 -3
@@ -2013,10 +2013,15 @@ int btrfs_inc_ref(struct btrfs_trans_han struct extent_buffer *buf, int full_backref);int btrfs_dec_ref (struct btrfs_trans_handle *trans,struct btrfs_root *root,struct extent_buffer *buf,int full_backref); -int btrfs_set_disk_extent_flags (struct btrfs_trans_handle *trans, +int btrfs_update_tree_block_key (struct btrfs_trans_handle *trans,struct btrfs_root *root, -u64 bytenr,u64 num_bytes,u64 flags, -int is_data); +struct extent_buffer *eb, +struct btrfs_disk_key *key); +int btrfs_update_tree_block_info (struct btrfs_trans_handle *trans, +struct btrfs_root *root, +struct extent_buffer *eb, +struct btrfs_disk_key *key, +u64 flags_to_set,int update_gen); int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 bytenr, u64 num_bytes, u64 parent,
fs/btrfs/delayed-ref.c +3 -0
@@ -509,6 +509,9 @@ update_existing_head_ref(struct btrfs_de sizeof(ref->extent_op->key)); existing_ref->extent_op->update_key =1 ; } +if (ref->extent_op->update_gen) + existing_ref->extent_op->update_gen =1 ; +if (ref->extent_op->update_flags) { existing_ref->extent_op->flags_to_set |= ref->extent_op->flags_to_set;
fs/btrfs/delayed-ref.h +1 -0
@@ -58,6 +58,7 @@ struct btrfs_delayed_extent_op {struct btrfs_disk_key key;u64 flags_to_set; unsigned int update_key:1; + unsigned int update_gen:1; unsigned int update_flags:1; unsigned int is_data:1; };
fs/btrfs/extent-tree.c +76 -36
237 lines not on this page · raw message