[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