The Samba-Bugzilla – Attachment 5312 Details for
Bug 6942
Avoid fragmentation
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch relative to 3-4-test cherry-pick 1
0001-s3-prefer-posix_fallocate-for-doing-strict-allocat.patch (text/plain), 5.42 KB, created by
Olaf Flebbe
on 2010-02-10 04:18:46 UTC
(
hide
)
Description:
Patch relative to 3-4-test cherry-pick 1
Filename:
MIME Type:
Creator:
Olaf Flebbe
Created:
2010-02-10 04:18:46 UTC
Size:
5.42 KB
patch
obsolete
>From 1ce39d37f86704f747ae8bfaf1fa31f5d0861c20 Mon Sep 17 00:00:00 2001 >From: =?utf-8?q?Bj=C3=B6rn=20Jacke?= <bj@sernet.de> >Date: Wed, 2 Dec 2009 15:13:37 +0100 >Subject: [PATCH] s3: prefer posix_fallocate for doing "strict allocate" > >posix_fallocate is more efficient than manual zero'ing the file. When >preallocation in kernel space is supported it's extremely fast. Support for >preallocation at fs layer via posix_fallocate and fallocate at kernel site >can be found in Linux kernel 2.6.23/glibc 2.10 with ext4, XFS and OCFS2. Other >systems that I know of which support fast preallocation in kernel space are >AIX 6.1 with JFS2 and recent Solaris versions with ZFS maybe UFS2, too. > >People who have a system with preallocation in kernel space might want to set >"strict allocate = yes". This reduces file fragentation and it's also safer for >setups with quota being turned on. > >As of today most systems still don't have preallocation in kernel space, and >that's why "strict allocate = no" will stay the default for now. > >cherry picked from commit: a1991b17cdb38b1bffa32d2386132ae01f827cd0 >--- > source3/configure.in | 2 +- > source3/include/proto.h | 1 + > source3/lib/system.c | 14 ++++++++++++++ > source3/modules/vfs_default.c | 25 +++++++++++++++++++++---- > 4 files changed, 37 insertions(+), 5 deletions(-) > >diff --git a/source3/configure.in b/source3/configure.in >index be18c24..c5569da 100644 >--- a/source3/configure.in >+++ b/source3/configure.in >@@ -1042,7 +1042,7 @@ AC_CHECK_FUNCS(setsid glob strpbrk crypt16 getauthuid) > AC_CHECK_FUNCS(sigprocmask sigblock sigaction sigset innetgr setnetgrent getnetgrent endnetgrent) > AC_CHECK_FUNCS(initgroups select poll rdchk getgrnam getgrent pathconf) > AC_CHECK_FUNCS(setpriv setgidx setuidx setgroups sysconf stat64 fstat64) >-AC_CHECK_FUNCS(lstat64 fopen64 atexit grantpt lseek64 ftruncate64) >+AC_CHECK_FUNCS(lstat64 fopen64 atexit grantpt lseek64 ftruncate64 posix_fallocate posix_fallocate64) > AC_CHECK_FUNCS(fseek64 fseeko64 ftell64 ftello64 setluid getpwanam) > AC_CHECK_FUNCS(opendir64 readdir64 seekdir64 telldir64 rewinddir64 closedir64) > AC_CHECK_FUNCS(getpwent_r) >diff --git a/source3/include/proto.h b/source3/include/proto.h >index d2ae62c..f3c92a8 100644 >--- a/source3/include/proto.h >+++ b/source3/include/proto.h >@@ -919,6 +919,7 @@ int sys_stat(const char *fname,SMB_STRUCT_STAT *sbuf); > int sys_fstat(int fd,SMB_STRUCT_STAT *sbuf); > int sys_lstat(const char *fname,SMB_STRUCT_STAT *sbuf); > int sys_ftruncate(int fd, SMB_OFF_T offset); >+int sys_posix_fallocate(int fd, SMB_OFF_T offset, SMB_OFF_T len); > SMB_OFF_T sys_lseek(int fd, SMB_OFF_T offset, int whence); > int sys_fseek(FILE *fp, SMB_OFF_T offset, int whence); > SMB_OFF_T sys_ftell(FILE *fp); >diff --git a/source3/lib/system.c b/source3/lib/system.c >index 6349af5..915d7ca 100644 >--- a/source3/lib/system.c >+++ b/source3/lib/system.c >@@ -342,6 +342,20 @@ int sys_lstat(const char *fname,SMB_STRUCT_STAT *sbuf) > } > > /******************************************************************* >+ An posix_fallocate() wrapper that will deal with 64 bit filesizes. >+********************************************************************/ >+#if defined(HAVE_POSIX_FALLOCATE64) || defined(HAVE_POSIX_FALLOCATE) >+int sys_posix_fallocate(int fd, SMB_OFF_T offset, SMB_OFF_T len) >+{ >+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_POSIX_FALLOCATE64) >+ return posix_fallocate64(fd, offset, len); >+#else >+ return posix_fallocate(fd, offset, len); >+#endif >+} >+#endif >+ >+/******************************************************************* > An ftruncate() wrapper that will deal with 64 bit filesizes. > ********************************************************************/ > >diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c >index f5cee4c..4c14e08 100644 >--- a/source3/modules/vfs_default.c >+++ b/source3/modules/vfs_default.c >@@ -825,8 +825,6 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs > if (SMB_VFS_FSTAT(fsp, &st) == -1) > return -1; > >- space_to_write = len - st.st_size; >- > #ifdef S_ISFIFO > if (S_ISFIFO(st.st_mode)) > return 0; >@@ -839,7 +837,28 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs > if (st.st_size > len) > return sys_ftruncate(fsp->fh->fd, len); > >+ /* 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. */ >+#if defined(HAVE_POSIX_FALLOCATE) >+ { >+ int ret = sys_posix_fallocate(fsp->fh->fd, 0, len); >+ if (ret == ENOSPC) { >+ errno = ENOSPC; >+ return -1; >+ } >+ if (ret == 0) { >+ return 0; >+ } >+ DEBUG(10,("strict_allocate_ftruncate: sys_posix_fallocate " >+ "failed with error %d. " >+ "Falling back to slow manual allocation\n", ret)); >+ } >+#endif > /* available disk space is enough or not? */ >+ space_to_write = len - st.st_size; > if (lp_strict_allocate(SNUM(fsp->conn))){ > uint64_t space_avail; > uint64_t bsize,dfree,dsize; >@@ -857,8 +876,6 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs > if (SMB_VFS_LSEEK(fsp, st.st_size, SEEK_SET) != st.st_size) > return -1; > >- space_to_write = len - st.st_size; >- > memset(zero_space, '\0', sizeof(zero_space)); > while ( space_to_write > 0) { > SMB_OFF_T retlen; >-- >1.6.0.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 6942
:
5027
|
5028
|
5032
|
5033
|
5065
|
5066
|
5312
|
5313
|
5314
|
5315
|
5317
|
5359
|
5360