s3: Add a _nosync version of smb2_write_complete
authorVolker Lendecke <vl@samba.org>
Fri, 13 Jul 2012 11:39:52 +0000 (13:39 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 18 Jul 2012 22:48:27 +0000 (15:48 -0700)
This will be used in aio.c to avoid a second fsync after write

Signed-off-by: Jeremy Allison <jra@samba.org>
source3/smbd/globals.h
source3/smbd/smb2_write.c

index c400181130060401268b7433d2cc9bbab11bc419..4ca9e712dfb2ec014c6593dd23f1fc76d35e00d4 100644 (file)
@@ -264,6 +264,8 @@ NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req);
 NTSTATUS smb2_read_complete(struct tevent_req *req, ssize_t nread, int err);
 NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req);
 NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err);
+NTSTATUS smb2_write_complete_nosync(struct tevent_req *req, ssize_t nwritten,
+                                   int err);
 NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_process_ioctl(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req);
index 6a78939505ae82529a4f569e8c10fe7672770835..9b06b877596b31ebec64a668ccac3d3106a42a0f 100644 (file)
@@ -174,7 +174,9 @@ struct smbd_smb2_write_state {
 
 static void smbd_smb2_write_pipe_done(struct tevent_req *subreq);
 
-NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err)
+static NTSTATUS smb2_write_complete_internal(struct tevent_req *req,
+                                            ssize_t nwritten, int err,
+                                            bool do_sync)
 {
        NTSTATUS status;
        struct smbd_smb2_write_state *state = tevent_req_data(req,
@@ -209,12 +211,14 @@ NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err)
                return NT_STATUS_DISK_FULL;
        }
 
-       status = sync_file(fsp->conn, fsp, state->write_through);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(5,("smb2: sync_file for %s returned %s\n",
-                       fsp_str_dbg(fsp),
-                       nt_errstr(status)));
-               return status;
+       if (do_sync) {
+               status = sync_file(fsp->conn, fsp, state->write_through);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(5,("smb2: sync_file for %s returned %s\n",
+                                fsp_str_dbg(fsp),
+                                nt_errstr(status)));
+                       return status;
+               }
        }
 
        state->out_count = nwritten;
@@ -222,6 +226,18 @@ NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err)
        return NT_STATUS_OK;
 }
 
+NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err)
+{
+       return smb2_write_complete_internal(req, nwritten, err, true);
+}
+
+NTSTATUS smb2_write_complete_nosync(struct tevent_req *req, ssize_t nwritten,
+                                   int err)
+{
+       return smb2_write_complete_internal(req, nwritten, err, false);
+}
+
+
 static bool smbd_smb2_write_cancel(struct tevent_req *req)
 {
        struct smbd_smb2_write_state *state =