iscsi-target: Fix iscsit_alloc_buffs() failure cases
[firefly-linux-kernel-4.4.55.git] / drivers / target / iscsi / iscsi_target.c
index cecf951e420f528e9ef49593603f90e884ec538e..c3ef2f6f374003afc518d8b2d0b3a4e16adfb5c5 100644 (file)
@@ -780,7 +780,7 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
        struct scatterlist *sgl;
        u32 length = cmd->se_cmd.data_length;
        int nents = DIV_ROUND_UP(length, PAGE_SIZE);
-       int i = 0, ret;
+       int i = 0, j = 0, ret;
        /*
         * If no SCSI payload is present, allocate the default iovecs used for
         * iSCSI PDU Header
@@ -821,17 +821,15 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
         */
         ret = iscsit_allocate_iovecs(cmd);
         if (ret < 0)
-               goto page_alloc_failed;
+               return -ENOMEM;
 
        return 0;
 
 page_alloc_failed:
-       while (i >= 0) {
-               __free_page(sg_page(&sgl[i]));
-               i--;
-       }
-       kfree(cmd->t_mem_sg);
-       cmd->t_mem_sg = NULL;
+       while (j < i)
+               __free_page(sg_page(&sgl[j++]));
+
+       kfree(sgl);
        return -ENOMEM;
 }