svn commit: r311113 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Mon Jan 2 18:59:25 UTC 2017


Author: kib
Date: Mon Jan  2 18:59:23 2017
New Revision: 311113
URL: https://svnweb.freebsd.org/changeset/base/311113

Log:
  There is no need to use temporary statfs buffer for fsid obliteration
  and prison enforcement.  Do it on the caller buffer directly.
  
  Besides eliminating memory copies, this change also removes large
  structure from the kernel stack.
  
  Extracted from:	ino64 work by gleb
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/sys/kern/vfs_syscalls.c

Modified: head/sys/kern/vfs_syscalls.c
==============================================================================
--- head/sys/kern/vfs_syscalls.c	Mon Jan  2 18:58:13 2017	(r311112)
+++ head/sys/kern/vfs_syscalls.c	Mon Jan  2 18:59:23 2017	(r311113)
@@ -247,7 +247,7 @@ statfs_scale_blocks(struct statfs *sf, l
 static int
 kern_do_statfs(struct thread *td, struct mount *mp, struct statfs *buf)
 {
-	struct statfs *sp, sb;
+	struct statfs *sp;
 	int error;
 
 	if (mp == NULL)
@@ -271,13 +271,11 @@ kern_do_statfs(struct thread *td, struct
 	error = VFS_STATFS(mp, sp);
 	if (error != 0)
 		goto out;
+	*buf = *sp;
 	if (priv_check(td, PRIV_VFS_GENERATION)) {
-		bcopy(sp, &sb, sizeof(sb));
-		sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0;
-		prison_enforce_statfs(td->td_ucred, mp, &sb);
-		sp = &sb;
+		buf->f_fsid.val[0] = buf->f_fsid.val[1] = 0;
+		prison_enforce_statfs(td->td_ucred, mp, buf);
 	}
-	*buf = *sp;
 out:
 	vfs_unbusy(mp);
 	return (error);


More information about the svn-src-head mailing list