From cad29aed227cbff13de43c14b0626b1a3d9c1122 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2018 14:25:54 -0700 Subject: [PATCH] ceph: VFS: Add asynchronous fsync to ceph module, fake using synchronous call. This will allow me to ultimately simplify the VFS by removing the synchronous fsync VFS call. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13412 Signed-off-by: Jeremy Allison --- source3/modules/vfs_ceph.c | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c index d61213110e0..cbe5fac1f89 100644 --- a/source3/modules/vfs_ceph.c +++ b/source3/modules/vfs_ceph.c @@ -569,6 +569,62 @@ static int cephwrap_fsync(struct vfs_handle_struct *handle, files_struct *fsp) WRAP_RETURN(result); } +/* + * Fake up an async ceph fsync by calling the sychronous API. + */ + +static struct tevent_req *cephwrap_fsync_send(struct vfs_handle_struct *handle, + TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + files_struct *fsp) +{ + struct tevent_req *req = NULL; + struct vfs_aio_state *state = NULL; + struct timespec start_time = { 0 }; + struct timespec end_time = { 0 }; + int ret = -1; + + DBG_DEBUG("[CEPH] cephwrap_fsync_send\n"); + + req = tevent_req_create(mem_ctx, &state, struct vfs_aio_state); + if (req == NULL) { + return NULL; + } + + PROFILE_TIMESTAMP(&start_time); + + /* Make sync call. */ + ret = ceph_fsync(handle->data, fsp->fh->fd, false); + + if (ret != 0) { + /* ceph_fsync returns -errno on error. */ + state->error = -ret; + } + + PROFILE_TIMESTAMP(&end_time); + state->duration = nsec_time_diff(&end_time, &start_time); + + /* Mark it as done. */ + tevent_req_done(req); + /* Return and schedule the completion of the call. */ + return tevent_req_post(req, ev); +} + +static int cephwrap_fsync_recv(struct tevent_req *req, + struct vfs_aio_state *vfs_aio_state) +{ + struct vfs_aio_state *state = + tevent_req_data(req, struct vfs_aio_state); + + DBG_DEBUG("[CEPH] cephwrap_fsync_recv\n"); + + *vfs_aio_state = *state; + if (state->error != 0) { + return -1; + } + return 0; +} + #ifdef HAVE_CEPH_STATX #define SAMBA_STATX_ATTR_MASK (CEPH_STATX_BASIC_STATS|CEPH_STATX_BTIME) @@ -1440,6 +1496,8 @@ static struct vfs_fn_pointers ceph_fns = { .recvfile_fn = cephwrap_recvfile, .rename_fn = cephwrap_rename, .fsync_fn = cephwrap_fsync, + .fsync_send_fn = cephwrap_fsync_send, + .fsync_recv_fn = cephwrap_fsync_recv, .stat_fn = cephwrap_stat, .fstat_fn = cephwrap_fstat, .lstat_fn = cephwrap_lstat, -- 2.17.0.441.gb46fe60e1d-goog