Merge pull request #393 from pizhenwei/on-fd-dup

Add iscsi_set_fd_dup_cb
This commit is contained in:
Ronnie Sahlberg
2023-06-06 16:11:30 +10:00
committed by GitHub
7 changed files with 33 additions and 3 deletions

View File

@@ -19,6 +19,7 @@
#include <stdint.h>
#include <time.h>
#include <unistd.h>
#if defined(_WIN32)
#include <basetsd.h>
@@ -171,6 +172,8 @@ struct iscsi_context {
struct iscsi_context *old_iscsi;
int retry_cnt;
int no_ua_on_reconnect;
void (*fd_dup_cb)(struct iscsi_context *iscsi, void *opaque);
void *fd_dup_opaque;
};
#define ISCSI_PDU_IMMEDIATE 0x40
@@ -397,6 +400,15 @@ typedef struct iscsi_transport {
int (*which_events)(struct iscsi_context *iscsi);
} iscsi_transport;
static inline int iscsi_dup2(struct iscsi_context *iscsi, int oldfd, int newfd)
{
int ret = dup2(oldfd, newfd);
if ((ret >= 0) && iscsi->fd_dup_cb)
iscsi->fd_dup_cb(iscsi, iscsi->fd_dup_opaque);
return ret;
}
#ifdef __cplusplus
}
#endif

View File

@@ -1648,6 +1648,12 @@ iscsi_set_reconnect_max_retries(struct iscsi_context *iscsi, int count);
EXTERN void
iscsi_set_no_ua_on_reconnect(struct iscsi_context *iscsi, int state);
/* Set callback on iscsi file descriptor on duplicating */
EXTERN void
iscsi_set_fd_dup_cb(struct iscsi_context *iscsi,
void (*cb)(struct iscsi_context *iscsi, void *opaque),
void *opaque);
#ifdef __cplusplus
}
#endif

View File

@@ -454,6 +454,8 @@ static int reconnect(struct iscsi_context *iscsi, int force)
tmp_iscsi->cache_allocations = iscsi->cache_allocations;
tmp_iscsi->scsi_timeout = iscsi->scsi_timeout;
tmp_iscsi->no_ua_on_reconnect = iscsi->no_ua_on_reconnect;
tmp_iscsi->fd_dup_cb = iscsi->fd_dup_cb;
tmp_iscsi->fd_dup_opaque = iscsi->fd_dup_opaque;
tmp_iscsi->reconnect_max_retries = iscsi->reconnect_max_retries;

View File

@@ -831,3 +831,12 @@ iscsi_set_timeout(struct iscsi_context *iscsi, int timeout)
iscsi->scsi_timeout = timeout;
return 0;
}
void
iscsi_set_fd_dup_cb(struct iscsi_context *iscsi,
void (*cb)(struct iscsi_context *iscsi, void *opaque),
void *opaque)
{
iscsi->fd_dup_cb = cb;
iscsi->fd_dup_opaque = opaque;
}

View File

@@ -1525,7 +1525,7 @@ static int iser_connected_handler(struct rdma_cm_id *cma_id) {
struct iscsi_context *iscsi = cma_id->context;
struct iser_conn *iser_conn = iscsi->opaque;
if (dup2(iser_conn->comp_channel->fd, iscsi->fd) == -1) {
if (iscsi_dup2(iscsi, iser_conn->comp_channel->fd, iscsi->fd) == -1) {
return -1;
}
@@ -1683,7 +1683,7 @@ iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attri
goto error;
}
if (dup2(iser_conn->cma_channel->fd, iscsi->fd) < 0) {
if (iscsi_dup2(iscsi, iser_conn->cma_channel->fd, iscsi->fd) < 0) {
iscsi_set_error(iscsi, "Failed dup event channel fd");
goto error;
}

View File

@@ -286,3 +286,4 @@ scsi_task_set_iov_out
scsi_version_to_str
scsi_version_descriptor_to_str
win32_poll
iscsi_set_fd_dup_cb

View File

@@ -228,7 +228,7 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address *
}
if (iscsi->old_iscsi && iscsi->fd != iscsi->old_iscsi->fd) {
if (dup2(iscsi->fd, iscsi->old_iscsi->fd) == -1) {
if (iscsi_dup2(iscsi, iscsi->fd, iscsi->old_iscsi->fd) == -1) {
return -1;
}
close(iscsi->fd);