diff options
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 14 |
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 | ||
828 | page_alloc_failed: | 828 | page_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 | ||