summaryrefslogtreecommitdiff
path: root/source3/modules/vfs_aio_pthread.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2012-07-12 10:57:47 -0700
committerJeremy Allison <jra@samba.org>2012-07-12 22:46:07 +0200
commitcb405947caa9f4bdb962483860a9093a364ecbf2 (patch)
tree81c87068f7576a457650e07ff37a5fd537d31c20 /source3/modules/vfs_aio_pthread.c
parent622eb59eb472bbdb9fd985c4d8880d3a1c098cd7 (diff)
downloadsamba-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.
Diffstat (limited to 'source3/modules/vfs_aio_pthread.c')
-rw-r--r--source3/modules/vfs_aio_pthread.c15
1 files changed, 15 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) {