iser: fix resource leak during reconnect

After iser reconnects successfully, iser drive should close old
connection and release resources.

Fix resource leak in this patch, and test a lot, this patch works
fine.

Test env:
192.168.122.204: run as a software gateway
192.168.122.205: run iser target, default gateway 192.168.122.204
192.168.122.206: run QEMU as intiator, default gateway 192.168.122.204

run script on 192.168.122.204:
for i in `seq 1 100`
do
	iptables -s 192.168.122.205/32 -A FORWARD -m statistic --mode random --probability 1 -j DROP
	iptables -s 192.168.122.206/32 -A FORWARD -m statistic --mode random --probability 1 -j DROP
	sleep 30
	iptables -F
	sleep 30
done

Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
This commit is contained in:
zhenwei pi
2020-02-28 18:29:41 +08:00
parent 3ccbceb6ff
commit b98454ae97

View File

@@ -294,8 +294,10 @@ iscsi_iser_disconnect(struct iscsi_context *iscsi) {
struct iser_conn *iser_conn = iscsi->opaque;
iser_conn_terminate(iser_conn);
iser_conn_release(iser_conn);
if (iser_conn) {
iser_conn_terminate(iser_conn);
iser_conn_release(iser_conn);
}
iscsi->fd = -1;
iscsi->is_connected = 0;
@@ -1462,6 +1464,25 @@ iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attri
iscsi->socket_status_cb(iscsi, SCSI_STATUS_GOOD, NULL, iscsi->connect_data);
iscsi->socket_status_cb = NULL;
if (iscsi->old_iscsi && iscsi->opaque != iscsi->old_iscsi->opaque) {
struct iser_conn *old_iser_conn = iscsi->old_iscsi->opaque;
int oldfd = old_iser_conn->comp_channel->fd;
int newfd = iser_conn->comp_channel->fd;
iser_conn_terminate(old_iser_conn);
iser_conn_release(old_iser_conn);
if (dup2(newfd, oldfd) == -1) {
return -1;
}
close(newfd);
iser_conn->comp_channel->fd = oldfd;
iscsi_free(iscsi->old_iscsi, iscsi->old_iscsi->opaque);
iscsi->old_iscsi->opaque = NULL;
}
return 0;
}