recvfile by linux splice
Jeremy Allison
jra at samba.org
Tue Sep 23 22:43:50 GMT 2008
On Tue, Sep 23, 2008 at 07:42:36PM +0800, Lin Mac wrote:
>
> hi,
>
> I've been trying to make the Linux splice work in samba. I'm using Linux 2.6.26.3 and samba-3.2.2
> With splice tool at http://brick.kernel.dk/snaps/splice-git-latest.tar.gz, and doing the test by running:
> # ./splice-fromnet 2001 | ./splice-out -m /dev/null
> # cat /dev/zero | netcat localhost 2001
> I think splice(socket to pipe)+splice(pipe to file) should work in Linux 2.6.26.3.
>
> Using the original code of samba, splice would always failed due to splice directly from a socket to a file in samba. Linux require one of the input/output descriptor to be a pipe (FIFO) (http://linux.die.net/man/2/splice), so I made a little modification with the following patch to make it work.
>
> 1. change splice(socket to file) to splice (socket to pipe)+splice (pipe to file)
> 2. the while (total_written < count) cause part of the data won't be written to file, so I changed it to while (count!=0). And I have no idea what while (total_written < count) and the latter drain_socket are used for...
>
> Now splice worked for small file ( <500kB), but larger files might failed (>800kB).
> Now I'm stuck again...
It looks like you're moving Samba's triggering of the kernel bug around :-(.
Jeremy.
More information about the samba-technical
mailing list