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).

Attachment: pgpwUyXmOj2Ib.pgp
Description: PGP signature

Reply via email to