CONNECTION: Track the connection state and callback via the context structure

Dont free the connection state when login is finished, instead track it via the
iscsi context structure and free it once the context is destroyed
This commit is contained in:
Ronnie Sahlberg
2012-08-02 08:51:25 +10:00
parent d5d062a494
commit 439f68e555
3 changed files with 8 additions and 8 deletions

View File

@@ -56,7 +56,6 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
"failed.");
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL,
ct->private_data);
free(ct);
}
scsi_free_scsi_task(task);
return;
@@ -74,7 +73,6 @@ 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);
}
@@ -86,7 +84,6 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_,
if (status != 0) {
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
free(ct);
return;
}
@@ -94,7 +91,6 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_,
iscsi_testunitready_cb, ct) == NULL) {
iscsi_set_error(iscsi, "iscsi_testunitready_async failed.");
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
free(ct);
}
}
@@ -108,14 +104,12 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data _U_
iscsi_set_error(iscsi, "Failed to connect to iSCSI socket. "
"%s", iscsi_get_error(iscsi));
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
free(ct);
return;
}
if (iscsi_login_async(iscsi, iscsi_login_cb, ct) != 0) {
iscsi_set_error(iscsi, "iscsi_login_async failed.");
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
free(ct);
}
}
@@ -139,7 +133,6 @@ iscsi_full_connect_async(struct iscsi_context *iscsi, const char *portal,
ct->lun = lun;
ct->private_data = private_data;
if (iscsi_connect_async(iscsi, portal, iscsi_connect_cb, ct) != 0) {
free(ct);
return -ENOMEM;
}
return 0;

View File

@@ -244,6 +244,9 @@ iscsi_destroy_context(struct iscsi_context *iscsi)
free(discard_const(iscsi->chap_c));
iscsi->chap_c = NULL;
free(iscsi->connect_data);
iscsi->connect_data = NULL;
free(iscsi);
return 0;

View File

@@ -68,6 +68,11 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
struct addrinfo *ai = NULL;
int socksize;
if (iscsi->connect_data != NULL) {
free(iscsi->connect_data);
}
iscsi->connect_data = private_data;
if (iscsi->fd != -1) {
iscsi_set_error(iscsi,
"Trying to connect but already connected.");
@@ -154,7 +159,6 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
}
iscsi->socket_status_cb = cb;
iscsi->connect_data = private_data;
set_nonblocking(iscsi->fd);