diff options
Diffstat (limited to 'fs/btrfs/reada.c')
-rw-r--r-- | fs/btrfs/reada.c | 10 |
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 | ||