From eff36099c12e936a880c9f2e102b9cf8a7166d40 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 8 Apr 2012 20:11:53 +0200 Subject: [PATCH] s3: Move the aio signal init to the vfs module On platforms that don't have an RT signal space, signal initialization fails. aio_fork and aio_pthread don't need the signal, so this would block them from running as well. --- source3/modules/vfs_default.c | 8 ++++++++ source3/smbd/aio.c | 28 +++++++--------------------- source3/smbd/proto.h | 1 + 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 915eae67d3d..dd5441740ad 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -2059,6 +2059,10 @@ static int vfswrap_fsetxattr(struct vfs_handle_struct *handle, struct files_stru static int vfswrap_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) { int ret; + if (!initialize_async_io_handler()) { + errno = ENOSYS; + return -1; + } /* * aio_read must be done as root, because in the glibc aio * implementation the helper thread needs to be able to send a signal @@ -2074,6 +2078,10 @@ static int vfswrap_aio_read(struct vfs_handle_struct *handle, struct files_struc static int vfswrap_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) { int ret; + if (!initialize_async_io_handler()) { + errno = ENOSYS; + return -1; + } /* * aio_write must be done as root, because in the glibc aio * implementation the helper thread needs to be able to send a signal diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 000206a9852..e5347a45a4a 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -71,7 +71,7 @@ static void smbd_aio_signal_handler(struct tevent_context *ev_ctx, } -static bool initialize_async_io_handler(void) +bool initialize_async_io_handler(void) { static bool tried_signal_setup = false; @@ -156,11 +156,6 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn, size_t min_aio_read_size = lp_aio_read_size(SNUM(conn)); int ret; - /* Ensure aio is initialized. */ - if (!initialize_async_io_handler()) { - return NT_STATUS_RETRY; - } - if (fsp->base_fsp != NULL) { /* No AIO on streams yet */ DEBUG(10, ("AIO on streams not yet supported\n")); @@ -263,11 +258,6 @@ NTSTATUS schedule_aio_write_and_X(connection_struct *conn, size_t min_aio_write_size = lp_aio_write_size(SNUM(conn)); int ret; - /* Ensure aio is initialized. */ - if (!initialize_async_io_handler()) { - return NT_STATUS_RETRY; - } - if (fsp->base_fsp != NULL) { /* No AIO on streams yet */ DEBUG(10, ("AIO on streams not yet supported\n")); @@ -426,11 +416,6 @@ NTSTATUS schedule_smb2_aio_read(connection_struct *conn, size_t min_aio_read_size = lp_aio_read_size(SNUM(conn)); int ret; - /* Ensure aio is initialized. */ - if (!initialize_async_io_handler()) { - return NT_STATUS_RETRY; - } - if (fsp->base_fsp != NULL) { /* No AIO on streams yet */ DEBUG(10, ("AIO on streams not yet supported\n")); @@ -532,11 +517,6 @@ NTSTATUS schedule_aio_smb2_write(connection_struct *conn, size_t min_aio_write_size = lp_aio_write_size(SNUM(conn)); int ret; - /* Ensure aio is initialized. */ - if (!initialize_async_io_handler()) { - return NT_STATUS_RETRY; - } - if (fsp->base_fsp != NULL) { /* No AIO on streams yet */ DEBUG(10, ("AIO on streams not yet supported\n")); @@ -1058,6 +1038,12 @@ void cancel_aio_by_fsp(files_struct *fsp) } #else + +bool initialize_async_io_handler(void) +{ + return false; +} + NTSTATUS schedule_aio_read_and_X(connection_struct *conn, struct smb_request *smbreq, files_struct *fsp, off_t startpos, diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index ca267a05008..5ab51850873 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -64,6 +64,7 @@ void srv_set_signing(struct smbd_server_connection *conn, /* The following definitions come from smbd/aio.c */ +bool initialize_async_io_handler(void); NTSTATUS schedule_aio_read_and_X(connection_struct *conn, struct smb_request *req, files_struct *fsp, off_t startpos, -- 2.11.4.GIT