Btrfs: count devices correctly in readahead during RAID 5/6 replace
Commit5fbc7c59fd
("Btrfs: fix unfinished readahead thread for raid5/6 degraded mounting") fixed a problem where we would skip a missing device when we shouldn't have because there are no other mirrors to read from in RAID 5/6. After commit2c8cdd6ee4
("Btrfs, replace: write dirty pages into the replace target device"), the fix doesn't work when we're doing a missing device replace on RAID 5/6 because the replace device is counted as a mirror so we're tricked into thinking we can safely skip the missing device. The fix is to count only the real stripes and decide based on that. Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
03679ade86
commit
7cb2c4202e
1 changed files with 3 additions and 1 deletions
|
@ -328,6 +328,7 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
|
||||||
struct btrfs_device *prev_dev;
|
struct btrfs_device *prev_dev;
|
||||||
u32 blocksize;
|
u32 blocksize;
|
||||||
u64 length;
|
u64 length;
|
||||||
|
int real_stripes;
|
||||||
int nzones = 0;
|
int nzones = 0;
|
||||||
int i;
|
int i;
|
||||||
unsigned long index = logical >> PAGE_CACHE_SHIFT;
|
unsigned long index = logical >> PAGE_CACHE_SHIFT;
|
||||||
|
@ -369,7 +370,8 @@ static struct reada_extent *reada_find_extent(struct btrfs_root *root,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (nzones = 0; nzones < bbio->num_stripes; ++nzones) {
|
real_stripes = bbio->num_stripes - bbio->num_tgtdevs;
|
||||||
|
for (nzones = 0; nzones < real_stripes; ++nzones) {
|
||||||
struct reada_zone *zone;
|
struct reada_zone *zone;
|
||||||
|
|
||||||
dev = bbio->stripes[nzones].dev;
|
dev = bbio->stripes[nzones].dev;
|
||||||
|
|
Loading…
Reference in a new issue