mirror of
https://github.com/libfuse/libfuse.git
synced 2026-07-07 14:47:41 +08:00
670f938336
Part 1 dropped cqe_processing and made the serving loop wait-only, so the default path now issues one io_uring_submit() per inline reply instead of coalescing a cqe batch into a single submit. Restore the batching: the loop splits submit_and_wait so the flush stays under ring_lock (part 1's race fix), and cqe_processing - now an _Atomic bool set lock-free around handle_cqes() - again gates the per-reply submit. The SQ stays serialised, so a batched reply is always flushed before the next wait, never stranded. Add a conn flag, io_uring_single_issuer, for a filesystem that replies only from the per-queue uring thread: it skips ring_lock entirely and runs the combined io_uring_submit_and_wait() loop, sound because only that thread touches the ring. The flag reuses a reserved padding bit (ABI unchanged; flag 0 keeps the multi-issuer path) and is mirrored into the ring pool after op.init(), before serving starts. A filesystem enables it with fuse_set_conn_flag(conn, FUSE_CONN_FLAG_SINGLE_ISSUER), a new exported setter modelled on fuse_set_feature_flag(); the io_uring_single_issuer bitfield is the internal storage. Signed-off-by: Bernd Schubert <bernd@bsbernd.com>
266 lines
5.2 KiB
Plaintext
266 lines
5.2 KiB
Plaintext
FUSE_3.0 {
|
|
global:
|
|
fuse_destroy;
|
|
fuse_exit;
|
|
fuse_loop;
|
|
fuse_loop_mt;
|
|
fuse_reply_attr;
|
|
fuse_reply_buf;
|
|
fuse_reply_entry;
|
|
fuse_reply_err;
|
|
fuse_reply_none;
|
|
fuse_reply_readlink;
|
|
fuse_reply_write;
|
|
fuse_reply_xattr;
|
|
fuse_req_userdata;
|
|
fuse_session_destroy;
|
|
fuse_session_exit;
|
|
fuse_session_exited;
|
|
fuse_session_loop;
|
|
fuse_session_loop_mt;
|
|
fuse_session_reset;
|
|
fuse_session_fd;
|
|
fuse_opt_parse;
|
|
fuse_opt_add_opt;
|
|
fuse_opt_add_arg;
|
|
fuse_opt_free_args;
|
|
fuse_opt_match;
|
|
fuse_parse_cmdline;
|
|
fuse_remove_signal_handlers;
|
|
fuse_reply_create;
|
|
fuse_reply_open;
|
|
fuse_reply_statfs;
|
|
fuse_set_signal_handlers;
|
|
fuse_add_direntry;
|
|
fuse_add_direntry_plus;
|
|
fuse_daemonize;
|
|
fuse_get_session;
|
|
fuse_interrupted;
|
|
fuse_session_new;
|
|
fuse_main_real;
|
|
fuse_mount;
|
|
fuse_session_custom_io;
|
|
fuse_session_mount;
|
|
fuse_new;
|
|
fuse_opt_insert_arg;
|
|
fuse_reply_lock;
|
|
fuse_req_interrupt_func;
|
|
fuse_req_interrupted;
|
|
fuse_unmount;
|
|
fuse_session_unmount;
|
|
fuse_fs_access;
|
|
fuse_fs_bmap;
|
|
fuse_fs_chmod;
|
|
fuse_fs_chown;
|
|
fuse_fs_create;
|
|
fuse_fs_destroy;
|
|
fuse_fs_flush;
|
|
fuse_fs_fsync;
|
|
fuse_fs_fsyncdir;
|
|
fuse_fs_getattr;
|
|
fuse_fs_getxattr;
|
|
fuse_fs_init;
|
|
fuse_fs_link;
|
|
fuse_fs_listxattr;
|
|
fuse_fs_lock;
|
|
fuse_fs_mkdir;
|
|
fuse_fs_mknod;
|
|
fuse_fs_new;
|
|
fuse_fs_open;
|
|
fuse_fs_opendir;
|
|
fuse_fs_read;
|
|
fuse_fs_readdir;
|
|
fuse_fs_readlink;
|
|
fuse_fs_release;
|
|
fuse_fs_releasedir;
|
|
fuse_fs_removexattr;
|
|
fuse_fs_rename;
|
|
fuse_fs_rmdir;
|
|
fuse_fs_setxattr;
|
|
fuse_fs_statfs;
|
|
fuse_fs_symlink;
|
|
fuse_fs_truncate;
|
|
fuse_fs_unlink;
|
|
fuse_fs_utimens;
|
|
fuse_fs_write;
|
|
fuse_reply_iov;
|
|
fuse_version;
|
|
fuse_pkgversion;
|
|
fuse_reply_bmap;
|
|
cuse_lowlevel_new;
|
|
cuse_lowlevel_main;
|
|
cuse_lowlevel_setup;
|
|
cuse_lowlevel_teardown;
|
|
fuse_fs_ioctl;
|
|
fuse_fs_poll;
|
|
fuse_get_context;
|
|
fuse_getgroups;
|
|
fuse_lowlevel_notify_inval_entry;
|
|
fuse_lowlevel_notify_inval_inode;
|
|
fuse_lowlevel_notify_poll;
|
|
fuse_notify_poll;
|
|
fuse_opt_add_opt_escaped;
|
|
fuse_pollhandle_destroy;
|
|
fuse_reply_ioctl;
|
|
fuse_reply_ioctl_iov;
|
|
fuse_reply_ioctl_retry;
|
|
fuse_reply_poll;
|
|
fuse_req_ctx;
|
|
fuse_req_getgroups;
|
|
fuse_buf_copy;
|
|
fuse_buf_size;
|
|
fuse_fs_read_buf;
|
|
fuse_fs_write_buf;
|
|
fuse_lowlevel_notify_retrieve;
|
|
fuse_lowlevel_notify_store;
|
|
fuse_reply_data;
|
|
fuse_session_process_buf;
|
|
fuse_session_receive_buf;
|
|
fuse_start_cleanup_thread;
|
|
fuse_stop_cleanup_thread;
|
|
fuse_clean_cache;
|
|
fuse_lowlevel_notify_delete;
|
|
fuse_fs_flock;
|
|
fuse_fs_fallocate;
|
|
fuse_lowlevel_help;
|
|
fuse_lowlevel_version;
|
|
fuse_cmdline_help;
|
|
fuse_apply_conn_info_opts;
|
|
fuse_parse_conn_info_opts;
|
|
fuse_fs_lseek;
|
|
fuse_reply_lseek;
|
|
|
|
local:
|
|
*;
|
|
};
|
|
|
|
FUSE_3.1 {
|
|
global:
|
|
fuse_lib_help;
|
|
fuse_invalidate_path;
|
|
fuse_new_30;
|
|
fuse_new_31;
|
|
fuse_new;
|
|
} FUSE_3.0;
|
|
|
|
FUSE_3.2 {
|
|
global:
|
|
fuse_session_loop_mt;
|
|
fuse_session_loop_mt_31;
|
|
fuse_session_loop_mt_32;
|
|
fuse_loop_mt;
|
|
fuse_loop_mt_31;
|
|
} FUSE_3.1;
|
|
|
|
FUSE_3.3 {
|
|
global:
|
|
fuse_open_channel;
|
|
} FUSE_3.2;
|
|
|
|
FUSE_3.4 {
|
|
global:
|
|
fuse_fs_copy_file_range;
|
|
} FUSE_3.3;
|
|
|
|
FUSE_3.7 {
|
|
global:
|
|
fuse_set_log_func;
|
|
fuse_log;
|
|
} FUSE_3.4;
|
|
|
|
FUSE_3.12 {
|
|
global:
|
|
fuse_session_loop_mt;
|
|
fuse_session_loop_mt_312;
|
|
fuse_loop_mt;
|
|
fuse_loop_mt_32;
|
|
fuse_loop_mt_312;
|
|
fuse_loop_cfg_create;
|
|
fuse_loop_cfg_destroy;
|
|
fuse_loop_cfg_set_idle_threads;
|
|
fuse_loop_cfg_set_max_threads;
|
|
fuse_loop_cfg_set_clone_fd;
|
|
fuse_loop_cfg_convert;
|
|
fuse_parse_cmdline;
|
|
fuse_parse_cmdline_30;
|
|
fuse_parse_cmdline_312;
|
|
fuse_lowlevel_notify_expire_entry;
|
|
} FUSE_3.4;
|
|
|
|
FUSE_3.17 {
|
|
global:
|
|
fuse_main_real_versioned;
|
|
fuse_session_new_versioned;
|
|
_fuse_new_30;
|
|
_fuse_new_31;
|
|
fuse_passthrough_open;
|
|
fuse_passthrough_close;
|
|
fuse_session_custom_io_30;
|
|
fuse_session_custom_io_317;
|
|
fuse_set_fail_signal_handlers;
|
|
fuse_log_enable_syslog;
|
|
fuse_log_close_syslog;
|
|
} FUSE_3.12;
|
|
|
|
FUSE_3.17.3 {
|
|
global:
|
|
fuse_set_feature_flag;
|
|
fuse_unset_feature_flag;
|
|
fuse_get_feature_flag;
|
|
|
|
# Not part of public API, for internal testing only
|
|
fuse_convert_to_conn_want_ext;
|
|
} FUSE_3.17;
|
|
|
|
FUSE_3.18 {
|
|
global:
|
|
fuse_req_is_uring;
|
|
fuse_req_get_payload;
|
|
fuse_lowlevel_notify_increment_epoch;
|
|
|
|
fuse_reply_statx;
|
|
fuse_fs_statx;
|
|
} FUSE_3.17;
|
|
|
|
FUSE_3.19 {
|
|
global:
|
|
fuse_set_conn_flag;
|
|
fuse_session_start_teardown_watchdog;
|
|
fuse_session_stop_teardown_watchdog;
|
|
fuse_lowlevel_notify_prune;
|
|
fuse_daemonize_early_start;
|
|
fuse_daemonize_early_success;
|
|
fuse_daemonize_early_fail;
|
|
fuse_daemonize_early_is_active;
|
|
fuse_session_set_debug;
|
|
fuse_session_set_sync_init;
|
|
fuse_service_accept;
|
|
fuse_service_append_args;
|
|
fuse_service_can_allow_other;
|
|
fuse_service_can_fuseblk;
|
|
fuse_service_cmdline;
|
|
fuse_service_destroy;
|
|
fuse_service_exit;
|
|
fuse_service_expect_mount_format;
|
|
fuse_service_finish_file_requests;
|
|
fuse_service_main_real_versioned;
|
|
fuse_service_parse_cmdline_opts;
|
|
fuse_service_receive_file;
|
|
fuse_service_release;
|
|
fuse_service_request_file;
|
|
fuse_service_request_blockdev;
|
|
fuse_service_send_goodbye;
|
|
fuse_service_session_mount;
|
|
fuse_req_secctx_count;
|
|
fuse_req_secctx_reset;
|
|
fuse_req_secctx_next;
|
|
|
|
cuse_lowlevel_new_319;
|
|
cuse_lowlevel_setup_319;
|
|
cuse_lowlevel_main_319;
|
|
} FUSE_3.18;
|
|
|
|
# Local Variables:
|
|
# indent-tabs-mode: t
|
|
# End:
|