Skip to content

Commit 097b8a7

Browse files
author
Jan Schmidt
committed
Btrfs: join tree mod log code with the code holding back delayed refs
We've got two mechanisms both required for reliable backref resolving (tree mod log and holding back delayed refs). You cannot make use of one without the other. So instead of requiring the user of this mechanism to setup both correctly, we join them into a single interface. Additionally, we stop inserting non-blockers into fs_info->tree_mod_seq_list as we did before, which was of no value. Signed-off-by: Jan Schmidt <[email protected]>
1 parent cf53883 commit 097b8a7

File tree

9 files changed

+240
-219
lines changed

9 files changed

+240
-219
lines changed

fs/btrfs/backref.c

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -773,9 +773,8 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
773773
*/
774774
static int find_parent_nodes(struct btrfs_trans_handle *trans,
775775
struct btrfs_fs_info *fs_info, u64 bytenr,
776-
u64 delayed_ref_seq, u64 time_seq,
777-
struct ulist *refs, struct ulist *roots,
778-
const u64 *extent_item_pos)
776+
u64 time_seq, struct ulist *refs,
777+
struct ulist *roots, const u64 *extent_item_pos)
779778
{
780779
struct btrfs_key key;
781780
struct btrfs_path *path;
@@ -837,7 +836,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
837836
btrfs_put_delayed_ref(&head->node);
838837
goto again;
839838
}
840-
ret = __add_delayed_refs(head, delayed_ref_seq,
839+
ret = __add_delayed_refs(head, time_seq,
841840
&prefs_delayed);
842841
mutex_unlock(&head->mutex);
843842
if (ret) {
@@ -981,8 +980,7 @@ static void free_leaf_list(struct ulist *blocks)
981980
*/
982981
static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
983982
struct btrfs_fs_info *fs_info, u64 bytenr,
984-
u64 delayed_ref_seq, u64 time_seq,
985-
struct ulist **leafs,
983+
u64 time_seq, struct ulist **leafs,
986984
const u64 *extent_item_pos)
987985
{
988986
struct ulist *tmp;
@@ -997,7 +995,7 @@ static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
997995
return -ENOMEM;
998996
}
999997

1000-
ret = find_parent_nodes(trans, fs_info, bytenr, delayed_ref_seq,
998+
ret = find_parent_nodes(trans, fs_info, bytenr,
1001999
time_seq, *leafs, tmp, extent_item_pos);
10021000
ulist_free(tmp);
10031001

@@ -1024,8 +1022,7 @@ static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
10241022
*/
10251023
int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
10261024
struct btrfs_fs_info *fs_info, u64 bytenr,
1027-
u64 delayed_ref_seq, u64 time_seq,
1028-
struct ulist **roots)
1025+
u64 time_seq, struct ulist **roots)
10291026
{
10301027
struct ulist *tmp;
10311028
struct ulist_node *node = NULL;
@@ -1043,7 +1040,7 @@ int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
10431040

10441041
ULIST_ITER_INIT(&uiter);
10451042
while (1) {
1046-
ret = find_parent_nodes(trans, fs_info, bytenr, delayed_ref_seq,
1043+
ret = find_parent_nodes(trans, fs_info, bytenr,
10471044
time_seq, tmp, *roots, NULL);
10481045
if (ret < 0 && ret != -ENOENT) {
10491046
ulist_free(tmp);
@@ -1376,11 +1373,9 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
13761373
struct ulist *roots = NULL;
13771374
struct ulist_node *ref_node = NULL;
13781375
struct ulist_node *root_node = NULL;
1379-
struct seq_list seq_elem = {};
13801376
struct seq_list tree_mod_seq_elem = {};
13811377
struct ulist_iterator ref_uiter;
13821378
struct ulist_iterator root_uiter;
1383-
struct btrfs_delayed_ref_root *delayed_refs = NULL;
13841379

13851380
pr_debug("resolving all inodes for extent %llu\n",
13861381
extent_item_objectid);
@@ -1391,25 +1386,19 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
13911386
trans = btrfs_join_transaction(fs_info->extent_root);
13921387
if (IS_ERR(trans))
13931388
return PTR_ERR(trans);
1394-
1395-
delayed_refs = &trans->transaction->delayed_refs;
1396-
spin_lock(&delayed_refs->lock);
1397-
btrfs_get_delayed_seq(delayed_refs, &seq_elem);
1398-
spin_unlock(&delayed_refs->lock);
13991389
btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem);
14001390
}
14011391

14021392
ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
1403-
seq_elem.seq, tree_mod_seq_elem.seq, &refs,
1393+
tree_mod_seq_elem.seq, &refs,
14041394
&extent_item_pos);
14051395
if (ret)
14061396
goto out;
14071397

14081398
ULIST_ITER_INIT(&ref_uiter);
14091399
while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
14101400
ret = btrfs_find_all_roots(trans, fs_info, ref_node->val,
1411-
seq_elem.seq,
1412-
tree_mod_seq_elem.seq, &roots);
1401+
tree_mod_seq_elem.seq, &roots);
14131402
if (ret)
14141403
break;
14151404
ULIST_ITER_INIT(&root_uiter);
@@ -1431,7 +1420,6 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
14311420
out:
14321421
if (!search_commit_root) {
14331422
btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1434-
btrfs_put_delayed_seq(delayed_refs, &seq_elem);
14351423
btrfs_end_transaction(trans, fs_info->extent_root);
14361424
}
14371425

fs/btrfs/backref.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ int paths_from_inode(u64 inum, struct inode_fs_paths *ipath);
5858

5959
int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
6060
struct btrfs_fs_info *fs_info, u64 bytenr,
61-
u64 delayed_ref_seq, u64 time_seq,
62-
struct ulist **roots);
61+
u64 time_seq, struct ulist **roots);
6362

6463
struct btrfs_data_container *init_data_container(u32 total_bytes);
6564
struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,

0 commit comments

Comments
 (0)