David S. Miller wrote:
From: Jeff Garzik <jgarzik@xxxxxxxxxxxxxxxx>
Date: Mon, 16 Sep 2002 19:48:37 -0400
I dunno when it happened, but 2.5.x now returns EINVAL for all
file->file cases.
In 2.4.x, if sendpage is NULL, file_send_actor in mm/filemap.c faked a
call to fops->write().
In 2.5.x, if sendpage is NULL, EINVAL is unconditionally returned.
What if source and destination file and offsets match?
The same data is written out. No deadlock.
(unless the attached test is wrong)
Jeff
#include <sys/sendfile.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
int in, out;
struct stat st;
off_t off = 0;
ssize_t rc;
in = open("test.data", O_RDONLY);
if (in < 0) {
perror("test.data read");
return 1;
}
fstat(in, &st);
out = open("test.data", O_WRONLY);
if (out < 0) {
perror("test.data write");
return 1;
}
rc = sendfile(out, in, &off, st.st_size);
if (rc < 0) {
perror("sendfile");
close(in);
unlink("out");
close(out);
return 1;
}
close(in);
close(out);
return 0;
}
|