The Samba-Bugzilla – Attachment 10500 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]
Back-port of master fix for 4.1.next.
bug-10911-v4-1 (text/plain), 8.79 KB, created by
Jeremy Allison
on 2014-12-08 03:31:46 UTC
(
hide
)
Description:
Back-port of master fix for 4.1.next.
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2014-12-08 03:31:46 UTC
Size:
8.79 KB
patch
obsolete
>From 294505c3a9c9968814482c7a9933c31a6e7259ff 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 ed14c67..23c1cc2 100644 >--- a/source3/modules/vfs_default.c >+++ b/source3/modules/vfs_default.c >@@ -1819,15 +1819,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, >@@ -1843,8 +1842,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; >@@ -1929,6 +1927,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 7fbb84ffec95e29c2b396f3a720e977e586eee6f 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 4a0588e..cdd5042 100644 >--- a/source3/smbd/vfs.c >+++ b/source3/smbd/vfs.c >@@ -580,6 +580,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, >@@ -634,7 +638,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) >@@ -648,7 +652,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; > } > } > >@@ -657,10 +661,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; > } >@@ -718,9 +724,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) { >@@ -731,10 +735,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 a459f8eb0fc2e3de36c5b038903c35829c054fb6 Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Sun, 7 Dec 2014 18:59:26 -0800 >Subject: [PATCH 3/3] s3: modules: Fix *allocate* calls to follow POSIX error > return convention. > >Fix up the ceph, 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> >--- > source3/modules/vfs_ceph.c | 13 +++---------- > source3/modules/vfs_streams_xattr.c | 5 +++-- > source3/modules/vfs_time_audit.c | 8 +++++++- > 3 files changed, 13 insertions(+), 13 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_streams_xattr.c b/source3/modules/vfs_streams_xattr.c >index 5e9bd3e..0409c05 100644 >--- a/source3/modules/vfs_streams_xattr.c >+++ b/source3/modules/vfs_streams_xattr.c >@@ -1021,11 +1021,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 1b14d65..e0dcc90 100644 >--- a/source3/modules/vfs_time_audit.c >+++ b/source3/modules/vfs_time_audit.c >@@ -1211,18 +1211,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