]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Fix to update proper command completion upon command retries.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Mon, 16 Jan 2012 19:52:25 +0000 (11:52 -0800)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Wed, 9 May 2012 00:40:59 +0000 (17:40 -0700)
Pass right completion om processing continuation status IOCB.

JIRA Key: V2632FC-149

drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

index 7804470ece908eebd49e0016f3270559fb0eee6c..5cad6034979af55436b16fc03c038f24327b2912 100644 (file)
@@ -1343,7 +1343,7 @@ qla2x00_process_response_queue(struct rsp_que *rsp)
 
 static inline void
 qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
-    uint32_t sense_len, struct rsp_que *rsp)
+    uint32_t sense_len, struct rsp_que *rsp, int res)
 {
        struct scsi_qla_host *vha = sp->fcport->vha;
        struct scsi_cmnd *cp = GET_CMD_SP(sp);
@@ -1365,8 +1365,10 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
        track_sense_len -= sense_len;
        SET_CMD_SENSE_LEN(sp, track_sense_len);
 
-       if (track_sense_len != 0)
+       if (track_sense_len != 0) {
                rsp->status_srb = sp;
+               cp->result = res;
+       }
 
        if (sense_len) {
                ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c,
@@ -1683,7 +1685,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
                        break;
 
                qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len,
-                   rsp);
+                   rsp, res);
                break;
 
        case CS_DATA_UNDERRUN:
@@ -1744,7 +1746,7 @@ check_scsi_status:
                                break;
 
                        qla2x00_handle_sense(sp, sense_data, par_sense_len,
-                           sense_len, rsp);
+                           sense_len, rsp, res);
                }
                break;
 
@@ -1864,7 +1866,7 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
        /* Place command on done queue. */
        if (sense_len == 0) {
                rsp->status_srb = NULL;
-               sp->done(ha, sp, 0);
+               sp->done(ha, sp, cp->result);
        }
 }
 
index 5cd36bc03892ce65910e8ba5b8ad84dfb19ed609..50aaf03ccc5517522f70ef26a3d5d37d27aa8641 100644 (file)
@@ -612,8 +612,7 @@ qla2x00_sp_compl(void *data, void *ptr, int res)
        srb_t *sp = (srb_t*)ptr;
        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
 
-       if (res)
-               cmd->result = res;
+       cmd->result = res;
 
        if (atomic_read(&sp->ref_count) == 0) {
                ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3015,