btrfs: reada: bypass adding extent when all zone failed
authorZhao Lei <zhaolei@cn.fujitsu.com>
Thu, 31 Dec 2015 10:48:54 +0000 (18:48 +0800)
committerDavid Sterba <dsterba@suse.com>
Thu, 18 Feb 2016 09:26:12 +0000 (10:26 +0100)
When failed adding all dev_zones for a reada_extent, the extent
will have no chance to be selected to run, and keep in memory
for ever.

We should bypass this extent to avoid above case.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/reada.c

index 27a2fe914c672f06efdb58177fb6a11cd8ab85f9..1d00de7369a8cd0d137db0396a52bd8281c87c30 100644 (file)
@@ -330,6 +330,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
        int nzones = 0;
        unsigned long index = logical >> PAGE_CACHE_SHIFT;
        int dev_replace_is_ongoing;
+       int have_zone = 0;
 
        spin_lock(&fs_info->reada_lock);
        re = radix_tree_lookup(&fs_info->reada_tree, index);
@@ -456,10 +457,14 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
                        btrfs_dev_replace_unlock(&fs_info->dev_replace);
                        goto error;
                }
+               have_zone = 1;
        }
        spin_unlock(&fs_info->reada_lock);
        btrfs_dev_replace_unlock(&fs_info->dev_replace);
 
+       if (!have_zone)
+               goto error;
+
        btrfs_put_bbio(bbio);
        return re;