libiscsi is widely used by poll driven, include libiscsi itself,
QEMU. Using poll works fine after iscsi reconnect, but it does not work
in epoll, because the epoll event has been removed during duplicating
file descriptor in kernel.
Add a new function iscsi_set_fd_dup_cb to set callback, then uplayer
gets notified after duplicating. The following codes reproduce this
issue, and test this patch by compiling flags -DISCSI_FD_DUP_CB.
static void iscsi_epoll_event(struct iscsi_context *iscsi, int epollfd, bool new)
{
static int epoll_event;
struct epoll_event ev = { 0 };
int pevent = iscsi_which_events(iscsi);
int event = 0;
if (pevent & POLLIN)
event |= EPOLLIN;
if (pevent & POLLOUT)
event |= EPOLLOUT;
ev.events = event;
ev.data.fd = iscsi_get_fd(iscsi);
if (new)
epoll_ctl(epollfd, EPOLL_CTL_ADD, ev.data.fd, &ev);
else if (epoll_event != event) {
epoll_ctl(epollfd, EPOLL_CTL_MOD, ev.data.fd, &ev);
}
epoll_event = event;
}
static void iscsi_tsk_cb(struct iscsi_context *iscsi, int status, void *command_data, void *private_data)
{
printf("iscsi_tsk_cb status %d\n", status);
exit(0);
}
static void iscsi_fd_dup_cb(struct iscsi_context *iscsi, void *opaque)
{
int epollfd = *(int *)opaque;
iscsi_epoll_event(iscsi, epollfd, true);
}
static void iscsi_on_pollout(struct iscsi_context *iscsi, struct iscsi_url *iscsi_url, int epollfd)
{
static struct scsi_task *tsk = NULL;
iscsi_service(iscsi, POLLOUT);
if (!tsk) {
tsk = iscsi_readcapacity16_task(iscsi, iscsi_url->lun, iscsi_tsk_cb, NULL);
assert(tsk);
}
}
int main(int argc, char *argv[])
{
struct iscsi_context *iscsi;
struct iscsi_url *iscsi_url;
struct epoll_event ev, revent;
int epollfd;
iscsi = iscsi_create_context("dummy");
assert(iscsi);
iscsi_url = iscsi_parse_full_url(iscsi, argv[1]);
assert(iscsi_url);
iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
assert(!iscsi_full_connect_sync(iscsi, iscsi_url->portal, iscsi_url->lun));
epollfd = epoll_create1(0);
iscsi_epoll_event(iscsi, epollfd, true);
iscsi_set_fd_dup_cb(iscsi, iscsi_fd_dup_cb, &epollfd);
iscsi_reconnect(iscsi);
while (epoll_wait(epollfd, &revent, 1, 100) >= 0) {
if (revent.events & EPOLLIN)
iscsi_service(iscsi, POLLIN);
if (revent.events & EPOLLOUT)
iscsi_on_pollout(iscsi, iscsi_url, epollfd);
iscsi_epoll_event(iscsi, epollfd, false);
}
return 0;
}
Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
290 lines
6.6 KiB
Modula-2
290 lines
6.6 KiB
Modula-2
LIBRARY libiscsi
|
|
EXPORTS
|
|
iscsi_connect_async
|
|
iscsi_connect_sync
|
|
iscsi_force_reconnect_sync
|
|
iscsi_reconnect_sync
|
|
iscsi_create_context
|
|
iscsi_destroy_context
|
|
iscsi_destroy_url
|
|
iscsi_disconnect
|
|
iscsi_discovery_async
|
|
iscsi_discovery_sync
|
|
iscsi_free_discovery_data
|
|
iscsi_force_reconnect
|
|
iscsi_full_connect_async
|
|
iscsi_full_connect_sync
|
|
iscsi_get_error
|
|
iscsi_get_fd
|
|
iscsi_get_lba_status_sync
|
|
iscsi_get_lba_status_task
|
|
iscsi_get_target_address
|
|
iscsi_get_nops_in_flight
|
|
iscsi_init_transport
|
|
iscsi_inquiry_sync
|
|
iscsi_inquiry_task
|
|
iscsi_is_logged_in
|
|
iscsi_log_to_stderr
|
|
iscsi_login_async
|
|
iscsi_login_sync
|
|
iscsi_logout_async
|
|
iscsi_logout_sync
|
|
iscsi_modeselect6_sync
|
|
iscsi_modeselect6_task
|
|
iscsi_modeselect10_sync
|
|
iscsi_modeselect10_task
|
|
iscsi_modesense6_sync
|
|
iscsi_modesense6_task
|
|
iscsi_modesense10_sync
|
|
iscsi_modesense10_task
|
|
iscsi_nop_out_async
|
|
iscsi_parse_full_url
|
|
iscsi_parse_portal_url
|
|
iscsi_persistent_reserve_in_task
|
|
iscsi_persistent_reserve_in_sync
|
|
iscsi_persistent_reserve_out_task
|
|
iscsi_persistent_reserve_out_sync
|
|
iscsi_prefetch10_sync
|
|
iscsi_prefetch10_task
|
|
iscsi_prefetch16_sync
|
|
iscsi_prefetch16_task
|
|
iscsi_preventallow_sync
|
|
iscsi_preventallow_task
|
|
iscsi_queue_length
|
|
iscsi_out_queue_length
|
|
iscsi_queue_pdu
|
|
iscsi_read10_sync
|
|
iscsi_read10_iov_sync
|
|
iscsi_read10_task
|
|
iscsi_read10_iov_task
|
|
iscsi_read12_sync
|
|
iscsi_read12_iov_sync
|
|
iscsi_read12_task
|
|
iscsi_read12_iov_task
|
|
iscsi_read16_sync
|
|
iscsi_read16_iov_sync
|
|
iscsi_read16_task
|
|
iscsi_read16_iov_task
|
|
iscsi_read6_sync
|
|
iscsi_read6_iov_sync
|
|
iscsi_read6_task
|
|
iscsi_read6_iov_task
|
|
iscsi_readcapacity10_sync
|
|
iscsi_readcapacity10_task
|
|
iscsi_readcapacity16_sync
|
|
iscsi_readcapacity16_task
|
|
iscsi_readdefectdata10_sync
|
|
iscsi_readdefectdata10_task
|
|
iscsi_readdefectdata12_sync
|
|
iscsi_readdefectdata12_task
|
|
iscsi_readtoc_sync
|
|
iscsi_readtoc_task
|
|
iscsi_reserve6_sync
|
|
iscsi_reserve6_task
|
|
iscsi_release6_sync
|
|
iscsi_release6_task
|
|
iscsi_report_supported_opcodes_sync
|
|
iscsi_report_supported_opcodes_task
|
|
iscsi_extended_copy_sync
|
|
iscsi_extended_copy_task
|
|
iscsi_receive_copy_results_sync
|
|
iscsi_receive_copy_results_task
|
|
iscsi_reconnect
|
|
iscsi_sanitize_sync
|
|
iscsi_sanitize_task
|
|
iscsi_sanitize_block_erase_sync
|
|
iscsi_sanitize_block_erase_task
|
|
iscsi_sanitize_crypto_erase_sync
|
|
iscsi_sanitize_crypto_erase_task
|
|
iscsi_sanitize_exit_failure_mode_sync
|
|
iscsi_sanitize_exit_failure_mode_task
|
|
iscsi_set_cache_allocations
|
|
iscsi_set_noautoreconnect
|
|
iscsi_set_reconnect_max_retries
|
|
iscsi_set_timeout
|
|
iscsi_reportluns_sync
|
|
iscsi_reportluns_task
|
|
iscsi_scsi_cancel_all_tasks
|
|
iscsi_scsi_command_async
|
|
iscsi_scsi_command_sync
|
|
iscsi_scsi_cancel_task
|
|
iscsi_service
|
|
iscsi_set_alias
|
|
iscsi_set_immediate_data
|
|
iscsi_set_initial_r2t
|
|
iscsi_set_log_level
|
|
iscsi_set_log_fn
|
|
iscsi_set_header_digest
|
|
iscsi_set_initiator_username_pwd
|
|
iscsi_set_isid_en
|
|
iscsi_set_isid_oui
|
|
iscsi_set_isid_random
|
|
iscsi_set_isid_reserved
|
|
iscsi_set_no_ua_on_reconnect
|
|
iscsi_set_noautoreconnect
|
|
iscsi_set_session_type
|
|
iscsi_set_target_username_pwd
|
|
iscsi_set_targetname
|
|
iscsi_set_tcp_keepalive
|
|
iscsi_set_tcp_user_timeout
|
|
iscsi_set_tcp_keepidle
|
|
iscsi_set_tcp_keepcnt
|
|
iscsi_set_tcp_keepintvl
|
|
iscsi_set_tcp_syncnt
|
|
iscsi_set_bind_interfaces
|
|
iscsi_startstopunit_sync
|
|
iscsi_startstopunit_task
|
|
iscsi_synchronizecache10_sync
|
|
iscsi_synchronizecache10_task
|
|
iscsi_synchronizecache16_sync
|
|
iscsi_synchronizecache16_task
|
|
iscsi_task_mgmt_abort_task_async
|
|
iscsi_task_mgmt_abort_task_sync
|
|
iscsi_task_mgmt_abort_task_set_async
|
|
iscsi_task_mgmt_abort_task_set_sync
|
|
iscsi_task_mgmt_async
|
|
iscsi_task_mgmt_sync
|
|
iscsi_task_mgmt_lun_reset_async
|
|
iscsi_task_mgmt_lun_reset_sync
|
|
iscsi_task_mgmt_target_cold_reset_async
|
|
iscsi_task_mgmt_target_cold_reset_sync
|
|
iscsi_task_mgmt_target_warm_reset_async
|
|
iscsi_task_mgmt_target_warm_reset_sync
|
|
iscsi_testunitready_sync
|
|
iscsi_testunitready_task
|
|
iscsi_unmap_sync
|
|
iscsi_unmap_task
|
|
iscsi_verify10_sync
|
|
iscsi_verify10_task
|
|
iscsi_verify12_sync
|
|
iscsi_verify12_task
|
|
iscsi_verify16_sync
|
|
iscsi_verify16_task
|
|
iscsi_which_events
|
|
iscsi_write10_sync
|
|
iscsi_write10_iov_sync
|
|
iscsi_write10_task
|
|
iscsi_write10_iov_task
|
|
iscsi_write12_sync
|
|
iscsi_write12_iov_sync
|
|
iscsi_write12_task
|
|
iscsi_write12_iov_task
|
|
iscsi_write16_sync
|
|
iscsi_write16_iov_sync
|
|
iscsi_write16_task
|
|
iscsi_write16_iov_task
|
|
iscsi_writeatomic16_sync
|
|
iscsi_writeatomic16_iov_sync
|
|
iscsi_writeatomic16_task
|
|
iscsi_writeatomic16_iov_task
|
|
iscsi_orwrite_sync
|
|
iscsi_orwrite_iov_sync
|
|
iscsi_orwrite_task
|
|
iscsi_orwrite_iov_task
|
|
iscsi_compareandwrite_sync
|
|
iscsi_compareandwrite_iov_sync
|
|
iscsi_compareandwrite_task
|
|
iscsi_compareandwrite_iov_task
|
|
iscsi_writeverify10_sync
|
|
iscsi_writeverify10_iov_sync
|
|
iscsi_writeverify10_task
|
|
iscsi_writeverify10_iov_task
|
|
iscsi_writeverify12_sync
|
|
iscsi_writeverify12_iov_sync
|
|
iscsi_writeverify12_task
|
|
iscsi_writeverify12_iov_task
|
|
iscsi_writeverify16_sync
|
|
iscsi_writeverify16_iov_sync
|
|
iscsi_writeverify16_task
|
|
iscsi_writeverify16_iov_task
|
|
iscsi_writesame10_sync
|
|
iscsi_writesame10_iov_sync
|
|
iscsi_writesame10_task
|
|
iscsi_writesame10_iov_task
|
|
iscsi_writesame16_sync
|
|
iscsi_writesame16_iov_sync
|
|
iscsi_writesame16_task
|
|
iscsi_writesame16_iov_task
|
|
scsi_association_to_str
|
|
scsi_cdb_compareandwrite
|
|
scsi_cdb_extended_copy
|
|
scsi_cdb_inquiry
|
|
scsi_cdb_get_lba_status
|
|
scsi_cdb_modeselect6
|
|
scsi_cdb_modeselect10
|
|
scsi_cdb_modesense6
|
|
scsi_cdb_modesense10
|
|
scsi_cdb_persistent_reserve_in
|
|
scsi_cdb_persistent_reserve_out
|
|
scsi_cdb_prefetch10
|
|
scsi_cdb_prefetch16
|
|
scsi_cdb_preventallow
|
|
scsi_cdb_read10
|
|
scsi_cdb_read12
|
|
scsi_cdb_read16
|
|
scsi_cdb_read6
|
|
scsi_cdb_readcapacity10
|
|
scsi_cdb_readcapacity16
|
|
scsi_cdb_readdefectdata10
|
|
scsi_cdb_readdefectdata12
|
|
scsi_cdb_readtoc
|
|
scsi_cdb_receive_copy_results
|
|
scsi_cdb_reserve6
|
|
scsi_cdb_release6
|
|
scsi_cdb_report_supported_opcodes
|
|
scsi_cdb_sanitize
|
|
scsi_cdb_serviceactionin16
|
|
scsi_cdb_startstopunit
|
|
scsi_cdb_synchronizecache10
|
|
scsi_cdb_synchronizecache16
|
|
scsi_cdb_testunitready
|
|
scsi_cdb_unmap
|
|
scsi_cdb_verify10
|
|
scsi_cdb_verify12
|
|
scsi_cdb_verify16
|
|
scsi_cdb_write10
|
|
scsi_cdb_write12
|
|
scsi_cdb_write16
|
|
scsi_cdb_writeatomic16
|
|
scsi_cdb_orwrite
|
|
scsi_cdb_writeverify10
|
|
scsi_cdb_writeverify12
|
|
scsi_cdb_writeverify16
|
|
scsi_cdb_writesame10
|
|
scsi_cdb_writesame16
|
|
scsi_codeset_to_str
|
|
scsi_create_task
|
|
scsi_datain_getfullsize
|
|
scsi_datain_unmarshall
|
|
scsi_cdb_unmarshall
|
|
scsi_designator_type_to_str
|
|
scsi_devqualifier_to_str
|
|
scsi_devtype_to_str
|
|
scsi_free_scsi_task
|
|
scsi_get_task_private_ptr
|
|
scsi_get_uint16
|
|
scsi_get_uint32
|
|
scsi_get_uint64
|
|
scsi_inquiry_pagecode_to_str
|
|
scsi_malloc
|
|
scsi_modesense_dataout_marshall
|
|
scsi_modesense_get_page
|
|
scsi_parse_sense_data
|
|
scsi_protocol_identifier_to_str
|
|
scsi_reportluns_cdb
|
|
scsi_sense_ascq_str
|
|
scsi_sense_key_str
|
|
scsi_set_task_private_ptr
|
|
scsi_set_uint16
|
|
scsi_set_uint32
|
|
scsi_set_uint64
|
|
scsi_task_add_data_in_buffer
|
|
scsi_task_add_data_out_buffer
|
|
scsi_task_get_status
|
|
scsi_task_set_iov_in
|
|
scsi_task_set_iov_out
|
|
scsi_version_to_str
|
|
scsi_version_descriptor_to_str
|
|
win32_poll
|
|
iscsi_set_fd_dup_cb
|