Patch to add support for advertising FULLSYNC to Mac OSX Clients
Ralph Böhme
slow at samba.org
Tue Apr 4 11:21:06 UTC 2017
Hi Kevin,
On Sun, Apr 02, 2017 at 10:40:06PM -0400, Kevin Anderson wrote:
> Hi Ralph,
> I started an attempt to implement the remaining piece of this patch
> and I have parsed out the reserved1 field in the
> smbd_smb2_request_process_flush function. Does that seem appropriate
> to you? If so, I only have to determine the best way to pass the fsync
> to the actual file. Can/should the fsync be handled in the fruit
> module? I would be open to any advice that you have as I have tried a
> number of things already but they were unsuccessful.
maybe something like the attached. Just cobbled together, completely untested.
Jeremy, can you take a look as well please?
Cheerio!
-slow
-------------- next part --------------
From 2c3ec983cfec3dceda77e979784e2ea34a0ef03e Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Tue, 4 Apr 2017 13:13:30 +0200
Subject: [PATCH 1/2] s3/smbd: add aapl_enabled flag to fsp
This will be needed in the next commit to implement macOS fullsync extension.
---
source3/include/vfs.h | 1 +
source3/modules/vfs_fruit.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 0810fc2..fa964c0 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -289,6 +289,7 @@ typedef struct files_struct {
bool is_sparse;
bool backup_intent; /* Handle was successfully opened with backup intent
and opener has privilege to do so. */
+ bool aapl_enabled; /* macOS client with extensions enabled */
bool aapl_copyfile_supported;
bool use_ofd_locks; /* Are we using open file description locks ? */
struct smb_filename *fsp_name;
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index 0b5558a..bf149ab 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -4945,6 +4945,8 @@ static NTSTATUS fruit_create_file(vfs_handle_struct *handle,
fsp = *result;
if (global_fruit_config.nego_aapl) {
+ fsp->aapl_enabled = true;
+
if (config->copyfile_enabled) {
/*
* Set a flag in the fsp. Gets used in
--
2.9.3
From 5c49e46489fc3496acc4c6653f036a8ec11d9bd9 Mon Sep 17 00:00:00 2001
From: Ralph Boehme <slow at samba.org>
Date: Tue, 4 Apr 2017 13:10:00 +0200
Subject: [PATCH 2/2] s3/smbd: macOS fullsync
---
source3/smbd/smb2_flush.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/source3/smbd/smb2_flush.c b/source3/smbd/smb2_flush.c
index d077c62..e4ce0a0 100644
--- a/source3/smbd/smb2_flush.c
+++ b/source3/smbd/smb2_flush.c
@@ -27,7 +27,8 @@
static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct smbd_smb2_request *smb2req,
- struct files_struct *fsp);
+ struct files_struct *fsp,
+ uint16_t flush_reserved1);
static NTSTATUS smbd_smb2_flush_recv(struct tevent_req *req);
static void smbd_smb2_request_flush_done(struct tevent_req *subreq);
@@ -37,6 +38,7 @@ NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req)
const uint8_t *inbody;
uint64_t in_file_id_persistent;
uint64_t in_file_id_volatile;
+ uint16_t in_flush_reserved1;
struct files_struct *in_fsp;
struct tevent_req *subreq;
@@ -46,6 +48,7 @@ NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req)
}
inbody = SMBD_SMB2_IN_BODY_PTR(req);
+ in_flush_reserved1 = SVAL(inbody, 0x2);
in_file_id_persistent = BVAL(inbody, 0x08);
in_file_id_volatile = BVAL(inbody, 0x10);
@@ -55,7 +58,7 @@ NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req)
}
subreq = smbd_smb2_flush_send(req, req->sconn->ev_ctx,
- req, in_fsp);
+ req, in_fsp, in_flush_reserved1);
if (subreq == NULL) {
return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
}
@@ -115,7 +118,8 @@ static void smbd_smb2_flush_done(struct tevent_req *subreq);
static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct smbd_smb2_request *smb2req,
- struct files_struct *fsp)
+ struct files_struct *fsp,
+ uint16_t flush_reserved1)
{
struct tevent_req *req;
struct tevent_req *subreq;
@@ -153,6 +157,22 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
+ if (fsp->aapl_enabled && (flush_reserved1 == 0xffff)) {
+ /*
+ * macOS specific fullsync, cf https://goo.gl/Lw5bdz
+ */
+ ret = SMB_VFS_FSYNC(fsp);
+ if (ret != 0) {
+ DBG_ERR("flush of [%s] failed: %s",
+ fsp_str_dbg(fsp), strerror(errno));
+ tevent_req_nterror(req, map_nt_error_from_unix(errno));
+ return tevent_req_post(req, ev);
+ }
+
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
+
if (!lp_strict_sync(SNUM(smbreq->conn))) {
/*
* No strict sync. Don't really do
--
2.9.3
More information about the samba-technical
mailing list