change dont automatically free the scsi_task once the callback completes.
Freeing the scsi_task structure is the responsibility of the application to either do so during the callback, or later.
This commit is contained in:
@@ -32,12 +32,11 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
||||
void *command_data, void *private_data)
|
||||
{
|
||||
struct connect_task *ct = private_data;
|
||||
struct scsi_task *task = command_data;
|
||||
|
||||
if (status != 0) {
|
||||
struct scsi_task *scsi = command_data;
|
||||
|
||||
if (scsi->sense.key == SCSI_SENSE_UNIT_ATTENTION
|
||||
&& scsi->sense.ascq == SCSI_SENSE_ASCQ_BUS_RESET) {
|
||||
if (task->sense.key == SCSI_SENSE_UNIT_ATTENTION
|
||||
&& task->sense.ascq == SCSI_SENSE_ASCQ_BUS_RESET) {
|
||||
/* This is just the normal unitattention/busreset
|
||||
* you always get just after a fresh login. Try
|
||||
* again.
|
||||
@@ -51,6 +50,7 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
||||
ct->private_data);
|
||||
free(ct);
|
||||
}
|
||||
scsi_free_scsi_task(task);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -58,6 +58,7 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
||||
ct->cb(iscsi, status?SCSI_STATUS_ERROR:SCSI_STATUS_GOOD, NULL,
|
||||
ct->private_data);
|
||||
free(ct);
|
||||
scsi_free_scsi_task(task);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -38,23 +38,11 @@ iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata)
|
||||
return;
|
||||
}
|
||||
if (scsi_cbdata->task != NULL) {
|
||||
scsi_free_scsi_task(scsi_cbdata->task);
|
||||
scsi_cbdata->task = NULL;
|
||||
}
|
||||
free(scsi_cbdata);
|
||||
}
|
||||
|
||||
void
|
||||
iscsi_cbdata_steal_scsi_task(struct scsi_task *task)
|
||||
{
|
||||
struct iscsi_scsi_cbdata *scsi_cbdata =
|
||||
scsi_get_task_private_ptr(task);
|
||||
|
||||
if (scsi_cbdata != NULL) {
|
||||
scsi_cbdata->task = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
iscsi_scsi_response_cb(struct iscsi_context *iscsi, int status,
|
||||
void *command_data, void *private_data)
|
||||
|
||||
@@ -156,7 +156,6 @@ scsi_sync_cb(struct iscsi_context *iscsi _U_, int status, void *command_data,
|
||||
state->status = status;
|
||||
state->finished = 1;
|
||||
state->task = task;
|
||||
iscsi_cbdata_steal_scsi_task(task);
|
||||
}
|
||||
|
||||
struct scsi_task *
|
||||
|
||||
Reference in New Issue
Block a user