From bd5f5da94da66c03392e82dcb9631879023c437e Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Mon, 10 Jan 2000 00:08:53 +0000 Subject: [PATCH] Add bwillwrite to all system calls that create things in the filesystem. Benchmarks that create huge trees of empty files overwhelm the buffer cache. --- sys/kern/vfs_extattr.c | 9 +++++++++ sys/kern/vfs_syscalls.c | 9 +++++++++ sys/kern/vfs_vnops.c | 1 + 3 files changed, 19 insertions(+) diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 4f8878c62b3..142a2c33942 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -1111,6 +1111,7 @@ mknod(p, uap) } if (error) return (error); + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1189,6 +1190,7 @@ mkfifo(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1235,6 +1237,7 @@ link(p, uap) struct nameidata nd; int error; + bwillwrite(); NDINIT(&nd, LOOKUP, FOLLOW|NOOBJ, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1295,6 +1298,7 @@ symlink(p, uap) path = zalloc(namei_zone); if ((error = copyinstr(SCARG(uap, path), path, MAXPATHLEN, NULL)) != 0) goto out; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT|NOOBJ, UIO_USERSPACE, SCARG(uap, link), p); if ((error = namei(&nd)) != 0) goto out; @@ -1337,6 +1341,7 @@ undelete(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT|DOWHITEOUT, UIO_USERSPACE, SCARG(uap, path), p); error = namei(&nd); @@ -1383,6 +1388,7 @@ unlink(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -2569,6 +2575,7 @@ rename(p, uap) struct nameidata fromnd, tond; int error; + bwillwrite(); NDINIT(&fromnd, DELETE, WANTPARENT | SAVESTART, UIO_USERSPACE, SCARG(uap, from), p); if ((error = namei(&fromnd)) != 0) @@ -2671,6 +2678,7 @@ mkdir(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); nd.ni_cnd.cn_flags |= WILLBEDIR; if ((error = namei(&nd)) != 0) @@ -2719,6 +2727,7 @@ rmdir(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT | LOCKLEAF, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 4f8878c62b3..142a2c33942 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1111,6 +1111,7 @@ mknod(p, uap) } if (error) return (error); + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1189,6 +1190,7 @@ mkfifo(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1235,6 +1237,7 @@ link(p, uap) struct nameidata nd; int error; + bwillwrite(); NDINIT(&nd, LOOKUP, FOLLOW|NOOBJ, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -1295,6 +1298,7 @@ symlink(p, uap) path = zalloc(namei_zone); if ((error = copyinstr(SCARG(uap, path), path, MAXPATHLEN, NULL)) != 0) goto out; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT|NOOBJ, UIO_USERSPACE, SCARG(uap, link), p); if ((error = namei(&nd)) != 0) goto out; @@ -1337,6 +1341,7 @@ undelete(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT|DOWHITEOUT, UIO_USERSPACE, SCARG(uap, path), p); error = namei(&nd); @@ -1383,6 +1388,7 @@ unlink(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) return (error); @@ -2569,6 +2575,7 @@ rename(p, uap) struct nameidata fromnd, tond; int error; + bwillwrite(); NDINIT(&fromnd, DELETE, WANTPARENT | SAVESTART, UIO_USERSPACE, SCARG(uap, from), p); if ((error = namei(&fromnd)) != 0) @@ -2671,6 +2678,7 @@ mkdir(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, CREATE, LOCKPARENT, UIO_USERSPACE, SCARG(uap, path), p); nd.ni_cnd.cn_flags |= WILLBEDIR; if ((error = namei(&nd)) != 0) @@ -2719,6 +2727,7 @@ rmdir(p, uap) int error; struct nameidata nd; + bwillwrite(); NDINIT(&nd, DELETE, LOCKPARENT | LOCKLEAF, UIO_USERSPACE, SCARG(uap, path), p); if ((error = namei(&nd)) != 0) diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 701330825dd..edbf7b1073a 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -92,6 +92,7 @@ vn_open(ndp, fmode, cmode) ndp->ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF; if ((fmode & O_EXCL) == 0 && (fmode & O_NOFOLLOW) == 0) ndp->ni_cnd.cn_flags |= FOLLOW; + bwillwrite(); error = namei(ndp); if (error) return (error);