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:
parent
5621ce6fb4
commit
82572cfd43
@ -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>])
|
||||
|
||||
|
||||
#################################################
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user