aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/reada.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/reada.c')
-rw-r--r--fs/btrfs/reada.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c
index 0ddc5659f946..9f363e17ec74 100644
--- a/fs/btrfs/reada.c
+++ b/fs/btrfs/reada.c
@@ -418,12 +418,17 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
418 */ 418 */
419 continue; 419 continue;
420 } 420 }
421 if (!dev->bdev) {
422 /* cannot read ahead on missing device */
423 continue;
424 }
421 prev_dev = dev; 425 prev_dev = dev;
422 ret = radix_tree_insert(&dev->reada_extents, index, re); 426 ret = radix_tree_insert(&dev->reada_extents, index, re);
423 if (ret) { 427 if (ret) {
424 while (--i >= 0) { 428 while (--i >= 0) {
425 dev = bbio->stripes[i].dev; 429 dev = bbio->stripes[i].dev;
426 BUG_ON(dev == NULL); 430 BUG_ON(dev == NULL);
431 /* ignore whether the entry was inserted */
427 radix_tree_delete(&dev->reada_extents, index); 432 radix_tree_delete(&dev->reada_extents, index);
428 } 433 }
429 BUG_ON(fs_info == NULL); 434 BUG_ON(fs_info == NULL);
@@ -914,7 +919,10 @@ struct reada_control *btrfs_reada_add(struct btrfs_root *root,
914 generation = btrfs_header_generation(node); 919 generation = btrfs_header_generation(node);
915 free_extent_buffer(node); 920 free_extent_buffer(node);
916 921
917 reada_add_block(rc, start, &max_key, level, generation); 922 if (reada_add_block(rc, start, &max_key, level, generation)) {
923 kfree(rc);
924 return ERR_PTR(-ENOMEM);
925 }
918 926
919 reada_start_machine(root->fs_info); 927 reada_start_machine(root->fs_info);
920 928