[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