[SCM] Samba Shared Repository - branch v3-5-test updated

Karolin Seeger kseeger at samba.org
Sun Dec 5 11:25:10 MST 2010


The branch, v3-5-test has been updated
       via  0c45b32 Fix bug #7835 - vfs_fill_sparse() doesn't use posix_fallocate when strict allocate is on
      from  56b1082 s3: Fix "force group" with ntlmssp guest session setup

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 0c45b32bc7d93b03838405a97b054cb414267892
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Dec 2 15:27:17 2010 -0800

    Fix bug #7835 - vfs_fill_sparse() doesn't use posix_fallocate when strict allocate is on
    
    Tries posix_fallocate() and then falls back to old code.
    
    Jeremy.

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

Summary of changes:
 source3/smbd/vfs.c |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 00cf1e5..c939044 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -582,6 +582,12 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
 		return 0;
 	}
 
+#ifdef S_ISFIFO
+	if (S_ISFIFO(st.st_ex_mode)) {
+		return 0;
+	}
+#endif
+
 	DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to "
 		  "len %.0f (%.0f bytes)\n", fsp_str_dbg(fsp),
 		  (double)st.st_ex_size, (double)len,
@@ -591,6 +597,32 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
 
 	flush_write_cache(fsp, SIZECHANGE_FLUSH);
 
+
+	offset = st.st_ex_size;
+	num_to_write = len - st.st_ex_size;
+
+	/* Only do this on non-stream file handles. */
+	if (fsp->base_fsp == NULL) {
+		/* for allocation try posix_fallocate first. This can fail on some
+		 * platforms e.g. when the filesystem doesn't support it and no
+		 * emulation is being done by the libc (like on AIX with JFS1). In that
+		 * case we do our own emulation. posix_fallocate implementations can
+		 * return ENOTSUP or EINVAL in cases like that. */
+		ret = sys_posix_fallocate(fsp->fh->fd, offset, num_to_write);
+		if (ret == ENOSPC) {
+			errno = ENOSPC;
+			ret = -1;
+			goto out;
+		}
+		if (ret == 0) {
+			set_filelen_write_cache(fsp, len);
+			goto out;
+		}
+
+		DEBUG(10,("vfs_fill_sparse: sys_posix_fallocate failed with "
+			"error %d. Falling back to slow manual allocation\n", ret));
+	}
+
 	if (!sparse_buf) {
 		sparse_buf = SMB_CALLOC_ARRAY(char, SPARSE_BUF_WRITE_SIZE);
 		if (!sparse_buf) {
@@ -600,8 +632,6 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
 		}
 	}
 
-	offset = st.st_ex_size;
-	num_to_write = len - st.st_ex_size;
 	total = 0;
 
 	while (total < num_to_write) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list