The SCSI mid-layer now checks for SCSI UNIT ATTENTIONs and takes the appropriate actions. This means that the sg driver no longer needs to do this check. Reviewed-by: Hannes Reinecke <hare@xxxxxxx> Signed-off-by: Douglas Gilbert <dgilbert@xxxxxxxxxxxx> --- drivers/scsi/sg.c | 49 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index b5e73205e997..ab4662867d0f 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -2371,39 +2371,6 @@ sg_rq_end_io_usercontext(struct work_struct *work) kref_put(&sfp->f_ref, sg_remove_sfp); } -static void -sg_check_sense(struct sg_device *sdp, struct sg_request *srp, int sense_len) -{ - int driver_stat; - u32 rq_res = srp->rq_result; - struct scsi_request *scsi_rp = scsi_req(READ_ONCE(srp->rqq)); - u8 *sbp = scsi_rp ? scsi_rp->sense : NULL; - - if (!sbp) - return; - driver_stat = driver_byte(rq_res); - if (driver_stat & DRIVER_SENSE) { - struct scsi_sense_hdr ssh; - - if (scsi_normalize_sense(sbp, sense_len, &ssh)) { - if (!scsi_sense_is_deferred(&ssh)) { - if (ssh.sense_key == UNIT_ATTENTION) { - if (sdp->device->removable) - sdp->device->changed = 1; - } - } - } - } - if (test_bit(SG_FDEV_LOG_SENSE, sdp->fdev_bm) > 0) { - int scsi_stat = rq_res & 0xff; - - if (scsi_stat == SAM_STAT_CHECK_CONDITION || - scsi_stat == SAM_STAT_COMMAND_TERMINATED) - __scsi_print_sense(sdp->device, __func__, sbp, - sense_len); - } -} - /* * This "bottom half" (soft interrupt) handler is called by the mid-level * when a request has completed or failed. This callback is registered in a @@ -2415,6 +2382,7 @@ sg_rq_end_io(struct request *rqq, blk_status_t status) { enum sg_rq_state rqq_state = SG_RS_AWAIT_RCV; int a_resid, slen; + u32 rq_result; unsigned long iflags; struct sg_request *srp = rqq->end_io_data; struct scsi_request *scsi_rp = scsi_req(rqq); @@ -2424,7 +2392,8 @@ sg_rq_end_io(struct request *rqq, blk_status_t status) sfp = srp->parentfp; sdp = sfp->parentdp; - srp->rq_result = scsi_rp->result; + rq_result = scsi_rp->result; + srp->rq_result = rq_result; slen = min_t(int, scsi_rp->sense_len, SCSI_SENSE_BUFFERSIZE); a_resid = scsi_rp->resid_len; @@ -2440,10 +2409,16 @@ sg_rq_end_io(struct request *rqq, blk_status_t status) } SG_LOG(6, sfp, "%s: pack_id=%d, res=0x%x\n", __func__, srp->pack_id, - srp->rq_result); + rq_result); srp->duration = sg_calc_rq_dur(srp); - if (unlikely((srp->rq_result & SG_ML_RESULT_MSK) && slen > 0)) - sg_check_sense(sdp, srp, slen); + if (unlikely((rq_result & SG_ML_RESULT_MSK) && slen > 0 && + test_bit(SG_FDEV_LOG_SENSE, sdp->fdev_bm))) { + u32 scsi_stat = rq_result & 0xff; + + if (scsi_stat == SAM_STAT_CHECK_CONDITION || + scsi_stat == SAM_STAT_COMMAND_TERMINATED) + __scsi_print_sense(sdp->device, __func__, scsi_rp->sense, slen); + } if (slen > 0) { if (scsi_rp->sense && !srp->sense_bp) { srp->sense_bp = mempool_alloc(sg_sense_pool, -- 2.25.1