The Samba-Bugzilla – Attachment 14874 Details for
Bug 13807
vfs_ceph strict_allocate_ftruncate calls (local FS) ftruncate and fallocate
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
backport for 4.8.next
bso13807_vfs_ceph_ftruncate_fallocate_48t.patchset (text/plain), 7.80 KB, created by
David Disseldorp
on 2019-02-27 18:13:26 UTC
(
hide
)
Description:
backport for 4.8.next
Filename:
MIME Type:
Creator:
David Disseldorp
Created:
2019-02-27 18:13:26 UTC
Size:
7.80 KB
patch
obsolete
>From 2d622a88da100f70be80a3caf27a1cc64c35238e Mon Sep 17 00:00:00 2001 >From: David Disseldorp <ddiss@samba.org> >Date: Tue, 26 Feb 2019 21:26:27 +0100 >Subject: [PATCH 1/3] 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@samba.org> >Reviewed-by: Guenther Deschner <gd@samba.org> >(cherry picked from commit 5a7e7280813559fb70a9fc8e4238cb6015ee3b53) >--- > source3/modules/vfs_ceph.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > >diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c >index b6707458b77..f73a1f65187 100644 >--- a/source3/modules/vfs_ceph.c >+++ b/source3/modules/vfs_ceph.c >@@ -1252,6 +1252,22 @@ static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct *fs > return result; > } > >+static int cephwrap_fallocate(struct vfs_handle_struct *handle, >+ struct files_struct *fsp, >+ uint32_t mode, >+ off_t offset, >+ off_t len) >+{ >+ int 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) > { > DBG_DEBUG("[CEPH] lock\n"); >@@ -1613,6 +1629,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, >-- >2.13.7 > > >From 8fe81ec39ea9825e5a8ed2851ec84446ee3c9d33 Mon Sep 17 00:00:00 2001 >From: David Disseldorp <ddiss@samba.org> >Date: Tue, 26 Feb 2019 16:07:27 +0100 >Subject: [PATCH 2/3] 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@samba.org> >Reviewed-by: Guenther Deschner <gd@samba.org> >(cherry picked from commit 70329c36ed91dd0e50ff66f9b0a85c62ac8a621e) >--- > source3/modules/vfs_ceph.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > >diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c >index f73a1f65187..c68a98f97e8 100644 >--- a/source3/modules/vfs_ceph.c >+++ b/source3/modules/vfs_ceph.c >@@ -1145,8 +1145,10 @@ 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); >+ if (pst->st_ex_size > len) { >+ ret = ceph_ftruncate(handle->data, fsp->fh->fd, len); >+ WRAP_RETURN(ret); >+ } > > space_to_write = len - pst->st_ex_size; > >-- >2.13.7 > > >From fbffee0d01280031829d22664367847c53039613 Mon Sep 17 00:00:00 2001 >From: David Disseldorp <ddiss@samba.org> >Date: Wed, 27 Feb 2019 11:52:42 +0100 >Subject: [PATCH 3/3] 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@samba.org> >Reviewed-by: Guenther Deschner <gd@samba.org> >(cherry picked from commit 155f1289ba7a4802fbb99fbc9ea90d8bc6cff0c9) >[ddiss@samba.org: rebase atop 48t without 532ff3a5b958] >--- > source3/modules/vfs_ceph.c | 102 ++++----------------------------------------- > 1 file changed, 8 insertions(+), 94 deletions(-) > >diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c >index c68a98f97e8..5d67142997d 100644 >--- a/source3/modules/vfs_ceph.c >+++ b/source3/modules/vfs_ceph.c >@@ -1124,9 +1124,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; > >@@ -1146,112 +1144,28 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_str > > /* Shrink - just ftruncate. */ > if (pst->st_ex_size > len) { >- ret = ceph_ftruncate(handle->data, fsp->fh->fd, len); >- WRAP_RETURN(ret); >+ result = ceph_ftruncate(handle->data, fsp->fh->fd, len); >+ WRAP_RETURN(result); > } > > 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; >- } >- >- /* Write out the real space on disk. */ >- return vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write); >+ 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_LSEEK(fsp, len-1, SEEK_SET) != len -1) >- goto done; >- >- if (SMB_VFS_WRITE(fsp, &c, 1)!=1) >- goto done; >- >- /* Seek to where we were */ >- if (SMB_VFS_LSEEK(fsp, currpos, SEEK_SET) != currpos) >- goto done; >- result = 0; >- >- done: >- >- return result; >+ WRAP_RETURN(result); > } > > static int cephwrap_fallocate(struct vfs_handle_struct *handle, >-- >2.13.7 >
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
Flags:
gd
:
review+
Actions:
View
Attachments on
bug 13807
: 14874 |
14875
|
14876