diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index ba50bd7b9a7..120c448f58f 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -1312,7 +1312,10 @@ static void reada_walk_down(struct btrfs_root *root, | |||
1312 | BUG_ON(ret); | 1312 | BUG_ON(ret); |
1313 | if (refs != 1) | 1313 | if (refs != 1) |
1314 | continue; | 1314 | continue; |
1315 | mutex_unlock(&root->fs_info->fs_mutex); | ||
1315 | ret = readahead_tree_block(root, blocknr); | 1316 | ret = readahead_tree_block(root, blocknr); |
1317 | cond_resched(); | ||
1318 | mutex_lock(&root->fs_info->fs_mutex); | ||
1316 | if (ret) | 1319 | if (ret) |
1317 | break; | 1320 | break; |
1318 | } | 1321 | } |
@@ -1445,7 +1448,6 @@ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root | |||
1445 | struct btrfs_path *path; | 1448 | struct btrfs_path *path; |
1446 | int i; | 1449 | int i; |
1447 | int orig_level; | 1450 | int orig_level; |
1448 | int num_walks = 0; | ||
1449 | struct btrfs_root_item *root_item = &root->root_item; | 1451 | struct btrfs_root_item *root_item = &root->root_item; |
1450 | 1452 | ||
1451 | path = btrfs_alloc_path(); | 1453 | path = btrfs_alloc_path(); |
@@ -1486,12 +1488,9 @@ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root | |||
1486 | break; | 1488 | break; |
1487 | if (wret < 0) | 1489 | if (wret < 0) |
1488 | ret = wret; | 1490 | ret = wret; |
1489 | num_walks++; | 1491 | ret = -EAGAIN; |
1490 | if (num_walks > 2) { | 1492 | get_bh(root->node); |
1491 | ret = -EAGAIN; | 1493 | break; |
1492 | get_bh(root->node); | ||
1493 | break; | ||
1494 | } | ||
1495 | } | 1494 | } |
1496 | for (i = 0; i <= orig_level; i++) { | 1495 | for (i = 0; i <= orig_level; i++) { |
1497 | if (path->nodes[i]) { | 1496 | if (path->nodes[i]) { |