git: 5171310e661d - main - vfs: use finstall_refed in openat
Mateusz Guzik
mjg at FreeBSD.org
Wed Jan 13 03:31:42 UTC 2021
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=5171310e661d6c85f6208d86c6f651e3d499e346
commit 5171310e661d6c85f6208d86c6f651e3d499e346
Author: Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-01-12 16:11:15 +0000
Commit: Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-01-13 03:30:38 +0000
vfs: use finstall_refed in openat
This avoids 2 atomic ops in the common case: 1 to grab an extra
reference and 1 to release it.
---
sys/kern/vfs_syscalls.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 560a003765d5..c1b6c70ab0ac 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -1129,15 +1129,11 @@ kern_openat(struct thread *td, int fd, const char *path, enum uio_seg pathseg,
/*
* Allocate a file structure. The descriptor to reference it
- * is allocated and set by finstall() below.
+ * is allocated and used by finstall_refed() below.
*/
error = falloc_noinstall(td, &fp);
if (error != 0)
return (error);
- /*
- * An extra reference on `fp' has been held for us by
- * falloc_noinstall().
- */
/* Set the flags early so the finit in devfs can pick them up. */
fp->f_flag = flags & FMASK;
cmode = ((mode & ~pdp->pd_cmask) & ALLPERMS) & ~S_ISTXT;
@@ -1210,21 +1206,17 @@ success:
else
#endif
fcaps = NULL;
- error = finstall(td, fp, &indx, flags, fcaps);
- /* On success finstall() consumes fcaps. */
+ error = finstall_refed(td, fp, &indx, flags, fcaps);
+ /* On success finstall_refed() consumes fcaps. */
if (error != 0) {
filecaps_free(&nd.ni_filecaps);
goto bad;
}
} else {
filecaps_free(&nd.ni_filecaps);
+ fdrop_close(fp, td);
}
- /*
- * Release our private reference, leaving the one associated with
- * the descriptor table intact.
- */
- fdrop(fp, td);
td->td_retval[0] = indx;
return (0);
bad:
More information about the dev-commits-src-main
mailing list