Skip to content

Commit

Permalink
btrfs: reada: add all reachable mirrors into reada device list
Browse files Browse the repository at this point in the history
If some device is not reachable, we should bypass and continus addingb
next, instead of break on bad device.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Zhao Lei authored and David Sterba committed Feb 18, 2016
1 parent a3f7fde commit 6a159d2
Showing 1 changed file with 9 additions and 11 deletions.
20 changes: 9 additions & 11 deletions fs/btrfs/reada.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,6 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
u64 length;
int real_stripes;
int nzones = 0;
int i;
unsigned long index = logical >> PAGE_CACHE_SHIFT;
int dev_replace_is_ongoing;

Expand Down Expand Up @@ -375,9 +374,9 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
dev = bbio->stripes[nzones].dev;
zone = reada_find_zone(fs_info, dev, logical, bbio);
if (!zone)
break;
continue;

re->zones[nzones] = zone;
re->zones[re->nzones++] = zone;
spin_lock(&zone->lock);
if (!zone->elems)
kref_get(&zone->refcnt);
Expand All @@ -387,8 +386,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
kref_put(&zone->refcnt, reada_zone_release);
spin_unlock(&fs_info->reada_lock);
}
re->nzones = nzones;
if (nzones == 0) {
if (re->nzones == 0) {
/* not a single zone found, error and out */
goto error;
}
Expand All @@ -413,8 +411,9 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
prev_dev = NULL;
dev_replace_is_ongoing = btrfs_dev_replace_is_ongoing(
&fs_info->dev_replace);
for (i = 0; i < nzones; ++i) {
dev = bbio->stripes[i].dev;
for (nzones = 0; nzones < re->nzones; ++nzones) {
dev = re->zones[nzones]->device;

if (dev == prev_dev) {
/*
* in case of DUP, just add the first zone. As both
Expand Down Expand Up @@ -445,8 +444,8 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
prev_dev = dev;
ret = radix_tree_insert(&dev->reada_extents, index, re);
if (ret) {
while (--i >= 0) {
dev = bbio->stripes[i].dev;
while (--nzones >= 0) {
dev = re->zones[nzones]->device;
BUG_ON(dev == NULL);
/* ignore whether the entry was inserted */
radix_tree_delete(&dev->reada_extents, index);
Expand All @@ -465,10 +464,9 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
return re;

error:
while (nzones) {
for (nzones = 0; nzones < re->nzones; ++nzones) {
struct reada_zone *zone;

--nzones;
zone = re->zones[nzones];
kref_get(&zone->refcnt);
spin_lock(&zone->lock);
Expand Down

0 comments on commit 6a159d2

Please sign in to comment.