[dm-devel] [PATCH 13/21] libmultipath: clariion checker: leave unsupported paths alone

Martin Wilck mwilck at suse.com
Fri Oct 26 09:01:49 UTC 2018


On Thu, 2018-10-25 at 16:41 -0500,  Benjamin Marzinski  wrote:
> On Fri, Oct 12, 2018 at 12:26:59AM +0200, Martin Wilck wrote:
> > A checker shouldn't set the path state to PATH_DOWN if it fails
> > to obtain information about the path in the first place. Add logic
> > to the checker to distinguish a failed path from an unsupported
> > path.
> > 
> > Signed-off-by: Martin Wilck <mwilck at suse.com>
> > ---
> >  libmultipath/checkers/emc_clariion.c | 50
> > ++++++++++++++++++++++++++--
> >  1 file changed, 48 insertions(+), 2 deletions(-)
> > 
> > diff --git a/libmultipath/checkers/emc_clariion.c
> > b/libmultipath/checkers/emc_clariion.c
> > index f8e55b93..a277a004 100644
> > --- a/libmultipath/checkers/emc_clariion.c
> > +++ b/libmultipath/checkers/emc_clariion.c
> > @@ -20,6 +20,11 @@
> >  #define INQUIRY_CMD     0x12
> >  #define INQUIRY_CMDLEN  6
> >  #define HEAVY_CHECK_COUNT       10
> > +#define SCSI_COMMAND_TERMINATED	0x22
> > +#define SCSI_CHECK_CONDITION	0x2
> > +#define RECOVERED_ERROR		0x01
> > +#define ILLEGAL_REQUEST		0x05
> > +#define SG_ERR_DRIVER_SENSE	0x08
> >  
> >  /*
> >   * Mechanism to track CLARiiON inactive snapshot LUs.
> > @@ -130,7 +135,9 @@ int libcheck_check (struct checker * c)
> >  		(struct emc_clariion_checker_path_context *)c->context;
> >  	char wwnstr[33];
> >  	int ret;
> > +	int retry_emc = 5;
> >  
> > +retry:
> >  	memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
> >  	memset(sense_buffer, 0, 128);
> >  	memset(sb, 0, SENSE_BUFF_LEN);
> > @@ -145,12 +152,51 @@ int libcheck_check (struct checker * c)
> >  	io_hdr.timeout = c->timeout * 1000;
> >  	io_hdr.pack_id = 0;
> >  	if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
> > +		if (errno == ENOTTY) {
> > +			c->msgid = CHECKER_MSGID_UNSUPPORTED;
> > +			return PATH_WILD;
> > +		}
> >  		c->msgid = MSG_CLARIION_QUERY_FAILED;
> >  		return PATH_DOWN;
> >  	}
> > +
> >  	if (io_hdr.info & SG_INFO_OK_MASK) {
> > -		c->msgid = MSG_CLARIION_QUERY_ERROR;
> > -		return PATH_DOWN;
> 
> Previously, if (io_hdr.info & SG_INFO_OK_MASK) the checker would
> always
> return PATH_DOWN.  Both the tur and rdac checker always return either
> PATH_DOWN or PATH_WILD if (io_hdr.info & SG_INFO_OK_MASK && sense_key
> != RECOVERED_ERROR). With the clariion checker, it now appears
> possible
> to have (io_hdr.info & SG_INFO_OK_MASK && sense_key !=
> RECOVERED_ERROR)
> and still return PATH_UP. Is this intentional? Am I missing something
> here?

I copied this code from the rdac checker. But the default return value
in emc_clariion is different, thanks for spotting that. I will post an
update.

Handling of SCSI status and sense codes is done differently in
different parts of multipath-tools. We really need common SCSI code :-/

Martin

-- 
Dr. Martin Wilck <mwilck at suse.com>, Tel. +49 (0)911 74053 2107
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)





More information about the dm-devel mailing list