1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

Enable tests for splice on Linux. Add a static (vl, I hate this)

so we can detect broken Linux recvfile splice and correctly fall
back.
Jeremy.
(This used to be commit ec2d301a7a)
This commit is contained in:
Jeremy Allison 2008-05-06 15:44:39 -07:00
parent 5621ce6fb4
commit 82572cfd43
2 changed files with 39 additions and 2 deletions

View File

@ -5664,6 +5664,26 @@ if test x"$samba_cv_HAVE_POSIX_FADVISE" = x"yes"; then
[Whether posix_fadvise is available])
fi
############################################
# See if we have the Linux splice syscall.
AC_CACHE_CHECK([for Linux splice],
samba_cv_HAVE_LINUX_SPLICE,[
AC_TRY_LINK([
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
#include <fcntl.h>],
[long ret = splice(0,0,1,0,400,0);],
samba_cv_HAVE_LINUX_SPLICE=yes,
samba_cv_HAVE_LINUX_SPLICE=no)])
if test x"$samba_cv_HAVE_LINUX_SPLICE" = x"yes"; then
AC_DEFINE(HAVE_LINUX_SPLICE,1,
[Whether Linux splice is available])
fi
AC_HAVE_DECL(splice, [#include <fcntl.h>])
#################################################

View File

@ -124,7 +124,7 @@ static ssize_t default_sys_recvfile(int fromfd,
return (ssize_t)total_written;
}
#if defined(HAVE_SPLICE_SYSCALL)
#if defined(HAVE_LINUX_SPLICE)
/*
* Try and use the Linux system call to do this.
@ -134,17 +134,33 @@ static ssize_t default_sys_recvfile(int fromfd,
* from the network in the case of return != -1.
*/
ssize_t sys_recvfile(int fromfd,
int tofd,
SMB_OFF_T offset,
size_t count)
{
static bool try_splice_call = true;
size_t total_written = 0;
if (count == 0) {
return 0;
}
/*
* Older Linux kernels have splice for sendfile,
* but it fails for recvfile. Ensure we only try
* this once and always fall back to the userspace
* implementation if recvfile splice fails. JRA.
*/
if (!try_splice_call) {
return default_sys_recvfile(fromfd,
tofd,
offset,
count);
}
while (total_written < count) {
ssize_t ret = splice(fromfd,
NULL,
@ -155,7 +171,8 @@ ssize_t sys_recvfile(int fromfd,
if (ret == -1) {
if (errno != EINTR) {
if (total_written == 0 &&
errno == EBADF || errno == EINVAL) {
(errno == EBADF || errno == EINVAL)) {
try_splice_call = false;
return default_sys_recvfile(fromfd,
tofd,
offset,