2000-11-18 22:53:04

by bert hubert

[permalink] [raw]
Subject: 2.4 sendfile() not doing as manpage promises?

Hi everybody,

I tried to use sendfile() to send data from a tcp/ip socket to a file on
disk. This does not work, giving EINVAL.

Using the very fine kgdb product (http://kgdb.sourceforge.net) and my laptop
for remote debugging, I was able to trace this to this:

sys/filemap.c::sys_sendfile():

if (!in_inode->i_mapping->a_ops->readpage)
goto fput_in;

After some exploring with 'ddd' (a very nice graphical frontend for gdb,
which includes tools to display and traverse structs), I found that this
probably means that sendfile() can only be used to send files from
blockdevices which support mmap()-like functionality.

Is this correct? In that case, the wording of the manpage needs to be
changed, as it implies that 'either or both' of the filedescriptors can be
sockets.

Regards,

bert hubert

--
PowerDNS Versatile DNS Services
Trilab The Technology People
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet


2000-11-18 23:45:19

by Dan Hollis

[permalink] [raw]
Subject: Re: 2.4 sendfile() not doing as manpage promises?

On Sun, 19 Nov 2000, bert hubert wrote:
> After some exploring with 'ddd' (a very nice graphical frontend for gdb,
> which includes tools to display and traverse structs), I found that this
> probably means that sendfile() can only be used to send files from
> blockdevices which support mmap()-like functionality. Is this correct?

Correct.

> In that case, the wording of the manpage needs to be changed, as it
> implies that 'either or both' of the filedescriptors can be sockets.

Its quite clear.

DESCRIPTION
This call copies data between file descriptor and another
file descriptor or socket. in_fd should be a file
descriptor opened for reading. out_fd should be a
descriptor opened for writing or a connected socket.

in_fd must be a file, out_fd can be a file or socket.

-Dan

2000-11-19 00:29:39

by bert hubert

[permalink] [raw]
Subject: Re: 2.4 sendfile() not doing as manpage promises?

On Sat, Nov 18, 2000 at 03:15:28PM -0800, Dan Hollis wrote:

> > In that case, the wording of the manpage needs to be changed, as it
> > implies that 'either or both' of the filedescriptors can be sockets.
>
> Its quite clear.
>
> DESCRIPTION
> This call copies data between file descriptor and another
> file descriptor or socket. in_fd should be a file
> descriptor opened for reading. out_fd should be a
> descriptor opened for writing or a connected socket.
>
> in_fd must be a file, out_fd can be a file or socket.

My manpages must be outdated then, my manpage is from 1 Dec 1998. Thanks for
the correction.

Regards,

bert hubert


--
PowerDNS Versatile DNS Services
Trilab The Technology People
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet

2000-11-19 17:06:56

by Andries Brouwer

[permalink] [raw]
Subject: Re: 2.4 sendfile() not doing as manpage promises?

On Sun, Nov 19, 2000 at 01:53:00AM +0100, bert hubert wrote:
: On Sat, Nov 18, 2000 at 03:15:28PM -0800, Dan Hollis wrote:
:
::: In that case, the wording of the manpage needs to be changed, as it
::: implies that 'either or both' of the filedescriptors can be sockets.
::
:: Its quite clear.
::
:: DESCRIPTION
:: This call copies data between file descriptor and another
:: file descriptor or socket. in_fd should be a file
:: descriptor opened for reading. out_fd should be a
:: descriptor opened for writing or a connected socket.
::
:: in_fd must be a file, out_fd can be a file or socket.
:
: My manpages must be outdated then, my manpage is from 1 Dec 1998. Thanks for
: the correction.

The manpage is dated 1 Dec 1998 and reads

DESCRIPTION
This call copies data between one file descriptor and
another. Either or both of these file descriptors may
refer to a socket. in_fd should be a file descriptor
opened for reading and out_fd should be a descriptor
opened for writing.

If that is incorrect, then editing a private copy of the manpage,
as Dan Hollis, or the distributor from whom he got his page,
seems to have done, does not suffice to change the manpage distribution.

(Moreover, the text Dan Hollis quotes is rather strange --
also sockets give one a file descriptor, so the author
of that modified man page did not know what he was talking
about, or was not being precise.)

Andries

2000-11-19 22:53:35

by bert hubert

[permalink] [raw]
Subject: Re: 2.4 sendfile() not doing as manpage promises?

On Sun, Nov 19, 2000 at 05:36:23PM +0100, Andries Brouwer wrote:
> DESCRIPTION
> This call copies data between one file descriptor and
> another. Either or both of these file descriptors may
> refer to a socket. in_fd should be a file descriptor
> opened for reading and out_fd should be a descriptor
> opened for writing.
>
> If that is incorrect, then editing a private copy of the manpage,
> as Dan Hollis, or the distributor from whom he got his page,
> seems to have done, does not suffice to change the manpage distribution.

Improved attempt:

DESCRIPTION
This call copies data between one file descriptor and another. The
descriptor from which data is read cannot be a socket but must
correspond to a file which supports mmap()-like operations. in_fd
should be a filedescriptor opened for reading and out_fd should be a
descriptor opened for writing. Because this copying is done within
the kernel, sendfile() does not need to spend time transfering data
to and from userspace.

Regards,

bert hubert

--
PowerDNS Versatile DNS Services
Trilab The Technology People
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet

2000-11-20 01:41:24

by Dan Hollis

[permalink] [raw]
Subject: Re: 2.4 sendfile() not doing as manpage promises?

On Sun, 19 Nov 2000, Andries Brouwer wrote:
> Moreover, the text Dan Hollis quotes is rather strange

It's from redhat 6.0 man-pages-1.23-3 rpm package.

-Dan