mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
iscsi-target: Fix iscsit_alloc_buffs() failure cases
Make iscsit_alloc_buffs() failure case for page_alloc_failed use correct __free_page() SGL pointer, and return -ENOMEM for iscsit_allocate_iovecs failure to push se_cmd->t_mem_sg release into iscsit_release_cmd() callback during iscsit_add_reject_from_cmd() connection reset. Also drop cmd->t_mem_sg = NULL assignment from page_alloc_failed failure case. Reported-by: Roland Dreier <roland@purestorage.com> Cc: Andy Grover <agrover@redhat.com> Cc: stable@vger.kernel.org Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
33395fb8a1
commit
d335e6054d
@ -780,7 +780,7 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
|
|||||||
struct scatterlist *sgl;
|
struct scatterlist *sgl;
|
||||||
u32 length = cmd->se_cmd.data_length;
|
u32 length = cmd->se_cmd.data_length;
|
||||||
int nents = DIV_ROUND_UP(length, PAGE_SIZE);
|
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
|
* If no SCSI payload is present, allocate the default iovecs used for
|
||||||
* iSCSI PDU Header
|
* iSCSI PDU Header
|
||||||
@ -821,17 +821,15 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
|
|||||||
*/
|
*/
|
||||||
ret = iscsit_allocate_iovecs(cmd);
|
ret = iscsit_allocate_iovecs(cmd);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto page_alloc_failed;
|
return -ENOMEM;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
page_alloc_failed:
|
page_alloc_failed:
|
||||||
while (i >= 0) {
|
while (j < i)
|
||||||
__free_page(sg_page(&sgl[i]));
|
__free_page(sg_page(&sgl[j++]));
|
||||||
i--;
|
|
||||||
}
|
kfree(sgl);
|
||||||
kfree(cmd->t_mem_sg);
|
|
||||||
cmd->t_mem_sg = NULL;
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user