diff --git a/packaging/RHEL-CTDB/configure.rpm b/packaging/RHEL-CTDB/configure.rpm index c36d4bdf285..a2d35ea01d6 100755 --- a/packaging/RHEL-CTDB/configure.rpm +++ b/packaging/RHEL-CTDB/configure.rpm @@ -62,7 +62,6 @@ CC="$CC" CFLAGS="-Wall -g -D_GNU_SOURCE -O3" ./configure -C \ --with-ctdb=/usr/include \ --without-ldb \ --without-dnsupdate \ - --with-aio-support \ --disable-external-libtalloc \ --disable-external-libtdb \ $* diff --git a/packaging/RHEL-CTDB/samba.spec.tmpl b/packaging/RHEL-CTDB/samba.spec.tmpl index 0d8b5a6f474..6380158bec8 100644 --- a/packaging/RHEL-CTDB/samba.spec.tmpl +++ b/packaging/RHEL-CTDB/samba.spec.tmpl @@ -180,7 +180,6 @@ CFLAGS="$RPM_OPT_FLAGS $EXTRA -D_GNU_SOURCE" ./configure \ --with-ctdb=/usr/include \ --without-ldb \ --without-dnsupdate \ - --with-aio-support \ --disable-external-libtalloc \ --disable-external-libtdb @@ -428,7 +427,6 @@ exit 0 %{_libarchdir}/samba/vfs/tsmsm.so %endif %{_libarchdir}/samba/vfs/xattr_tdb.so -%{_libarchdir}/samba/vfs/aio_posix.so %{_libarchdir}/samba/vfs/aio_pthread.so %{_libarchdir}/samba/vfs/media_harmony.so diff --git a/source3/modules/vfs_aio_posix.c b/source3/modules/vfs_aio_posix.c deleted file mode 100644 index bca69b4d441..00000000000 --- a/source3/modules/vfs_aio_posix.c +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Simulate pread_send/recv and pwrite_send/recv using posix aio - * - * Copyright (C) Volker Lendecke 2012 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "includes.h" -#include "system/filesys.h" -#include "system/shmem.h" -#include "smbd/smbd.h" -#include "smbd/globals.h" -#include "lib/util/tevent_unix.h" -#include "lib/util/sys_rw.h" -#include - -/* The signal we'll use to signify aio done. */ -#ifndef RT_SIGNAL_AIO -#define RT_SIGNAL_AIO (SIGRTMIN+3) -#endif - -#ifndef HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR -#ifdef HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR -#define sival_int sigval_int -#define sival_ptr sigval_ptr -#endif -#endif - -static struct tevent_signal *aio_signal_event = NULL; - -struct aio_posix_state { - struct aiocb acb; - ssize_t ret; - int err; -}; - -static int aio_posix_state_destructor(struct aio_posix_state *s) -{ - int ret; - - /* - * We could do better here. This destructor is run when a - * request is prematurely cancelled. We wait for the aio to - * complete, so that we do not have to maintain aiocb structs - * beyond the life of an aio_posix_state. Possible, but not - * sure the effort is worth it right now. - */ - - do { - const struct aiocb *a = &s->acb; - ret = aio_suspend(&a, 1, NULL); - } while ((ret == -1) && (errno == EINTR)); - - return 0; -} - -static struct tevent_req *aio_posix_pread_send( - struct vfs_handle_struct *handle, - TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct files_struct *fsp, void *data, size_t n, off_t offset) -{ - struct tevent_req *req; - struct aio_posix_state *state; - struct aiocb *a; - int ret; - - req = tevent_req_create(mem_ctx, &state, struct aio_posix_state); - if (req == NULL) { - return NULL; - } - - a = &state->acb; - - a->aio_fildes = fsp->fh->fd; - a->aio_buf = data; - a->aio_nbytes = n; - a->aio_offset = offset; - a->aio_sigevent.sigev_notify = SIGEV_SIGNAL; - a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO; - a->aio_sigevent.sigev_value.sival_ptr = req; - - ret = aio_read(a); - if (ret == 0) { - talloc_set_destructor(state, aio_posix_state_destructor); - return req; - } - - if (errno == EAGAIN) { - /* - * aio overloaded, do the sync fallback - */ - state->ret = sys_pread(fsp->fh->fd, data, n, offset); - if (state->ret == -1) { - state->err = errno; - } - tevent_req_done(req); - return tevent_req_post(req, ev); - } - - tevent_req_error(req, errno); - return tevent_req_post(req, ev); -} - -static struct tevent_req *aio_posix_pwrite_send( - struct vfs_handle_struct *handle, - TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct files_struct *fsp, const void *data, size_t n, off_t offset) -{ - struct tevent_req *req; - struct aio_posix_state *state; - struct aiocb *a; - int ret; - - req = tevent_req_create(mem_ctx, &state, struct aio_posix_state); - if (req == NULL) { - return NULL; - } - - a = &state->acb; - - a->aio_fildes = fsp->fh->fd; - a->aio_buf = discard_const(data); - a->aio_nbytes = n; - a->aio_offset = offset; - a->aio_sigevent.sigev_notify = SIGEV_SIGNAL; - a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO; - a->aio_sigevent.sigev_value.sival_ptr = req; - - ret = aio_write(a); - if (ret == 0) { - talloc_set_destructor(state, aio_posix_state_destructor); - return req; - } - - if (errno == EAGAIN) { - /* - * aio overloaded, do the sync fallback - */ - state->ret = sys_pwrite(fsp->fh->fd, data, n, offset); - if (state->ret == -1) { - state->err = errno; - } - tevent_req_done(req); - return tevent_req_post(req, ev); - } - - tevent_req_error(req, errno); - return tevent_req_post(req, ev); -} - -static void aio_posix_signal_handler(struct tevent_context *ev, - struct tevent_signal *se, - int signum, int count, - void *_info, void *private_data) -{ - siginfo_t *info; - struct tevent_req *req; - struct aio_posix_state *state; - int err; - - info = (siginfo_t *)_info; - req = talloc_get_type_abort(info->si_value.sival_ptr, - struct tevent_req); - state = tevent_req_data(req, struct aio_posix_state); - - err = aio_error(&state->acb); - if (err == EINPROGRESS) { - DEBUG(10, ("aio_posix_signal_handler: operation req %p " - "still in progress\n", req)); - return; - } - if (err == ECANCELED) { - DEBUG(10, ("aio_posix_signal_handler: operation req %p " - "canceled\n", req)); - return; - } - - /* - * No need to suspend for this in the destructor anymore - */ - talloc_set_destructor(state, NULL); - - state->ret = aio_return(&state->acb); - state->err = err; - tevent_req_done(req); -} - -static ssize_t aio_posix_recv(struct tevent_req *req, int *err) -{ - struct aio_posix_state *state = tevent_req_data( - req, struct aio_posix_state); - - if (tevent_req_is_unix_error(req, err)) { - return -1; - } - *err = state->err; - return state->ret; -} - -static struct tevent_req *aio_posix_fsync_send( - struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx, - struct tevent_context *ev, struct files_struct *fsp) -{ - struct tevent_req *req; - struct aio_posix_state *state; - struct aiocb *a; - int ret; - - req = tevent_req_create(mem_ctx, &state, struct aio_posix_state); - if (req == NULL) { - return NULL; - } - - a = &state->acb; - - a->aio_fildes = fsp->fh->fd; - a->aio_sigevent.sigev_notify = SIGEV_SIGNAL; - a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO; - a->aio_sigevent.sigev_value.sival_ptr = req; - - ret = aio_fsync(O_SYNC, a); - if (ret == 0) { - talloc_set_destructor(state, aio_posix_state_destructor); - return req; - } - - if (errno == EAGAIN) { - /* - * aio overloaded, do the sync fallback - */ - state->ret = fsync(fsp->fh->fd); - if (state->ret == -1) { - state->err = errno; - } - tevent_req_done(req); - return tevent_req_post(req, ev); - } - - tevent_req_error(req, errno); - return tevent_req_post(req, ev); -} - -static int aio_posix_int_recv(struct tevent_req *req, int *err) -{ - struct aio_posix_state *state = tevent_req_data( - req, struct aio_posix_state); - - if (tevent_req_is_unix_error(req, err)) { - return -1; - } - *err = state->err; - return state->ret; -} - -static int aio_posix_connect(vfs_handle_struct *handle, const char *service, - const char *user) -{ - if (aio_signal_event == NULL) { - struct tevent_context *ev = handle->conn->sconn->ev_ctx; - - aio_signal_event = tevent_add_signal( - ev, ev, RT_SIGNAL_AIO, SA_SIGINFO, - aio_posix_signal_handler, NULL); - - if (aio_signal_event == NULL) { - DEBUG(1, ("tevent_add_signal failed\n")); - return -1; - } - } - return SMB_VFS_NEXT_CONNECT(handle, service, user); -} - -static struct vfs_fn_pointers vfs_aio_posix_fns = { - .connect_fn = aio_posix_connect, - .pread_send_fn = aio_posix_pread_send, - .pread_recv_fn = aio_posix_recv, - .pwrite_send_fn = aio_posix_pwrite_send, - .pwrite_recv_fn = aio_posix_recv, - .fsync_send_fn = aio_posix_fsync_send, - .fsync_recv_fn = aio_posix_int_recv, -}; - -NTSTATUS vfs_aio_posix_init(void); -NTSTATUS vfs_aio_posix_init(void) -{ - return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, - "aio_posix", &vfs_aio_posix_fns); -} diff --git a/source3/modules/wscript_build b/source3/modules/wscript_build index 635b780cb9f..4dc66530373 100644 --- a/source3/modules/wscript_build +++ b/source3/modules/wscript_build @@ -321,14 +321,6 @@ bld.SAMBA3_MODULE('vfs_aio_pthread', internal_module=bld.SAMBA3_IS_STATIC_MODULE('vfs_aio_pthread'), enabled=bld.SAMBA3_IS_ENABLED_MODULE('vfs_aio_pthread')) -bld.SAMBA3_MODULE('vfs_aio_posix', - subsystem='vfs', - source='vfs_aio_posix.c', - deps='samba-util tevent', - init_function='', - internal_module=bld.SAMBA3_IS_STATIC_MODULE('vfs_aio_posix'), - enabled=bld.SAMBA3_IS_ENABLED_MODULE('vfs_aio_posix')) - bld.SAMBA3_MODULE('vfs_aio_linux', subsystem='vfs', source='vfs_aio_linux.c', diff --git a/source3/wscript b/source3/wscript index 82cb8582bd9..990afcdfa01 100644 --- a/source3/wscript +++ b/source3/wscript @@ -52,7 +52,6 @@ def set_options(opt): opt.SAMBA3_ADD_OPTION('dnsupdate') opt.SAMBA3_ADD_OPTION('syslog') opt.SAMBA3_ADD_OPTION('automount') - opt.SAMBA3_ADD_OPTION('aio-support') opt.SAMBA3_ADD_OPTION('dmapi', default=None) # None means autodetection opt.SAMBA3_ADD_OPTION('fam', default=None) # None means autodetection opt.SAMBA3_ADD_OPTION('profiling-data', default=False) @@ -547,27 +546,6 @@ return acl_get_perm_np(permset_d, perm); msg='Checking for openat', headers='fcntl.h') - if Options.options.with_aio_support: - conf.CHECK_FUNCS_IN('aio_read', 'aio') - conf.CHECK_FUNCS_IN('aio_read', 'rt') - conf.CHECK_CODE('struct aiocb a; return aio_read(&a);', - 'HAVE_AIO', - msg='Checking for asynchronous io support', - headers='sys/types.h aio.h', - lib='aio rt') - if conf.CONFIG_SET('HAVE_AIO'): - conf.CHECK_CODE('struct aiocb a; return aio_read(&a);', 'HAVE_AIO_READ', msg='Checking for aio_read', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('struct aiocb a; return aio_write(&a);', 'HAVE_AIO_WRITE', msg='Checking for aio_write', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('struct aiocb a; return aio_fsync(1, &a);', 'HAVE_AIO_FSYNC', msg='Checking for aio_fsync', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('struct aiocb a; return aio_return(&a);', 'HAVE_AIO_RETURN', msg='Checking for aio_return', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('struct aiocb a; return aio_error(&a);', 'HAVE_AIO_ERROR', msg='Checking for aio_error', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('struct aiocb a; return aio_cancel(1, &a);', 'HAVE_AIO_CANCEL', msg='Checking for aio_cancel', headers='aio.h', lib='aio rt') - conf.CHECK_CODE('const struct aiocb * const a[1]; struct timespec t; return aio_suspend(a, 1, &t);', 'HAVE_AIO_SUSPEND', msg='Checking for aio_suspend', headers='aio.h', lib='aio rt') - if not conf.CONFIG_SET('HAVE_AIO'): - conf.DEFINE('HAVE_NO_AIO', '1') - else: - conf.DEFINE('HAVE_NO_AIO', '1') - if host_os.rfind('linux') > -1: conf.CHECK_FUNCS_IN('io_submit', 'aio') conf.CHECK_CODE(''' @@ -1633,9 +1611,6 @@ main() { if Options.options.with_pthreadpool: default_shared_modules.extend(TO_LIST('vfs_aio_pthread')) - if conf.CONFIG_SET('HAVE_AIO'): - default_shared_modules.extend(TO_LIST('vfs_aio_posix')) - if conf.CONFIG_SET('HAVE_LINUX_KERNEL_AIO'): default_shared_modules.extend(TO_LIST('vfs_aio_linux'))