svn commit: r258613 - head/sys/kern

Adrian Chadd adrian at FreeBSD.org
Tue Nov 26 02:02:06 UTC 2013


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


More information about the svn-src-head mailing list