[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed May 9 20:25:03 UTC 2018


The branch, master has been updated
       via  52dc959 s3: smbd: Remove unused counters for outstanding aio calls.
       via  f0e6453 vfs_ceph: add fake async pwrite/pread send/recv hooks
      from  bc2beed libcli: remove unused se_create_child_secdesc_buf()

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 52dc959bb21a102a14437812418bbb75b0bb231f
Author: Jeremy Allison <jra at samba.org>
Date:   Wed May 9 09:32:45 2018 -0700

    s3: smbd: Remove unused counters for outstanding aio calls.
    
    Only a debug message used this.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Wed May  9 22:24:38 CEST 2018 on sn-devel-144

commit f0e6453b0420fe9d062936d4ddc05f44b40cf2ba
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed May 9 16:51:34 2018 +0200

    vfs_ceph: add fake async pwrite/pread send/recv hooks
    
    As found by Jeremy, VFS modules that don't provide pread_send() or
    pwrite_send() hooks result in vfs_default fallback, which is
    catastrophic for VFS modules with non-mounted filesystems such as
    vfs_ceph.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13425
    
    Reported-by: Jeremy Allison <jra at samba.org>
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_ceph.c | 109 ++++++++++++++++++++++++++++++++++++++++++++-
 source3/smbd/aio.c         |  41 ++---------------
 source3/smbd/proto.h       |   3 --
 source3/smbd/smb2_flush.c  |   3 --
 4 files changed, 112 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 87df83e..bac8858 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -470,6 +470,57 @@ static ssize_t cephwrap_pread(struct vfs_handle_struct *handle, files_struct *fs
 	WRAP_RETURN(result);
 }
 
+struct cephwrap_pread_state {
+	ssize_t bytes_read;
+	struct vfs_aio_state vfs_aio_state;
+};
+
+/*
+ * Fake up an async ceph read by calling the synchronous API.
+ */
+static struct tevent_req *cephwrap_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 = NULL;
+	struct cephwrap_pread_state *state = NULL;
+	int ret = -1;
+
+	DBG_DEBUG("[CEPH] %s\n", __func__);
+	req = tevent_req_create(mem_ctx, &state, struct cephwrap_pread_state);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	ret = ceph_read(handle->data, fsp->fh->fd, data, n, offset);
+	if (ret < 0) {
+		/* ceph returns -errno on error. */
+		tevent_req_error(req, -ret);
+		return tevent_req_post(req, ev);
+	}
+
+	state->bytes_read = ret;
+	tevent_req_done(req);
+	/* Return and schedule the completion of the call. */
+	return tevent_req_post(req, ev);
+}
+
+static ssize_t cephwrap_pread_recv(struct tevent_req *req,
+				   struct vfs_aio_state *vfs_aio_state)
+{
+	struct cephwrap_pread_state *state =
+		tevent_req_data(req, struct cephwrap_pread_state);
+
+	DBG_DEBUG("[CEPH] %s\n", __func__);
+	if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
+		return -1;
+	}
+	*vfs_aio_state = state->vfs_aio_state;
+	return state->bytes_read;
+}
 
 static ssize_t cephwrap_pwrite(struct vfs_handle_struct *handle, files_struct *fsp, const void *data,
 			size_t n, off_t offset)
@@ -482,6 +533,58 @@ static ssize_t cephwrap_pwrite(struct vfs_handle_struct *handle, files_struct *f
 	WRAP_RETURN(result);
 }
 
+struct cephwrap_pwrite_state {
+	ssize_t bytes_written;
+	struct vfs_aio_state vfs_aio_state;
+};
+
+/*
+ * Fake up an async ceph write by calling the synchronous API.
+ */
+static struct tevent_req *cephwrap_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 = NULL;
+	struct cephwrap_pwrite_state *state = NULL;
+	int ret = -1;
+
+	DBG_DEBUG("[CEPH] %s\n", __func__);
+	req = tevent_req_create(mem_ctx, &state, struct cephwrap_pwrite_state);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	ret = ceph_write(handle->data, fsp->fh->fd, data, n, offset);
+	if (ret < 0) {
+		/* ceph returns -errno on error. */
+		tevent_req_error(req, -ret);
+		return tevent_req_post(req, ev);
+	}
+
+	state->bytes_written = ret;
+	tevent_req_done(req);
+	/* Return and schedule the completion of the call. */
+	return tevent_req_post(req, ev);
+}
+
+static ssize_t cephwrap_pwrite_recv(struct tevent_req *req,
+				    struct vfs_aio_state *vfs_aio_state)
+{
+	struct cephwrap_pwrite_state *state =
+		tevent_req_data(req, struct cephwrap_pwrite_state);
+
+	DBG_DEBUG("[CEPH] %s\n", __func__);
+	if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
+		return -1;
+	}
+	*vfs_aio_state = state->vfs_aio_state;
+	return state->bytes_written;
+}
+
 static off_t cephwrap_lseek(struct vfs_handle_struct *handle, files_struct *fsp, off_t offset, int whence)
 {
 	off_t result = 0;
@@ -535,7 +638,7 @@ static int cephwrap_rename(struct vfs_handle_struct *handle,
 }
 
 /*
- * Fake up an async ceph fsync by calling the sychronous API.
+ * Fake up an async ceph fsync by calling the synchronous API.
  */
 
 static struct tevent_req *cephwrap_fsync_send(struct vfs_handle_struct *handle,
@@ -1443,7 +1546,11 @@ static struct vfs_fn_pointers ceph_fns = {
 	.open_fn = cephwrap_open,
 	.close_fn = cephwrap_close,
 	.pread_fn = cephwrap_pread,
+	.pread_send_fn = cephwrap_pread_send,
+	.pread_recv_fn = cephwrap_pread_recv,
 	.pwrite_fn = cephwrap_pwrite,
+	.pwrite_send_fn = cephwrap_pwrite_send,
+	.pwrite_recv_fn = cephwrap_pwrite_recv,
 	.lseek_fn = cephwrap_lseek,
 	.sendfile_fn = cephwrap_sendfile,
 	.recvfile_fn = cephwrap_recvfile,
diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c
index 4fc1132..abf8858 100644
--- a/source3/smbd/aio.c
+++ b/source3/smbd/aio.c
@@ -26,27 +26,6 @@
 #include "lib/tevent_wait.h"
 
 /****************************************************************************
- Statics plus accessor functions.
-*****************************************************************************/
-
-static int outstanding_aio_calls;
-
-int get_outstanding_aio_calls(void)
-{
-	return outstanding_aio_calls;
-}
-
-void increment_outstanding_aio_calls(void)
-{
-	outstanding_aio_calls++;
-}
-
-void decrement_outstanding_aio_calls(void)
-{
-	outstanding_aio_calls--;
-}
-
-/****************************************************************************
  The buffer we keep around whilst an aio request is in process.
 *****************************************************************************/
 
@@ -69,12 +48,6 @@ bool aio_write_through_requested(struct aio_extra *aio_ex)
 	return aio_ex->write_through;
 }
 
-static int aio_extra_destructor(struct aio_extra *aio_ex)
-{
-	decrement_outstanding_aio_calls();
-	return 0;
-}
-
 /****************************************************************************
  Create the extended aio struct we must keep around for the lifetime
  of the aio call.
@@ -101,9 +74,7 @@ static struct aio_extra *create_aio_extra(TALLOC_CTX *mem_ctx,
 			return NULL;
 		}
 	}
-	talloc_set_destructor(aio_ex, aio_extra_destructor);
 	aio_ex->fsp = fsp;
-	increment_outstanding_aio_calls();
 	return aio_ex;
 }
 
@@ -523,11 +494,9 @@ NTSTATUS schedule_aio_write_and_X(connection_struct *conn,
 	}
 
 	DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write for file "
-		  "%s, offset %.0f, len = %u (mid = %u) "
-		  "outstanding_aio_calls = %d\n",
+		  "%s, offset %.0f, len = %u (mid = %u)\n",
 		  fsp_str_dbg(fsp), (double)startpos, (unsigned int)numtowrite,
-		  (unsigned int)aio_ex->smbreq->mid,
-		  get_outstanding_aio_calls() ));
+		  (unsigned int)aio_ex->smbreq->mid));
 
 	return NT_STATUS_OK;
 }
@@ -906,13 +875,11 @@ NTSTATUS schedule_aio_smb2_write(connection_struct *conn,
 	 */
 
 	DEBUG(10,("smb2: scheduled aio_write for file "
-		"%s, offset %.0f, len = %u (mid = %u) "
-		"outstanding_aio_calls = %d\n",
+		"%s, offset %.0f, len = %u (mid = %u)\n",
 		fsp_str_dbg(fsp),
 		(double)in_offset,
 		(unsigned int)in_data.length,
-		(unsigned int)aio_ex->smbreq->mid,
-		get_outstanding_aio_calls() ));
+		(unsigned int)aio_ex->smbreq->mid));
 
 	return NT_STATUS_OK;
 }
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 2f315ce..778561c 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -66,9 +66,6 @@ void srv_set_signing(struct smbXsrv_connection *conn,
 
 /* The following definitions come from smbd/aio.c  */
 
-int get_outstanding_aio_calls(void);
-void increment_outstanding_aio_calls(void);
-void decrement_outstanding_aio_calls(void);
 struct aio_extra;
 bool aio_write_through_requested(struct aio_extra *aio_ex);
 NTSTATUS schedule_aio_read_and_X(connection_struct *conn,
diff --git a/source3/smbd/smb2_flush.c b/source3/smbd/smb2_flush.c
index d1ab3a0..f7d9e96 100644
--- a/source3/smbd/smb2_flush.c
+++ b/source3/smbd/smb2_flush.c
@@ -184,7 +184,6 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	increment_outstanding_aio_calls();
 	return req;
 
 }
@@ -196,8 +195,6 @@ static void smbd_smb2_flush_done(struct tevent_req *subreq)
 	int ret;
 	struct vfs_aio_state vfs_aio_state;
 
-	decrement_outstanding_aio_calls();
-
 	ret = SMB_VFS_FSYNC_RECV(subreq, &vfs_aio_state);
 	TALLOC_FREE(subreq);
 	if (ret == -1) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list