On Tue, Nov 26, 2013 at 02:02:05AM +0000, Adrian Chadd wrote: > Author: adrian > Date: Tue Nov 26 02:02:05 2013 > New Revision: 258613 > URL: http://svnweb.freebsd.org/changeset/base/258613 > > Log: > Refactor out the sendfile copyout in order to make vn_sendfile() > callable from the kernel. > > Right now vn_sendfile() can't be called from anything other than > a syscall handler _and_ return the number of bytes queued. > This simply moves the copyout() to do_sendfile() so that any kernel > code can initiate vn_sendfile() outside of a syscall context. > > Tested: > > * tiny little sendfile program spitting things out a tcp socket > > Sponsored by: Netflix, Inc. > > Modified: > head/sys/kern/uipc_syscalls.c > > Modified: head/sys/kern/uipc_syscalls.c > ============================================================================== > --- head/sys/kern/uipc_syscalls.c Tue Nov 26 01:30:10 2013 > (r258612) > +++ head/sys/kern/uipc_syscalls.c Tue Nov 26 02:02:05 2013 > (r258613) > @@ -1908,6 +1908,7 @@ do_sendfile(struct thread *td, struct se > struct file *fp; > cap_rights_t rights; > int error; > + off_t sbytes; > > /* > * File offset must be positive. If it goes beyond EOF > @@ -1947,9 +1948,11 @@ do_sendfile(struct thread *td, struct se > } > > error = fo_sendfile(fp, uap->s, hdr_uio, trl_uio, uap->offset, > - uap->nbytes, uap->sbytes, uap->flags, compat ? SFK_COMPAT : 0, td); > + uap->nbytes, &sbytes, uap->flags, compat ? SFK_COMPAT : 0, td); > fdrop(fp, td); > - > + if (uap->sbytes != NULL) { > + copyout(&sbytes, uap->sbytes, sizeof(off_t)); > + } > out: > free(hdr_uio, M_IOV); > free(trl_uio, M_IOV); > @@ -2546,7 +2549,7 @@ out: > td->td_retval[0] = 0; > } > if (sent != NULL) { > - copyout(&sbytes, sent, sizeof(off_t)); > + (*sent) = sbytes; > } > if (obj != NULL) > vm_object_deallocate(obj);
This breaks compat32 sendfile(2).
pgpwUyXmOj2Ib.pgp
Description: PGP signature