On Fri, 8 May 2015 12:12:23 -0700 Shaohua Li <shli@xxxxxxxxxx> wrote: > On Fri, May 08, 2015 at 06:56:12PM +1000, NeilBrown wrote: > > There is no need for special handling of stripe-batches when the array > > is degraded. > > > > There may be if there is a failure in the batch, but STRIPE_DEGRADED > > does not imply an error. > > > > So don't set STRIPE_BATCH_ERR in ops_run_io just because the array is > > degraded. > > This actually causes a bug: the STRIPE_DEGRADED flag gets cleared in > > check_break_stripe_batch_list() and so the bitmap bit gets cleared > > when it shouldn't. > > > > So in check_break_stripe_batch_list(), split the batch up completely - > > again STRIPE_DEGRADED isn't meaningful. > > > > Also don't set STRIPE_BATCH_ERR when there is a write error to a > > replacement device. This simply removes the replacement device and > > requires no extra handling. > > > > Signed-off-by: NeilBrown <neilb@xxxxxxx> > > --- > > drivers/md/raid5.c | 17 +++-------------- > > 1 file changed, 3 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > > index 3873eaa6fa2e..1ba97fdc6df1 100644 > > --- a/drivers/md/raid5.c > > +++ b/drivers/md/raid5.c > > @@ -1078,9 +1078,6 @@ again: > > pr_debug("skip op %ld on disc %d for sector %llu\n", > > bi->bi_rw, i, (unsigned long long)sh->sector); > > clear_bit(R5_LOCKED, &sh->dev[i].flags); > > - if (sh->batch_head) > > - set_bit(STRIPE_BATCH_ERR, > > - &sh->batch_head->state); > > set_bit(STRIPE_HANDLE, &sh->state); > > } > > Patches look good to me. I had a question here. Is it possible some stripes in > a batch become degraded here but some not? Seems possible, then the batch > should be splitted too. Why? I don't really understand the purpose of splitting up the batch. The only possible error handling on a full-stripe write is: - fail a device, or - record a bad-block. The first case affects all stripes in a batch equally so there is no need to split it up. The second case it is probably best to record the bad blocks while iterating through the batch in handle_stripe_clean_event(). What exactly do you expect to happen after the stripes in a batch after they have been split up? Thanks, NeilBrown
Attachment:
pgp8msS36Ic3d.pgp
Description: OpenPGP digital signature