@@ -2367,39 +2367,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_cmnd *scmd = blk_mq_rq_to_pdu(READ_ONCE(srp->rqq));
- u8 *sbp = scmd ? scmd->sense_buffer : 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
@@ -2411,6 +2378,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 scsi_cmnd *scmd = blk_mq_rq_to_pdu(rqq);
struct sg_request *srp = rqq->end_io_data;
@@ -2420,7 +2388,8 @@ sg_rq_end_io(struct request *rqq, blk_status_t status)
sfp = srp->parentfp;
sdp = sfp->parentdp;
- srp->rq_result = scmd->result;
+ rq_result = scmd->result;
+ srp->rq_result = rq_result;
slen = min_t(int, scmd->sense_len, SCSI_SENSE_BUFFERSIZE);
a_resid = scmd->resid_len;
@@ -2436,10 +2405,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__, scmd->sense_buffer, slen);
+ }
if (slen > 0) {
if (scmd->sense_buffer && !srp->sense_bp) {
srp->sense_bp = mempool_alloc(sg_sense_pool, GFP_ATOMIC);