aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/target/iscsi/iscsi_target.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index cecf951e420f..c3ef2f6f3740 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -780,7 +780,7 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
780 struct scatterlist *sgl; 780 struct scatterlist *sgl;
781 u32 length = cmd->se_cmd.data_length; 781 u32 length = cmd->se_cmd.data_length;
782 int nents = DIV_ROUND_UP(length, PAGE_SIZE); 782 int nents = DIV_ROUND_UP(length, PAGE_SIZE);
783 int i = 0, ret; 783 int i = 0, j = 0, ret;
784 /* 784 /*
785 * If no SCSI payload is present, allocate the default iovecs used for 785 * If no SCSI payload is present, allocate the default iovecs used for
786 * iSCSI PDU Header 786 * iSCSI PDU Header
@@ -821,17 +821,15 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
821 */ 821 */
822 ret = iscsit_allocate_iovecs(cmd); 822 ret = iscsit_allocate_iovecs(cmd);
823 if (ret < 0) 823 if (ret < 0)
824 goto page_alloc_failed; 824 return -ENOMEM;
825 825
826 return 0; 826 return 0;
827 827
828page_alloc_failed: 828page_alloc_failed:
829 while (i >= 0) { 829 while (j < i)
830 __free_page(sg_page(&sgl[i])); 830 __free_page(sg_page(&sgl[j++]));
831 i--; 831
832 } 832 kfree(sgl);
833 kfree(cmd->t_mem_sg);
834 cmd->t_mem_sg = NULL;
835 return -ENOMEM; 833 return -ENOMEM;
836} 834}
837 835