The Samba-Bugzilla – Attachment 10499 Details for
Bug 10982
fallocate() returned values on failure
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Cherry-pick of patches that went into master for 4.2.0
bug-10911-v4-2 (text/plain), 9.56 KB, created by
Jeremy Allison
on 2014-12-08 02:57:19 UTC
(
hide
)
Description:
Cherry-pick of patches that went into master for 4.2.0
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2014-12-08 02:57:19 UTC
Size:
9.56 KB
patch
obsolete
>From b0ccfd6e3fa6057e5d2bb01b8bb45304693a9854 Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Fri, 5 Dec 2014 15:31:19 -0800 >Subject: [PATCH 1/3] s3: smbd: Fix *allocate* calls to follow POSIX error > return convention. > >vfswrap_fallocate() is broken in that it can call posix_fallocate() >which returns an int error (and doesn't set errno) but can also >call Linux fallocate() which returns -1 and sets errno. > >Standardize on the -1,errno convention. > >Reported by Jones <jones.kstw@gmail.com> who provided the >initial patch. This patch tested and confirmed working >by him as well. > >https://bugzilla.samba.org/show_bug.cgi?id=10982 > >Signed-off-by: Jeremy Allison <jra@samba.org> >Reviewed-by: David Disseldorp <ddiss@suse.de> >(cherry picked from commit c9235deee0fc49c99cfaf2329b7af526d9dd12d0) >--- > source3/modules/vfs_default.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > >diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c >index 3a3943b..5c98cbc 100644 >--- a/source3/modules/vfs_default.c >+++ b/source3/modules/vfs_default.c >@@ -1843,15 +1843,14 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs > return ENOTSUP or EINVAL in cases like that. */ > ret = SMB_VFS_FALLOCATE(fsp, VFS_FALLOCATE_EXTEND_SIZE, > pst->st_ex_size, space_to_write); >- if (ret == ENOSPC) { >- errno = ENOSPC; >+ if (ret == -1 && errno == ENOSPC) { > return -1; > } > if (ret == 0) { > return 0; > } > DEBUG(10,("strict_allocate_ftruncate: SMB_VFS_FALLOCATE failed with " >- "error %d. Falling back to slow manual allocation\n", ret)); >+ "error %d. Falling back to slow manual allocation\n", errno)); > > /* available disk space is enough or not? */ > space_avail = get_dfree_info(fsp->conn, >@@ -1867,8 +1866,7 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs > /* Write out the real space on disk. */ > ret = vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write); > if (ret != 0) { >- errno = ret; >- ret = -1; >+ return -1; > } > > return 0; >@@ -1953,6 +1951,15 @@ static int vfswrap_fallocate(vfs_handle_struct *handle, > START_PROFILE(syscall_fallocate); > if (mode == VFS_FALLOCATE_EXTEND_SIZE) { > result = sys_posix_fallocate(fsp->fh->fd, offset, len); >+ /* >+ * posix_fallocate returns 0 on success, errno on error >+ * and doesn't set errno. Make it behave like fallocate() >+ * which returns -1, and sets errno on failure. >+ */ >+ if (result != 0) { >+ errno = result; >+ result = -1; >+ } > } else if (mode == VFS_FALLOCATE_KEEP_SIZE) { > result = sys_fallocate(fsp->fh->fd, mode, offset, len); > } else { >-- >1.9.1 > > >From 5ad73f0d894f7eb812877ef50c2ab6386f50ac5b Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Fri, 5 Dec 2014 15:34:12 -0800 >Subject: [PATCH 2/3] s3: smbd: Fix *allocate* calls to follow POSIX error > return convention. > >Fix vfs_allocate_file_space(), vfs_slow_fallocate(), >vfs_fill_sparse() to follow the -1,errno convention >for errors. > >Standardize on the -1,errno convention. > >Reported by Jones <jones.kstw@gmail.com> who provided the >initial patch. This patch tested and confirmed working >by him as well. > >https://bugzilla.samba.org/show_bug.cgi?id=10982 > >Signed-off-by: Jeremy Allison <jra@samba.org> >Reviewed-by: David Disseldorp <ddiss@suse.de> >(cherry picked from commit cc1f91cec627cb3e4fc89b96aae1e7e4c539cd1c) >--- > source3/smbd/vfs.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > >diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c >index 8e33f2d..64ff35a 100644 >--- a/source3/smbd/vfs.c >+++ b/source3/smbd/vfs.c >@@ -586,6 +586,10 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len) > return 0; > } > >+ if (ret == -1 && errno == ENOSPC) { >+ return -1; >+ } >+ > len -= fsp->fsp_name->st.st_ex_size; > len /= 1024; /* Len is now number of 1k blocks needed. */ > space_avail = get_dfree_info(conn, fsp->fsp_name->base_name, false, >@@ -640,7 +644,7 @@ int vfs_set_filelen(files_struct *fsp, off_t len) > fails. Needs to be outside of the default version of SMB_VFS_FALLOCATE > as this is also called from the default SMB_VFS_FTRUNCATE code. > Always extends the file size. >- Returns 0 on success, errno on failure. >+ Returns 0 on success, -1 on failure. > ****************************************************************************/ > > #define SPARSE_BUF_WRITE_SIZE (32*1024) >@@ -654,7 +658,7 @@ int vfs_slow_fallocate(files_struct *fsp, off_t offset, off_t len) > sparse_buf = SMB_CALLOC_ARRAY(char, SPARSE_BUF_WRITE_SIZE); > if (!sparse_buf) { > errno = ENOMEM; >- return ENOMEM; >+ return -1; > } > } > >@@ -663,10 +667,12 @@ int vfs_slow_fallocate(files_struct *fsp, off_t offset, off_t len) > > pwrite_ret = SMB_VFS_PWRITE(fsp, sparse_buf, curr_write_size, offset + total); > if (pwrite_ret == -1) { >+ int saved_errno = errno; > DEBUG(10,("vfs_slow_fallocate: SMB_VFS_PWRITE for file " > "%s failed with error %s\n", >- fsp_str_dbg(fsp), strerror(errno))); >- return errno; >+ fsp_str_dbg(fsp), strerror(saved_errno))); >+ errno = saved_errno; >+ return -1; > } > total += pwrite_ret; > } >@@ -724,9 +730,7 @@ int vfs_fill_sparse(files_struct *fsp, off_t len) > * return ENOTSUP or EINVAL in cases like that. */ > ret = SMB_VFS_FALLOCATE(fsp, VFS_FALLOCATE_EXTEND_SIZE, > offset, num_to_write); >- if (ret == ENOSPC) { >- errno = ENOSPC; >- ret = -1; >+ if (ret == -1 && errno == ENOSPC) { > goto out; > } > if (ret == 0) { >@@ -737,10 +741,6 @@ int vfs_fill_sparse(files_struct *fsp, off_t len) > } > > ret = vfs_slow_fallocate(fsp, offset, num_to_write); >- if (ret != 0) { >- errno = ret; >- ret = -1; >- } > > out: > >-- >1.9.1 > > >From 288b510a5c89a723d48bdac6747ff2e43c25aad5 Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Fri, 5 Dec 2014 15:37:11 -0800 >Subject: [PATCH 3/3] s3: modules: Fix *allocate* calls to follow POSIX error > return convention. > >Fix up the ceph, fruit, time_audit and streams_xattr modules to follow >the -1,errno convention for errors. > >Reported by Jones <jones.kstw@gmail.com> who provided the >initial patch. This patch tested and confirmed working >by him as well. > >Signed-off-by: Jeremy Allison <jra@samba.org> >Reviewed-by: David Disseldorp <ddiss@suse.de> > >Autobuild-User(master): Jeremy Allison <jra@samba.org> >Autobuild-Date(master): Mon Dec 8 02:59:43 CET 2014 on sn-devel-104 > >(cherry picked from commit 2845e1c29f8bce6306a73d546184c401bf89cfea) >--- > source3/modules/vfs_ceph.c | 13 +++---------- > source3/modules/vfs_fruit.c | 5 +++-- > source3/modules/vfs_streams_xattr.c | 5 +++-- > source3/modules/vfs_time_audit.c | 8 +++++++- > 4 files changed, 16 insertions(+), 15 deletions(-) > >diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c >index e402ff1..b0a0024 100644 >--- a/source3/modules/vfs_ceph.c >+++ b/source3/modules/vfs_ceph.c >@@ -795,15 +795,14 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_str > return ENOTSUP or EINVAL in cases like that. */ > ret = SMB_VFS_FALLOCATE(fsp, VFS_FALLOCATE_EXTEND_SIZE, > pst->st_ex_size, space_to_write); >- if (ret == ENOSPC) { >- errno = ENOSPC; >+ 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", ret)); >+ "error %d. Falling back to slow manual allocation\n", errno)); > > /* available disk space is enough or not? */ > space_avail = get_dfree_info(fsp->conn, >@@ -817,13 +816,7 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_str > } > > /* Write out the real space on disk. */ >- ret = vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write); >- if (ret != 0) { >- errno = ret; >- ret = -1; >- } >- >- return 0; >+ return vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write); > } > > static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct *fsp, off_t len) >diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c >index c1555f0..1d420f8 100644 >--- a/source3/modules/vfs_fruit.c >+++ b/source3/modules/vfs_fruit.c >@@ -2790,11 +2790,12 @@ static int fruit_fallocate(struct vfs_handle_struct *handle, > } > > if (!fruit_fsp_recheck(ad, fsp)) { >- return errno; >+ return -1; > } > > /* Let the pwrite code path handle it. */ >- return ENOSYS; >+ errno = ENOSYS; >+ return -1; > } > > static int fruit_ftruncate(struct vfs_handle_struct *handle, >diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c >index f0ab732..5c5a9a1 100644 >--- a/source3/modules/vfs_streams_xattr.c >+++ b/source3/modules/vfs_streams_xattr.c >@@ -1103,11 +1103,12 @@ static int streams_xattr_fallocate(struct vfs_handle_struct *handle, > } > > if (!streams_xattr_recheck(sio)) { >- return errno; >+ return -1; > } > > /* Let the pwrite code path handle it. */ >- return ENOSYS; >+ errno = ENOSYS; >+ return -1; > } > > >diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c >index 9dbbf8b..f48f464 100644 >--- a/source3/modules/vfs_time_audit.c >+++ b/source3/modules/vfs_time_audit.c >@@ -1213,18 +1213,24 @@ static int smb_time_audit_fallocate(vfs_handle_struct *handle, > off_t len) > { > int result; >+ int saved_errno = 0; > struct timespec ts1,ts2; > double timediff; > > clock_gettime_mono(&ts1); > result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len); >+ if (result == -1) { >+ saved_errno = errno; >+ } > clock_gettime_mono(&ts2); > timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; > > if (timediff > audit_timeout) { > smb_time_audit_log_fsp("fallocate", timediff, fsp); > } >- >+ if (result == -1) { >+ errno = saved_errno; >+ } > return result; > } > >-- >1.9.1 >
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:
ddiss
:
review+
Actions:
View
Attachments on
bug 10982
:
10480
|
10485
|
10496
| 10499 |
10500
|
10501