ping? On Tue, Aug 02, 2016 at 02:36:32PM +0200, Christoph Hellwig wrote: > From: Hannes Reinecke <hare@xxxxxxx> > > If dm-mpath encounters an reservation conflict it should not fail the > path (as communication with the target is not affected) but should > rather retry on another path. However, in doing so we might be inducing > a ping-pong between paths, with no guarantee of any forward progress. > > And arguably a reservation conflict is an unexpected error, so we should > be passing it upwards to allow the application to take appropriate steps. > > Signed-off-by: Hannes Reinecke <hare@xxxxxxx> > Acked-by: Christoph Hellwig <hch@xxxxxx> > Tested-by: Christoph Hellwig <hch@xxxxxx> > --- > drivers/md/dm-mpath.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c > index 7eac080..8d2f916 100644 > --- a/drivers/md/dm-mpath.c > +++ b/drivers/md/dm-mpath.c > @@ -1555,16 +1555,22 @@ static int do_end_io(struct multipath *m, struct request *clone, > if (noretry_error(error)) > return error; > > - if (mpio->pgpath) > + /* > + * EBADE signals an reservation conflict. > + * We shouldn't fail the path here as we can communicate with > + * the target. We should failover to the next path, but in > + * doing so we might be causing a ping-pong between paths. > + * So just return the reservation conflict error. > + */ > + if (error == -EBADE) > + r = error; > + else if (mpio->pgpath) > fail_path(mpio->pgpath); > > if (!atomic_read(&m->nr_valid_paths)) { > if (!test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags)) { > if (!must_push_back_rq(m)) > r = -EIO; > - } else { > - if (error == -EBADE) > - r = error; > } > } > > -- > 2.1.4 > > -- > dm-devel mailing list > dm-devel@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/dm-devel ---end quoted text--- -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel