diff options
author | Chris Mason <chris.mason@fusionio.com> | 2012-07-25 16:11:38 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-07-25 16:11:38 -0400 |
commit | b478b2baa37ac99fc04a30809c780dd5dfd43595 (patch) | |
tree | bed7af1466e5b1e0b0501eba18f77c804a864d7d /fs/btrfs/backref.c | |
parent | 67c9684f48ea9cbc5e9b8a1feb3151800e9dcc22 (diff) | |
parent | 6f72c7e20dbaea55f04546de69586c84a3654503 (diff) |
Merge branch 'qgroup' of git://git.jan-o-sch.net/btrfs-unstable into for-linus
Conflicts:
fs/btrfs/ioctl.c
fs/btrfs/ioctl.h
fs/btrfs/transaction.c
fs/btrfs/transaction.h
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/backref.c')
-rw-r--r-- | fs/btrfs/backref.c | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index a383c18e74e8..7d80ddd8f544 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -773,9 +773,8 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info, | |||
773 | */ | 773 | */ |
774 | static int find_parent_nodes(struct btrfs_trans_handle *trans, | 774 | static int find_parent_nodes(struct btrfs_trans_handle *trans, |
775 | struct btrfs_fs_info *fs_info, u64 bytenr, | 775 | struct btrfs_fs_info *fs_info, u64 bytenr, |
776 | u64 delayed_ref_seq, u64 time_seq, | 776 | u64 time_seq, struct ulist *refs, |
777 | struct ulist *refs, struct ulist *roots, | 777 | struct ulist *roots, const u64 *extent_item_pos) |
778 | const u64 *extent_item_pos) | ||
779 | { | 778 | { |
780 | struct btrfs_key key; | 779 | struct btrfs_key key; |
781 | struct btrfs_path *path; | 780 | struct btrfs_path *path; |
@@ -837,7 +836,7 @@ again: | |||
837 | btrfs_put_delayed_ref(&head->node); | 836 | btrfs_put_delayed_ref(&head->node); |
838 | goto again; | 837 | goto again; |
839 | } | 838 | } |
840 | ret = __add_delayed_refs(head, delayed_ref_seq, | 839 | ret = __add_delayed_refs(head, time_seq, |
841 | &prefs_delayed); | 840 | &prefs_delayed); |
842 | mutex_unlock(&head->mutex); | 841 | mutex_unlock(&head->mutex); |
843 | if (ret) { | 842 | if (ret) { |
@@ -981,8 +980,7 @@ static void free_leaf_list(struct ulist *blocks) | |||
981 | */ | 980 | */ |
982 | static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans, | 981 | static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans, |
983 | struct btrfs_fs_info *fs_info, u64 bytenr, | 982 | struct btrfs_fs_info *fs_info, u64 bytenr, |
984 | u64 delayed_ref_seq, u64 time_seq, | 983 | u64 time_seq, struct ulist **leafs, |
985 | struct ulist **leafs, | ||
986 | const u64 *extent_item_pos) | 984 | const u64 *extent_item_pos) |
987 | { | 985 | { |
988 | struct ulist *tmp; | 986 | struct ulist *tmp; |
@@ -997,7 +995,7 @@ static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans, | |||
997 | return -ENOMEM; | 995 | return -ENOMEM; |
998 | } | 996 | } |
999 | 997 | ||
1000 | ret = find_parent_nodes(trans, fs_info, bytenr, delayed_ref_seq, | 998 | ret = find_parent_nodes(trans, fs_info, bytenr, |
1001 | time_seq, *leafs, tmp, extent_item_pos); | 999 | time_seq, *leafs, tmp, extent_item_pos); |
1002 | ulist_free(tmp); | 1000 | ulist_free(tmp); |
1003 | 1001 | ||
@@ -1024,8 +1022,7 @@ static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans, | |||
1024 | */ | 1022 | */ |
1025 | int btrfs_find_all_roots(struct btrfs_trans_handle *trans, | 1023 | int btrfs_find_all_roots(struct btrfs_trans_handle *trans, |
1026 | struct btrfs_fs_info *fs_info, u64 bytenr, | 1024 | struct btrfs_fs_info *fs_info, u64 bytenr, |
1027 | u64 delayed_ref_seq, u64 time_seq, | 1025 | u64 time_seq, struct ulist **roots) |
1028 | struct ulist **roots) | ||
1029 | { | 1026 | { |
1030 | struct ulist *tmp; | 1027 | struct ulist *tmp; |
1031 | struct ulist_node *node = NULL; | 1028 | struct ulist_node *node = NULL; |
@@ -1043,7 +1040,7 @@ int btrfs_find_all_roots(struct btrfs_trans_handle *trans, | |||
1043 | 1040 | ||
1044 | ULIST_ITER_INIT(&uiter); | 1041 | ULIST_ITER_INIT(&uiter); |
1045 | while (1) { | 1042 | while (1) { |
1046 | ret = find_parent_nodes(trans, fs_info, bytenr, delayed_ref_seq, | 1043 | ret = find_parent_nodes(trans, fs_info, bytenr, |
1047 | time_seq, tmp, *roots, NULL); | 1044 | time_seq, tmp, *roots, NULL); |
1048 | if (ret < 0 && ret != -ENOENT) { | 1045 | if (ret < 0 && ret != -ENOENT) { |
1049 | ulist_free(tmp); | 1046 | ulist_free(tmp); |
@@ -1376,11 +1373,9 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, | |||
1376 | struct ulist *roots = NULL; | 1373 | struct ulist *roots = NULL; |
1377 | struct ulist_node *ref_node = NULL; | 1374 | struct ulist_node *ref_node = NULL; |
1378 | struct ulist_node *root_node = NULL; | 1375 | struct ulist_node *root_node = NULL; |
1379 | struct seq_list seq_elem = {}; | ||
1380 | struct seq_list tree_mod_seq_elem = {}; | 1376 | struct seq_list tree_mod_seq_elem = {}; |
1381 | struct ulist_iterator ref_uiter; | 1377 | struct ulist_iterator ref_uiter; |
1382 | struct ulist_iterator root_uiter; | 1378 | struct ulist_iterator root_uiter; |
1383 | struct btrfs_delayed_ref_root *delayed_refs = NULL; | ||
1384 | 1379 | ||
1385 | pr_debug("resolving all inodes for extent %llu\n", | 1380 | pr_debug("resolving all inodes for extent %llu\n", |
1386 | extent_item_objectid); | 1381 | extent_item_objectid); |
@@ -1391,16 +1386,11 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, | |||
1391 | trans = btrfs_join_transaction(fs_info->extent_root); | 1386 | trans = btrfs_join_transaction(fs_info->extent_root); |
1392 | if (IS_ERR(trans)) | 1387 | if (IS_ERR(trans)) |
1393 | return PTR_ERR(trans); | 1388 | 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); | ||
1399 | btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); | 1389 | btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); |
1400 | } | 1390 | } |
1401 | 1391 | ||
1402 | ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid, | 1392 | 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, |
1404 | &extent_item_pos); | 1394 | &extent_item_pos); |
1405 | if (ret) | 1395 | if (ret) |
1406 | goto out; | 1396 | goto out; |
@@ -1408,8 +1398,7 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, | |||
1408 | ULIST_ITER_INIT(&ref_uiter); | 1398 | ULIST_ITER_INIT(&ref_uiter); |
1409 | while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) { | 1399 | while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) { |
1410 | ret = btrfs_find_all_roots(trans, fs_info, ref_node->val, | 1400 | ret = btrfs_find_all_roots(trans, fs_info, ref_node->val, |
1411 | seq_elem.seq, | 1401 | tree_mod_seq_elem.seq, &roots); |
1412 | tree_mod_seq_elem.seq, &roots); | ||
1413 | if (ret) | 1402 | if (ret) |
1414 | break; | 1403 | break; |
1415 | ULIST_ITER_INIT(&root_uiter); | 1404 | ULIST_ITER_INIT(&root_uiter); |
@@ -1431,7 +1420,6 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, | |||
1431 | out: | 1420 | out: |
1432 | if (!search_commit_root) { | 1421 | if (!search_commit_root) { |
1433 | btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); | 1422 | btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); |
1434 | btrfs_put_delayed_seq(delayed_refs, &seq_elem); | ||
1435 | btrfs_end_transaction(trans, fs_info->extent_root); | 1423 | btrfs_end_transaction(trans, fs_info->extent_root); |
1436 | } | 1424 | } |
1437 | 1425 | ||