iscsi: simplify freeing of tasks

Always free them in the iscsi_aio_*_acb functions and remove the
checks in their callers.  Remove ifs when the task struct was
previously dereferenced (spotted by Coverity).

Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2013-05-31 13:47:08 +02:00
parent 0e22a2d189
commit f0d2a4d4d6
1 changed files with 10 additions and 25 deletions

View File

@ -218,10 +218,8 @@ iscsi_aio_write16_cb(struct iscsi_context *iscsi, int status,
if (status == SCSI_STATUS_CHECK_CONDITION if (status == SCSI_STATUS_CHECK_CONDITION
&& acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION && acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& acb->retries-- > 0) { && acb->retries-- > 0) {
if (acb->task != NULL) { scsi_free_scsi_task(acb->task);
scsi_free_scsi_task(acb->task); acb->task = NULL;
acb->task = NULL;
}
if (iscsi_aio_writev_acb(acb) == 0) { if (iscsi_aio_writev_acb(acb) == 0) {
iscsi_set_events(acb->iscsilun); iscsi_set_events(acb->iscsilun);
return; return;
@ -303,6 +301,7 @@ iscsi_aio_writev_acb(IscsiAIOCB *acb)
acb); acb);
#endif #endif
if (ret != 0) { if (ret != 0) {
scsi_free_scsi_task(acb->task);
g_free(acb->buf); g_free(acb->buf);
return -1; return -1;
} }
@ -333,9 +332,6 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num,
acb->retries = ISCSI_CMD_RETRIES; acb->retries = ISCSI_CMD_RETRIES;
if (iscsi_aio_writev_acb(acb) != 0) { if (iscsi_aio_writev_acb(acb) != 0) {
if (acb->task) {
scsi_free_scsi_task(acb->task);
}
qemu_aio_release(acb); qemu_aio_release(acb);
return NULL; return NULL;
} }
@ -364,10 +360,8 @@ iscsi_aio_read16_cb(struct iscsi_context *iscsi, int status,
if (status == SCSI_STATUS_CHECK_CONDITION if (status == SCSI_STATUS_CHECK_CONDITION
&& acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION && acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& acb->retries-- > 0) { && acb->retries-- > 0) {
if (acb->task != NULL) { scsi_free_scsi_task(acb->task);
scsi_free_scsi_task(acb->task); acb->task = NULL;
acb->task = NULL;
}
if (iscsi_aio_readv_acb(acb) == 0) { if (iscsi_aio_readv_acb(acb) == 0) {
iscsi_set_events(acb->iscsilun); iscsi_set_events(acb->iscsilun);
return; return;
@ -445,6 +439,7 @@ iscsi_aio_readv_acb(IscsiAIOCB *acb)
NULL, NULL,
acb); acb);
if (ret != 0) { if (ret != 0) {
scsi_free_scsi_task(acb->task);
return -1; return -1;
} }
@ -480,9 +475,6 @@ iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num,
acb->retries = ISCSI_CMD_RETRIES; acb->retries = ISCSI_CMD_RETRIES;
if (iscsi_aio_readv_acb(acb) != 0) { if (iscsi_aio_readv_acb(acb) != 0) {
if (acb->task) {
scsi_free_scsi_task(acb->task);
}
qemu_aio_release(acb); qemu_aio_release(acb);
return NULL; return NULL;
} }
@ -509,10 +501,8 @@ iscsi_synccache10_cb(struct iscsi_context *iscsi, int status,
if (status == SCSI_STATUS_CHECK_CONDITION if (status == SCSI_STATUS_CHECK_CONDITION
&& acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION && acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& acb->retries-- > 0) { && acb->retries-- > 0) {
if (acb->task != NULL) { scsi_free_scsi_task(acb->task);
scsi_free_scsi_task(acb->task); acb->task = NULL;
acb->task = NULL;
}
if (iscsi_aio_flush_acb(acb) == 0) { if (iscsi_aio_flush_acb(acb) == 0) {
iscsi_set_events(acb->iscsilun); iscsi_set_events(acb->iscsilun);
return; return;
@ -589,10 +579,8 @@ iscsi_unmap_cb(struct iscsi_context *iscsi, int status,
if (status == SCSI_STATUS_CHECK_CONDITION if (status == SCSI_STATUS_CHECK_CONDITION
&& acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION && acb->task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& acb->retries-- > 0) { && acb->retries-- > 0) {
if (acb->task != NULL) { scsi_free_scsi_task(acb->task);
scsi_free_scsi_task(acb->task); acb->task = NULL;
acb->task = NULL;
}
if (iscsi_aio_discard_acb(acb) == 0) { if (iscsi_aio_discard_acb(acb) == 0) {
iscsi_set_events(acb->iscsilun); iscsi_set_events(acb->iscsilun);
return; return;
@ -647,9 +635,6 @@ iscsi_aio_discard(BlockDriverState *bs,
acb->retries = ISCSI_CMD_RETRIES; acb->retries = ISCSI_CMD_RETRIES;
if (iscsi_aio_discard_acb(acb) != 0) { if (iscsi_aio_discard_acb(acb) != 0) {
if (acb->task) {
scsi_free_scsi_task(acb->task);
}
qemu_aio_release(acb); qemu_aio_release(acb);
return NULL; return NULL;
} }