From 5fb3b8e377deeb0ce362a7bcb9323542b579fdef Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 18 May 2009 13:30:16 +0200 Subject: [PATCH] Move down the become_root()/unbecome_root() calls into the VFS modules The aio_fork module does not need this, as it does not communicate via signals but with pipes. Watching a strace log with those become_root() calls in aio.c is absolutely awful, and it does affect performance. --- source3/modules/vfs_default.c | 24 ++++++++++++++++++++++-- source3/smbd/aio.c | 6 ------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 6c1946a99d0..aa207056b3b 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1423,12 +1423,32 @@ 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) { - return sys_aio_read(aiocb); + int ret; + /* + * aio_read must be done as root, because in the glibc aio + * implementation the helper thread needs to be able to send a signal + * to the main thread, even when it has done a seteuid() to a + * different user. + */ + become_root(); + ret = sys_aio_read(aiocb); + unbecome_root(); + return ret; } static int vfswrap_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) { - return sys_aio_write(aiocb); + int ret; + /* + * aio_write must be done as root, because in the glibc aio + * implementation the helper thread needs to be able to send a signal + * to the main thread, even when it has done a seteuid() to a + * different user. + */ + become_root(); + ret = sys_aio_write(aiocb); + unbecome_root(); + return ret; } static ssize_t vfswrap_aio_return(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 77616be48c6..a5eea0a32e7 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -179,10 +179,7 @@ bool schedule_aio_read_and_X(connection_struct *conn, a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO; a->aio_sigevent.sigev_value.sival_int = req->mid; - become_root(); ret = SMB_VFS_AIO_READ(fsp, a); - unbecome_root(); - if (ret == -1) { DEBUG(0,("schedule_aio_read_and_X: aio_read failed. " "Error %s\n", strerror(errno) )); @@ -277,10 +274,7 @@ bool schedule_aio_write_and_X(connection_struct *conn, a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO; a->aio_sigevent.sigev_value.sival_int = req->mid; - become_root(); ret = SMB_VFS_AIO_WRITE(fsp, a); - unbecome_root(); - if (ret == -1) { DEBUG(3,("schedule_aio_wrote_and_X: aio_write failed. " "Error %s\n", strerror(errno) )); -- 2.34.1