[SCM] Samba Shared Repository - branch master updated

David Disseldorp ddiss at samba.org
Wed Feb 27 16:23:02 UTC 2019


The branch, master has been updated
       via  eb62dc39eb4 docs: fix minor typo in smb.conf "log level" section
       via  f43cc62fb25 vfs_ceph: drop ifdef HAVE_FCHOWN/_FCHMOD
       via  155f1289ba7 vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback
       via  70329c36ed9 vfs_ceph: fix strict_allocate_ftruncate()
       via  5a7e7280813 vfs_ceph: add missing fallocate hook
      from  4f307f2302b selftest: force running with TZ=UTC

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


- Log -----------------------------------------------------------------
commit eb62dc39eb48b4e2207c80c232664ca37af9c2e6
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Feb 27 12:09:52 2019 +0100

    docs: fix minor typo in smb.conf "log level" section
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    
    Autobuild-User(master): David Disseldorp <ddiss at samba.org>
    Autobuild-Date(master): Wed Feb 27 16:22:27 UTC 2019 on sn-devel-144

commit f43cc62fb25d607a489cafd96b21cf0788773bbf
Author: David Disseldorp <ddiss at samba.org>
Date:   Tue Feb 26 13:54:21 2019 +0100

    vfs_ceph: drop ifdef HAVE_FCHOWN/_FCHMOD
    
    The cephwrap_fchown() and cephwrap_fchmod() wrappers call the
    corresponding libcephfs functions. It doesn't make sense to make this
    logic dependent on regular fchown()/fchmod() function presence, so remove
    the ifdefs.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

commit 155f1289ba7a4802fbb99fbc9ea90d8bc6cff0c9
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Feb 27 11:52:42 2019 +0100

    vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback
    
    Both libcephfs functions are supported and capable of extending files,
    so fallback can be dropped.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

commit 70329c36ed91dd0e50ff66f9b0a85c62ac8a621e
Author: David Disseldorp <ddiss at samba.org>
Date:   Tue Feb 26 16:07:27 2019 +0100

    vfs_ceph: fix strict_allocate_ftruncate()
    
    The vfs_ceph "strict allocate = yes" ftruncate wrapper may attempt
    *local* filesystem ftruncate(). Fix this.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

commit 5a7e7280813559fb70a9fc8e4238cb6015ee3b53
Author: David Disseldorp <ddiss at samba.org>
Date:   Tue Feb 26 21:26:27 2019 +0100

    vfs_ceph: add missing fallocate hook
    
    SMB_VFS_FALLOCATE() calls atop a vfs_ceph share currently fall through
    to vfs_default, which results in a local filesystem I/O attempt using a
    libcephfs file-descriptor. Add the missing fallocate hook to vfs_ceph.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

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

Summary of changes:
 docs-xml/smbdotconf/logging/loglevel.xml |   2 +-
 source3/modules/vfs_ceph.c               | 124 +++++++------------------------
 2 files changed, 26 insertions(+), 100 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/logging/loglevel.xml b/docs-xml/smbdotconf/logging/loglevel.xml
index 1bc4146dac9..d3bed8a939b 100644
--- a/docs-xml/smbdotconf/logging/loglevel.xml
+++ b/docs-xml/smbdotconf/logging/loglevel.xml
@@ -6,7 +6,7 @@
 <synonym>debuglevel</synonym>
 <description>
     <para>
-    The value of the parameter (a astring) allows the debug level (logging level) to be specified in the 
+    The value of the parameter (a string) allows the debug level (logging level) to be specified in the
     <filename moreinfo="none">smb.conf</filename> file. 
     </para>
 
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 60afd73efe6..67b8d139891 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -961,15 +961,9 @@ static int cephwrap_fchmod(struct vfs_handle_struct *handle, files_struct *fsp,
 	int result;
 
 	DBG_DEBUG("[CEPH] fchmod(%p, %p, %d)\n", handle, fsp, mode);
-
-#if defined(HAVE_FCHMOD)
 	result = ceph_fchmod(handle->data, fsp->fh->fd, mode);
 	DBG_DEBUG("[CEPH] fchmod(...) = %d\n", result);
 	WRAP_RETURN(result);
-#else
-	errno = ENOSYS;
-#endif
-	return -1;
 }
 
 static int cephwrap_chown(struct vfs_handle_struct *handle,
@@ -987,17 +981,11 @@ static int cephwrap_chown(struct vfs_handle_struct *handle,
 static int cephwrap_fchown(struct vfs_handle_struct *handle, files_struct *fsp, uid_t uid, gid_t gid)
 {
 	int result;
-#ifdef HAVE_FCHOWN
 
 	DBG_DEBUG("[CEPH] fchown(%p, %p, %d, %d)\n", handle, fsp, uid, gid);
 	result = ceph_fchown(handle->data, fsp->fh->fd, uid, gid);
 	DBG_DEBUG("[CEPH] fchown(...) = %d\n", result);
 	WRAP_RETURN(result);
-#else
-	errno = ENOSYS;
-	result = -1;
-#endif
-	return result;
 }
 
 static int cephwrap_lchown(struct vfs_handle_struct *handle,
@@ -1037,9 +1025,7 @@ static struct smb_filename *cephwrap_getwd(struct vfs_handle_struct *handle,
 static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_struct *fsp, off_t len)
 {
 	off_t space_to_write;
-	uint64_t space_avail;
-	uint64_t bsize,dfree,dsize;
-	int ret;
+	int result;
 	NTSTATUS status;
 	SMB_STRUCT_STAT *pst;
 
@@ -1058,106 +1044,45 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_str
 		return 0;
 
 	/* Shrink - just ftruncate. */
-	if (pst->st_ex_size > len)
-		return ftruncate(fsp->fh->fd, len);
-
-	space_to_write = len - pst->st_ex_size;
-
-	/* for allocation try 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. fallocate implementations can
-	   return ENOTSUP or EINVAL in cases like that. */
-	ret = SMB_VFS_FALLOCATE(fsp, 0, pst->st_ex_size, space_to_write);
-	if (ret == -1 && errno == ENOSPC) {
-		return -1;
-	}
-	if (ret == 0) {
-		return 0;
-	}
-	DEBUG(10,("[CEPH] strict_allocate_ftruncate: SMB_VFS_FALLOCATE failed with "
-		"error %d. Falling back to slow manual allocation\n", errno));
-
-	/* available disk space is enough or not? */
-	space_avail =
-	    get_dfree_info(fsp->conn, fsp->fsp_name, &bsize, &dfree, &dsize);
-	/* space_avail is 1k blocks */
-	if (space_avail == (uint64_t)-1 ||
-			((uint64_t)space_to_write/1024 > space_avail) ) {
-		errno = ENOSPC;
-		return -1;
+	if (pst->st_ex_size > len) {
+		result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
+		WRAP_RETURN(result);
 	}
 
-	/* Write out the real space on disk. */
-	return vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write);
+	space_to_write = len - pst->st_ex_size;
+	result = ceph_fallocate(handle->data, fsp->fh->fd, 0, pst->st_ex_size,
+				space_to_write);
+	WRAP_RETURN(result);
 }
 
 static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct *fsp, off_t len)
 {
 	int result = -1;
-	SMB_STRUCT_STAT st;
-	char c = 0;
-	off_t currpos;
 
 	DBG_DEBUG("[CEPH] ftruncate(%p, %p, %llu\n", handle, fsp, llu(len));
 
 	if (lp_strict_allocate(SNUM(fsp->conn))) {
-		result = strict_allocate_ftruncate(handle, fsp, len);
-		return result;
+		return strict_allocate_ftruncate(handle, fsp, len);
 	}
 
-	/* we used to just check HAVE_FTRUNCATE_EXTEND and only use
-	   sys_ftruncate if the system supports it. Then I discovered that
-	   you can have some filesystems that support ftruncate
-	   expansion and some that don't! On Linux fat can't do
-	   ftruncate extend but ext2 can. */
-
 	result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
-	if (result == 0)
-		goto done;
-
-	/* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
-	   extend a file with ftruncate. Provide alternate implementation
-	   for this */
-	currpos = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
-	if (currpos == -1) {
-		goto done;
-	}
-
-	/* Do an fstat to see if the file is longer than the requested
-	   size in which case the ftruncate above should have
-	   succeeded or shorter, in which case seek to len - 1 and
-	   write 1 byte of zero */
-	if (SMB_VFS_FSTAT(fsp, &st) == -1) {
-		goto done;
-	}
-
-#ifdef S_ISFIFO
-	if (S_ISFIFO(st.st_ex_mode)) {
-		result = 0;
-		goto done;
-	}
-#endif
-
-	if (st.st_ex_size == len) {
-		result = 0;
-		goto done;
-	}
-
-	if (st.st_ex_size > len) {
-		/* the sys_ftruncate should have worked */
-		goto done;
-	}
-
-	if (SMB_VFS_PWRITE(fsp, &c, 1, len-1)!=1) {
-		goto done;
-	}
-
-	result = 0;
+	WRAP_RETURN(result);
+}
 
-  done:
+static int cephwrap_fallocate(struct vfs_handle_struct *handle,
+			      struct files_struct *fsp,
+			      uint32_t mode,
+			      off_t offset,
+			      off_t len)
+{
+	int result;
 
-	return result;
+	DBG_DEBUG("[CEPH] fallocate(%p, %p, %u, %llu, %llu\n",
+		  handle, fsp, mode, llu(offset), llu(len));
+	/* unsupported mode flags are rejected by libcephfs */
+	result = ceph_fallocate(handle->data, fsp->fh->fd, mode, offset, len);
+	DBG_DEBUG("[CEPH] fallocate(...) = %d\n", result);
+	WRAP_RETURN(result);
 }
 
 static bool cephwrap_lock(struct vfs_handle_struct *handle, files_struct *fsp, int op, off_t offset, off_t count, int type)
@@ -1514,6 +1439,7 @@ static struct vfs_fn_pointers ceph_fns = {
 	.getwd_fn = cephwrap_getwd,
 	.ntimes_fn = cephwrap_ntimes,
 	.ftruncate_fn = cephwrap_ftruncate,
+	.fallocate_fn = cephwrap_fallocate,
 	.lock_fn = cephwrap_lock,
 	.kernel_flock_fn = cephwrap_kernel_flock,
 	.linux_setlease_fn = cephwrap_linux_setlease,


-- 
Samba Shared Repository



More information about the samba-cvs mailing list