Hi Lin,

On 23/06/19, 7:27 AM, "linux-scsi-ow...@vger.kernel.org on behalf of Lin
Yi" <linux-scsi-ow...@vger.kernel.org on behalf of teroi...@163.com> wrote:

>if cb_arg alloc failed, we can't release the struct orig_io_req refcount
>before we take it's refcount. call kref_get before malloc, so as to pair
>with kref_put on rec_err path.
>
>Signed-off-by: Lin Yi <teroi...@163.com>
>---
> drivers/scsi/bnx2fc/bnx2fc_els.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/drivers/scsi/bnx2fc/bnx2fc_els.c
>b/drivers/scsi/bnx2fc/bnx2fc_els.c
>index 76e65a3..709bb92 100644
>--- a/drivers/scsi/bnx2fc/bnx2fc_els.c
>+++ b/drivers/scsi/bnx2fc/bnx2fc_els.c
>@@ -592,13 +592,13 @@ int bnx2fc_send_rec(struct bnx2fc_cmd *orig_io_req)
>       BNX2FC_IO_DBG(orig_io_req, "Sending REC\n");
>       memset(&rec, 0, sizeof(rec));
> 
>+      kref_get(&orig_io_req->refcount);
>       cb_arg = kzalloc(sizeof(struct bnx2fc_els_cb_arg), GFP_ATOMIC);
>       if (!cb_arg) {
>               printk(KERN_ERR PFX "Unable to allocate cb_arg for REC\n");
>               rc = -ENOMEM;
>               goto rec_err;
>       }
>-      kref_get(&orig_io_req->refcount);
> 
>       cb_arg->aborted_io_req = orig_io_req;
> 
>-- 
>1.9.1

Thanks for the patch, but this is not the correct fix. If kzalloc fails
code will go to rec_err and try to free cb_arg as well.
Correct way is to move the rec_err label down.

diff --git a/bnx2fc/driver/bnx2fc_els.c b/bnx2fc/driver/bnx2fc_els.c
index 2287008..1b816af 100644
--- a/bnx2fc/driver/bnx2fc_els.c
+++ b/bnx2fc/driver/bnx2fc_els.c
@@ -635,7 +635,6 @@ int bnx2fc_send_rec(struct bnx2fc_cmd *orig_io_req)
        rc = bnx2fc_initiate_els(tgt, ELS_REC, &rec, sizeof(rec),
                                 bnx2fc_rec_compl, cb_arg,
                                 r_a_tov);
-rec_err:
        if (rc) {
                BNX2FC_IO_DBG(orig_io_req, "REC failed - release\n");
                spin_lock_bh(&tgt->tgt_lock);
@@ -643,6 +642,7 @@ rec_err:
                spin_unlock_bh(&tgt->tgt_lock);
                kfree(cb_arg);
        }
+rec_err:
        return rc;
 }

Kindly submit the updated patch.

Thanks,
~Saurav

>

Reply via email to