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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to