]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: lpfc: Fix upcall to bsg done in non-success cases
authorJames Smart <jsmart2021@gmail.com>
Wed, 14 Aug 2019 23:56:59 +0000 (16:56 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 20 Aug 2019 02:41:11 +0000 (22:41 -0400)
The scsi transport fc bsg interface does not expect the bsg_job_done()
callback to be done if the bsg request call returns failure. Several of the
HST_VENDOR cases in the driver unconditionally call bsg_job_done()
regardless of the returning value.

Fix the code to only call bsg_job_done() if the call to lpfc_bsg_request()
will return success.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_bsg.c

index 251504cd575f0bc10442e95bc1c7f4cc9933522a..0d2535c177e99470a67eae231870034ebb51c27c 100644 (file)
@@ -5448,7 +5448,9 @@ lpfc_bsg_get_ras_config(struct bsg_job *job)
        bsg_reply->result = rc;
 
        /* complete the job back to userspace */
-       bsg_job_done(job, bsg_reply->result, bsg_reply->reply_payload_rcv_len);
+       if (!rc)
+               bsg_job_done(job, bsg_reply->result,
+                            bsg_reply->reply_payload_rcv_len);
        return rc;
 }
 
@@ -5527,8 +5529,9 @@ lpfc_bsg_set_ras_config(struct bsg_job *job)
        bsg_reply->result = rc;
 
        /* complete the job back to userspace */
-       bsg_job_done(job, bsg_reply->result,
-                      bsg_reply->reply_payload_rcv_len);
+       if (!rc)
+               bsg_job_done(job, bsg_reply->result,
+                            bsg_reply->reply_payload_rcv_len);
 
        return rc;
 }
@@ -5588,7 +5591,9 @@ lpfc_bsg_get_ras_lwpd(struct bsg_job *job)
        bsg_reply->result = rc;
 
        /* complete the job back to userspace */
-       bsg_job_done(job, bsg_reply->result, bsg_reply->reply_payload_rcv_len);
+       if (!rc)
+               bsg_job_done(job, bsg_reply->result,
+                            bsg_reply->reply_payload_rcv_len);
 
        return rc;
 }
@@ -5670,7 +5675,9 @@ lpfc_bsg_get_ras_fwlog(struct bsg_job *job)
 
 ras_job_error:
        bsg_reply->result = rc;
-       bsg_job_done(job, bsg_reply->result, bsg_reply->reply_payload_rcv_len);
+       if (!rc)
+               bsg_job_done(job, bsg_reply->result,
+                            bsg_reply->reply_payload_rcv_len);
 
        return rc;
 }
@@ -5741,8 +5748,9 @@ lpfc_get_trunk_info(struct bsg_job *job)
                                phba->sli4_hba.link_state.logical_speed / 1000;
 job_error:
        bsg_reply->result = rc;
-       bsg_job_done(job, bsg_reply->result,
-                      bsg_reply->reply_payload_rcv_len);
+       if (!rc)
+               bsg_job_done(job, bsg_reply->result,
+                            bsg_reply->reply_payload_rcv_len);
        return rc;
 
 }