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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user