Merge pull request #393 from pizhenwei/on-fd-dup
Add iscsi_set_fd_dup_cb
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user