diff options
Diffstat (limited to 'fs/btrfs/backref.c')
-rw-r--r-- | fs/btrfs/backref.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index e25564bfcb46..54a201dac7f9 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -276,9 +276,8 @@ static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path, | |||
276 | } | 276 | } |
277 | if (ret > 0) | 277 | if (ret > 0) |
278 | goto next; | 278 | goto next; |
279 | ret = ulist_add_merge(parents, eb->start, | 279 | ret = ulist_add_merge_ptr(parents, eb->start, |
280 | (uintptr_t)eie, | 280 | eie, (void **)&old, GFP_NOFS); |
281 | (u64 *)&old, GFP_NOFS); | ||
282 | if (ret < 0) | 281 | if (ret < 0) |
283 | break; | 282 | break; |
284 | if (!ret && extent_item_pos) { | 283 | if (!ret && extent_item_pos) { |
@@ -1001,16 +1000,19 @@ again: | |||
1001 | ret = -EIO; | 1000 | ret = -EIO; |
1002 | goto out; | 1001 | goto out; |
1003 | } | 1002 | } |
1003 | btrfs_tree_read_lock(eb); | ||
1004 | btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK); | ||
1004 | ret = find_extent_in_eb(eb, bytenr, | 1005 | ret = find_extent_in_eb(eb, bytenr, |
1005 | *extent_item_pos, &eie); | 1006 | *extent_item_pos, &eie); |
1007 | btrfs_tree_read_unlock_blocking(eb); | ||
1006 | free_extent_buffer(eb); | 1008 | free_extent_buffer(eb); |
1007 | if (ret < 0) | 1009 | if (ret < 0) |
1008 | goto out; | 1010 | goto out; |
1009 | ref->inode_list = eie; | 1011 | ref->inode_list = eie; |
1010 | } | 1012 | } |
1011 | ret = ulist_add_merge(refs, ref->parent, | 1013 | ret = ulist_add_merge_ptr(refs, ref->parent, |
1012 | (uintptr_t)ref->inode_list, | 1014 | ref->inode_list, |
1013 | (u64 *)&eie, GFP_NOFS); | 1015 | (void **)&eie, GFP_NOFS); |
1014 | if (ret < 0) | 1016 | if (ret < 0) |
1015 | goto out; | 1017 | goto out; |
1016 | if (!ret && extent_item_pos) { | 1018 | if (!ret && extent_item_pos) { |