svn commit: r271582 - projects/sendfile/sys/kern
Gleb Smirnoff
glebius at FreeBSD.org
Sun Sep 14 09:57:58 UTC 2014
Author: glebius
Date: Sun Sep 14 09:57:57 2014
New Revision: 271582
URL: http://svnweb.freebsd.org/changeset/base/271582
Log:
Provide code path for soft errors. These are cases when sendfile() was
able to send some data, but not to the end. According to documentation
these are EAGAIN and EBUSY,
Fix sf_buf_alloc() failure to EAGAIN. ENOBUFS is more meaningful, but,
alas, we need to follow the historic API.
Sponsored by: Netflix
Sponsored by: Nginx, Inc.
Modified:
projects/sendfile/sys/kern/uipc_syscalls.c
Modified: projects/sendfile/sys/kern/uipc_syscalls.c
==============================================================================
--- projects/sendfile/sys/kern/uipc_syscalls.c Sun Sep 14 09:56:29 2014 (r271581)
+++ projects/sendfile/sys/kern/uipc_syscalls.c Sun Sep 14 09:57:57 2014 (r271582)
@@ -2932,12 +2932,13 @@ vn_sendfile(struct file *fp, int sockfd,
struct shmfd *shmfd;
struct vattr va;
off_t off, sbytes, rem, obj_size;
- int error, bsize, hdrlen;
+ int error, softerr, bsize, hdrlen;
obj = NULL;
so = NULL;
m = mh = NULL;
sbytes = 0;
+ softerr = 0;
error = sendfile_getobj(td, fp, &obj, &vp, &shmfd, &obj_size, &bsize);
if (error != 0)
@@ -3132,7 +3133,7 @@ retry_space:
vm_page_unlock(pa[j]);
}
if (m == NULL)
- error = ENOBUFS;
+ softerr = EAGAIN;
fixspace(npages, i, off, &space);
break;
}
@@ -3198,7 +3199,7 @@ retry_space:
mh = NULL;
}
- if (error) {
+ if (m == NULL) {
free(sfio, M_TEMP);
goto done;
}
@@ -3229,6 +3230,10 @@ retry_space:
sbytes += space + hdrlen;
if (hdrlen)
hdrlen = 0;
+ if (softerr) {
+ error = softerr;
+ goto done;
+ }
}
/*
More information about the svn-src-projects
mailing list