Nothing much happens to the bh. It just has Uptodate cleared.
A little later (line 433) we call release_stripe. Once all the active
IO requests have finished the stripe will be completely released and
handle_stripe gets called (from raid5d) to handle the stripe.
It notices there is a block that is being read (bh_read) but that
isn't uptodate, and so tries to schedule a read. Line 949 notices
that the block it wants to read is on a failed drive, so it causes all
blocks to be read in. Once they are read in, handle_stripe gets
called again, and this time it gets to line 955 where it computes the
block that you want.
What you want to do is add a 'failed_drive' field to the stripe_head
which gets initialised to -1 in init_stripe, and set at line 421
instead of calling md_error. Then in handle_stripe, line 875 changes
from
if (!conf->disks[i].operational) {
to
if (!conf->disks[i].operational || sh->failed_drive == i) {
and it might just work for you.
Good luck
NeilBrown
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/