diff options
Diffstat (limited to 'fs/btrfs/backref.c')
| -rw-r--r-- | fs/btrfs/backref.c | 40 | 
1 files changed, 14 insertions, 26 deletions
| diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index a383c18e74e8..a256f3b2a845 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); | 
| @@ -1125,10 +1122,10 @@ static int inode_ref_info(u64 inum, u64 ioff, struct btrfs_root *fs_root, | |||
| 1125 | * required for the path to fit into the buffer. in that case, the returned | 1122 | * required for the path to fit into the buffer. in that case, the returned | 
| 1126 | * value will be smaller than dest. callers must check this! | 1123 | * value will be smaller than dest. callers must check this! | 
| 1127 | */ | 1124 | */ | 
| 1128 | static char *iref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path, | 1125 | char *btrfs_iref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path, | 
| 1129 | struct btrfs_inode_ref *iref, | 1126 | struct btrfs_inode_ref *iref, | 
| 1130 | struct extent_buffer *eb_in, u64 parent, | 1127 | struct extent_buffer *eb_in, u64 parent, | 
| 1131 | char *dest, u32 size) | 1128 | char *dest, u32 size) | 
| 1132 | { | 1129 | { | 
| 1133 | u32 len; | 1130 | u32 len; | 
| 1134 | int slot; | 1131 | int slot; | 
| @@ -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 | ||
| @@ -1543,7 +1531,7 @@ static int inode_to_path(u64 inum, struct btrfs_inode_ref *iref, | |||
| 1543 | ipath->fspath->bytes_left - s_ptr : 0; | 1531 | ipath->fspath->bytes_left - s_ptr : 0; | 
| 1544 | 1532 | ||
| 1545 | fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr; | 1533 | fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr; | 
| 1546 | fspath = iref_to_path(ipath->fs_root, ipath->btrfs_path, iref, eb, | 1534 | fspath = btrfs_iref_to_path(ipath->fs_root, ipath->btrfs_path, iref, eb, | 
| 1547 | inum, fspath_min, bytes_left); | 1535 | inum, fspath_min, bytes_left); | 
| 1548 | if (IS_ERR(fspath)) | 1536 | if (IS_ERR(fspath)) | 
| 1549 | return PTR_ERR(fspath); | 1537 | return PTR_ERR(fspath); | 
