diff options
author | Jeremy Allison <jra@samba.org> | 2012-07-12 10:57:47 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-07-12 22:46:07 +0200 |
commit | cb405947caa9f4bdb962483860a9093a364ecbf2 (patch) | |
tree | 81c87068f7576a457650e07ff37a5fd537d31c20 | |
parent | 622eb59eb472bbdb9fd985c4d8880d3a1c098cd7 (diff) | |
download | samba-cb405947caa9f4bdb962483860a9093a364ecbf2.tar.gz samba-cb405947caa9f4bdb962483860a9093a364ecbf2.tar.bz2 samba-cb405947caa9f4bdb962483860a9093a364ecbf2.zip |
Add an optimization to pthread aio writes to also do fsync if requested.
Should help by ensuring complete writes done in sub-thread, not in
the main thread.
-rw-r--r-- | source3/modules/vfs_aio_pthread.c | 15 | ||||
-rw-r--r-- | source3/smbd/aio.c | 9 | ||||
-rw-r--r-- | source3/smbd/proto.h | 1 |
3 files changed, 25 insertions, 0 deletions
diff --git a/source3/modules/vfs_aio_pthread.c b/source3/modules/vfs_aio_pthread.c index d62af57256..4525beb818 100644 --- a/source3/modules/vfs_aio_pthread.c +++ b/source3/modules/vfs_aio_pthread.c @@ -40,6 +40,7 @@ struct aio_private_data { int ret_errno; bool cancelled; bool write_command; + bool flush_write; }; /* List of outstanding requests we have. */ @@ -115,6 +116,14 @@ static void aio_worker(void *private_data) (const void *)pd->aiocb->aio_buf, pd->aiocb->aio_nbytes); } + if (pd->ret_size != -1 && pd->flush_write) { + /* + * Optimization - flush if requested. + * Ignore error as upper layer will + * also do this. + */ + (void)fsync(pd->aiocb->aio_fildes); + } } else { pd->ret_size = sys_pread(pd->aiocb->aio_fildes, (void *)pd->aiocb->aio_buf, @@ -229,6 +238,12 @@ static int aio_pthread_write(struct vfs_handle_struct *handle, } pd->write_command = true; + if (lp_strict_sync(SNUM(fsp->conn)) && + (lp_syncalways(SNUM(fsp->conn)) || + aio_write_through_requested(aio_ex))) { + pd->flush_write = true; + } + ret = pthreadpool_add_job(pool, pd->jobid, aio_worker, (void *)pd); if (ret) { diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 0ea5274420..569741c747 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -53,6 +53,15 @@ struct aio_extra { }; /**************************************************************************** + Accessor function to return write_through state. +*****************************************************************************/ + +bool aio_write_through_requested(struct aio_extra *aio_ex) +{ + return aio_ex->write_through; +} + +/**************************************************************************** Initialize the signal handler for aio read/write. *****************************************************************************/ diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 9aaa00a1ce..26d6432c15 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 aio_write_through_requested(struct aio_extra *aio_ex); bool initialize_async_io_handler(void); NTSTATUS schedule_aio_read_and_X(connection_struct *conn, struct smb_request *req, |