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@xxxxxxxx> > > --- > > 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@xxxxxxxx>, Tel. +49 (0)911 74053 2107 SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel