On Mon, 2015-11-09 at 16:08 +0100, Hannes Reinecke wrote: > Most sense code is already handled in the generic > code, so we shouldn't be adding special cases here. > However, when doing so we need to check for > unit attention whenever we're sending an internal > command. > > Reviewed-by: Ewan Milne <emilne@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > Signed-off-by: Hannes Reinecke <hare@xxxxxxx> > --- > drivers/scsi/device_handler/scsi_dh_alua.c | 45 +++++++++++--------- > ---------- > 1 file changed, 17 insertions(+), 28 deletions(-) > > diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c > b/drivers/scsi/device_handler/scsi_dh_alua.c > index c9751c9..abf05b4 100644 > --- a/drivers/scsi/device_handler/scsi_dh_alua.c > +++ b/drivers/scsi/device_handler/scsi_dh_alua.c > @@ -85,7 +85,6 @@ struct alua_dh_data { > #define ALUA_POLICY_SWITCH_ALL 1 > > static char print_alua_state(int); > -static int alua_check_sense(struct scsi_device *, struct > scsi_sense_hdr *); > > static int realloc_buffer(struct alua_dh_data *h, unsigned len) > { > @@ -189,8 +188,13 @@ static void stpg_endio(struct request *req, int > error) > > if (scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE, > &sense_hdr)) { > - err = alua_check_sense(h->sdev, &sense_hdr); > - if (err == ADD_TO_MLQUEUE) { > + if (sense_hdr.sense_key == NOT_READY && > + sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) > { > + /* ALUA state transition already in progress > */ > + err = SCSI_DH_OK; > + goto done; > + } > + if (sense_hdr.sense_key == UNIT_ATTENTION) { > err = SCSI_DH_RETRY; > goto done; > } > @@ -399,28 +403,6 @@ static int alua_check_sense(struct scsi_device > *sdev, > * LUN Not Accessible - ALUA state > transition > */ > return ADD_TO_MLQUEUE; > - if (sense_hdr->asc == 0x04 && sense_hdr->ascq == > 0x0b) > - /* > - * LUN Not Accessible -- Target port in > standby state > - */ > - return SUCCESS; > - if (sense_hdr->asc == 0x04 && sense_hdr->ascq == > 0x0c) > - /* > - * LUN Not Accessible -- Target port in > unavailable state > - */ > - return SUCCESS; > - if (sense_hdr->asc == 0x04 && sense_hdr->ascq == > 0x12) > - /* > - * LUN Not Ready -- Offline > - */ > - return SUCCESS; > - if (sdev->allow_restart && > - sense_hdr->asc == 0x04 && sense_hdr->ascq == > 0x02) > - /* > - * if the device is not started, we need to > wake > - * the error handler to start the motor > - */ > - return FAILED; > break; > case UNIT_ATTENTION: > if (sense_hdr->asc == 0x29 && sense_hdr->ascq == > 0x00) > @@ -517,9 +499,16 @@ static int alua_rtpg(struct scsi_device *sdev, > struct alua_dh_data *h, int wait_ > h->flags |= ALUA_RTPG_EXT_HDR_UNSUPP; > goto retry; > } > - > - err = alua_check_sense(sdev, &sense_hdr); > - if (err == ADD_TO_MLQUEUE && time_before(jiffies, > expiry)) { > + /* > + * Retry on ALUA state transition or if any > + * UNIT ATTENTION occurred. > + */ > + if (sense_hdr.sense_key == NOT_READY && > + sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) > + err = SCSI_DH_RETRY; > + else if (sense_hdr.sense_key == UNIT_ATTENTION) > + err = SCSI_DH_RETRY; > + if (err == SCSI_DH_RETRY && time_before(jiffies, > expiry)) { > sdev_printk(KERN_ERR, sdev, "%s: rtpg > retry\n", > ALUA_DH_NAME); > scsi_print_sense_hdr(sdev, ALUA_DH_NAME, > &sense_hdr); Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html