On Thu, 5 Jan 2012 22:30:23 +0100 Art -kwaak- van Breemen <ard@xxxxxxxxxxxxxxx> wrote: > Hi, > > Please Cc: me too as I am trying to subscribe to the list. > > Anyway: I found a small bug in raid1, with write-behind and > write-mostly, occuring at least on 3.1.4 and 3.2 . > > This is the test setup: > mdadm --stop /dev/md5 > mdadm --zero-superblock /dev/sda8 > mdadm --zero-superblock /dev/sdb8 > mdadm --create -l 1 -n 2 --metadata=0.90 --bitmap=internal --bitmap-chunk=1024 --write-behind=2048 /dev/md5 /dev/sdb8 -W /dev/sda8 > (wait until finished) > mdadm --fail /dev/md5 /dev/sdb8 > # And this to trigger the bug: > dd if=/dev/md5 of=/dev/null bs=10k count=1 > Thanks for the excellent bug report. I never tested write-behind :-( Please confirm that this patch fixes it for you. NeilBrown diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index cc24f0c..a368db2 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -531,8 +531,17 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect if (test_bit(WriteMostly, &rdev->flags)) { /* Don't balance among write-mostly, just * use the first as a last resort */ - if (best_disk < 0) + if (best_disk < 0) { + if (is_badblock(rdev, this_sector, sectors, + &first_bad, &bad_sectors)) { + if (first_bad < this_sector) + /* Cannot use this */ + continue; + best_good_sectors = first_bad - this_sector; + } else + best_good_sectors = sectors; best_disk = disk; + } continue; } /* This is a reasonable device to use. It might
Attachment:
signature.asc
Description: PGP signature