The Samba-Bugzilla – Attachment 10501 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.0.next.
bug-10982-v4-0 (text/plain), 7.46 KB, created by
Jeremy Allison
on 2014-12-08 04:14:58 UTC
(
hide
)
Description:
Back-port of master fix for 4.0.next.
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2014-12-08 04:14:58 UTC
Size:
7.46 KB
patch
obsolete
>From 54547f0994fcc474232d7c17b1d1ce60d1c7370e 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 b31f4be..429fca1 100644 >--- a/source3/modules/vfs_default.c >+++ b/source3/modules/vfs_default.c >@@ -1644,15 +1644,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, >@@ -1668,8 +1667,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; >@@ -1754,6 +1752,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 b7e37e08f90db546c228a95c144bc6a7f1e78191 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 124981c..63758ac 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 14c8d672d7e3dc8d32660adc9f2ec2d6d78ae54e Mon Sep 17 00:00:00 2001 >From: Jeremy Allison <jra@samba.org> >Date: Sun, 7 Dec 2014 19:50:54 -0800 >Subject: [PATCH 3/3] s3: modules: Fix *allocate* calls to follow POSIX error > return convention. > >Fix up the 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_streams_xattr.c | 5 +++-- > source3/modules/vfs_time_audit.c | 8 +++++++- > 2 files changed, 10 insertions(+), 3 deletions(-) > >diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c >index c4d86ee..625e995 100644 >--- a/source3/modules/vfs_streams_xattr.c >+++ b/source3/modules/vfs_streams_xattr.c >@@ -1027,11 +1027,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 95b4148..4b9aef0 100644 >--- a/source3/modules/vfs_time_audit.c >+++ b/source3/modules/vfs_time_audit.c >@@ -1210,18 +1210,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