[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Mon Jul 19 14:07:04 MDT 2010


The branch, master has been updated
       via  6763730... s3: Avoid pwrite calls for the 1-byte writes with zero content
      from  944494d... s3-auth: Remove unused variable.

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


- Log -----------------------------------------------------------------
commit 6763730304627a58139450fd3e03a0ce48e31bb9
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jul 19 16:15:01 2010 +0200

    s3: Avoid pwrite calls for the 1-byte writes with zero content
    
    When a write cache is empty and we write one 0, there is no point in actually
    writing into the write cache, which would trigger a potentially superfluous
    write cache flush. We can rely on posix semantics to give us 0's when
    subsequent read calls want to read from file areas not written yet.
    
    Jeremy, please check!

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

Summary of changes:
 source3/smbd/fileio.c |   54 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c
index 92757f7..f9fcc1b 100644
--- a/source3/smbd/fileio.c
+++ b/source3/smbd/fileio.c
@@ -653,10 +653,31 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
                         */
 
 			flush_write_cache(fsp, WRITE_FLUSH);
-			wcp->offset = wcp->file_size;
-			wcp->data_size = pos - wcp->file_size + 1;
-			memset(wcp->data, '\0', wcp->data_size);
-			memcpy(wcp->data + wcp->data_size-1, data, 1);
+
+			if (data[0] == '\0') {
+				/*
+				 * This is a 1-byte write of a 0
+				 * beyond the EOF, the typical
+				 * file-extending (and allocating, but
+				 * we're using the write cache here)
+				 * write done by Windows. We just have
+				 * to ftruncate the file and rely on
+				 * posix semantics to return zeros for
+				 * non-written file data that is
+				 * within the file length.
+				 *
+				 * We have to cheat the offset to make
+				 * wcp_file_size_change do the right
+				 * thing with the ftruncate call.
+				 */
+				wcp->offset = pos + 1;
+				wcp->data_size = 0;
+			} else {
+				wcp->offset = wcp->file_size;
+				wcp->data_size = pos - wcp->file_size + 1;
+				memset(wcp->data, '\0', wcp->data_size);
+				memcpy(wcp->data + wcp->data_size-1, data, 1);
+			}
 
 			/*
 			 * Update the file size if changed.
@@ -799,6 +820,31 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n",
 
 		if ((wcp->data_size == 0)
 		    && (pos > wcp->file_size)
+		    && (n == 1)
+		    && (data[0] == '\0')) {
+			/*
+			 * This is a 1-byte write of a 0 beyond the
+			 * EOF, the typical file-extending (and
+			 * allocating, but we're using the write cache
+			 * here) write done by Windows. We just have
+			 * to ftruncate the file and rely on posix
+			 * semantics to return zeros for non-written
+			 * file data that is within the file length.
+			 *
+			 * We have to cheat the offset to make
+			 * wcp_file_size_change do the right thing
+			 * with the ftruncate call.
+			 */
+			wcp->offset = pos+1;
+			wcp->data_size = 0;
+			if (wcp_file_size_change(fsp) == -1) {
+				return -1;
+			}
+			return 1;
+		}
+
+		if ((wcp->data_size == 0)
+		    && (pos > wcp->file_size)
 		    && (pos + n <= wcp->file_size + wcp->alloc_size)) {
 			/*
 			 * This is a write completely beyond the


-- 
Samba Shared Repository


More information about the samba-cvs mailing list