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
+12
View File
@@ -19,6 +19,7 @@
#include <stdint.h> #include <stdint.h>
#include <time.h> #include <time.h>
#include <unistd.h>
#if defined(_WIN32) #if defined(_WIN32)
#include <basetsd.h> #include <basetsd.h>
@@ -171,6 +172,8 @@ struct iscsi_context {
struct iscsi_context *old_iscsi; struct iscsi_context *old_iscsi;
int retry_cnt; int retry_cnt;
int no_ua_on_reconnect; int no_ua_on_reconnect;
void (*fd_dup_cb)(struct iscsi_context *iscsi, void *opaque);
void *fd_dup_opaque;
}; };
#define ISCSI_PDU_IMMEDIATE 0x40 #define ISCSI_PDU_IMMEDIATE 0x40
@@ -397,6 +400,15 @@ typedef struct iscsi_transport {
int (*which_events)(struct iscsi_context *iscsi); int (*which_events)(struct iscsi_context *iscsi);
} iscsi_transport; } 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 #ifdef __cplusplus
} }
#endif #endif
+6
View File
@@ -1648,6 +1648,12 @@ iscsi_set_reconnect_max_retries(struct iscsi_context *iscsi, int count);
EXTERN void EXTERN void
iscsi_set_no_ua_on_reconnect(struct iscsi_context *iscsi, int state); 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 #ifdef __cplusplus
} }
#endif #endif
+2
View File
@@ -454,6 +454,8 @@ static int reconnect(struct iscsi_context *iscsi, int force)
tmp_iscsi->cache_allocations = iscsi->cache_allocations; tmp_iscsi->cache_allocations = iscsi->cache_allocations;
tmp_iscsi->scsi_timeout = iscsi->scsi_timeout; tmp_iscsi->scsi_timeout = iscsi->scsi_timeout;
tmp_iscsi->no_ua_on_reconnect = iscsi->no_ua_on_reconnect; 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; tmp_iscsi->reconnect_max_retries = iscsi->reconnect_max_retries;
+9
View File
@@ -831,3 +831,12 @@ iscsi_set_timeout(struct iscsi_context *iscsi, int timeout)
iscsi->scsi_timeout = timeout; iscsi->scsi_timeout = timeout;
return 0; 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;
}
+2 -2
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 iscsi_context *iscsi = cma_id->context;
struct iser_conn *iser_conn = iscsi->opaque; 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; return -1;
} }
@@ -1683,7 +1683,7 @@ iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attri
goto error; 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"); iscsi_set_error(iscsi, "Failed dup event channel fd");
goto error; goto error;
} }
+1
View File
@@ -286,3 +286,4 @@ scsi_task_set_iov_out
scsi_version_to_str scsi_version_to_str
scsi_version_descriptor_to_str scsi_version_descriptor_to_str
win32_poll win32_poll
iscsi_set_fd_dup_cb
+1 -1
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 (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; return -1;
} }
close(iscsi->fd); close(iscsi->fd);