On Friday 05 March 2004 3:32 pm, Mike Christie wrote: > If there is an error on a partially completed bio it's uptodate > bit is cleared and an error value is retured, but DM will see > that bi_size is not yet zero and ignore it. SCSI will fail the rest > of the IO if the fail fast bit is set, so DM multipath will > eventually see the error from them. However, if that behavior is not > a requirement the patch below would be needed to detect errors in > bios where the begining is not uptodate but the end completed without > errors. > > SCSI will not always fail the rest of the IO when the fail fast bit > is not set, so this may be a bug in dm-crypt and dm-raid1. > > Mike Christie > > > --- linux-2.6.4-rc1-udm1.orig/drivers/md/dm-mpath.c 2004-03-03 > 19:56:43.000000000 -0800 +++ > linux-2.6.4-rc1-udm1/drivers/md/dm-mpath.c 2004-03-03 19:52:55.000000000 > -0800 @@ -551,8 +551,9 @@ static int do_end_io(struct multipath *m > int error, struct mpath_io *io) > { > int r; > + int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); > > - if (error) { > + if (uptodate) { > spin_lock(&m->lock); > if (!m->nr_valid_paths) { > spin_unlock(&m->lock); It looks like this test should be "if (!uptodate) {". Also, couldn't we do this in clone_endio() in dm.c and not have to change all the targets? Something like this. -- Kevin Corry kevcorry@xxxxxxxxxx http://evms.sourceforge.net/ --- diff/drivers/md/dm.c 2004-03-05 15:47:55.000000000 -0600 +++ source/drivers/md/dm.c 2004-03-05 15:47:36.000000000 -0600 @@ -278,6 +278,8 @@ if (bio->bi_size) return 1; + error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : -EIO; + if (endio) { r = endio(tio->ti, bio, error, &tio->info); if (r < 0)