aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-05-23 19:28:26 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-06-07 00:34:52 +0000
commit5d745b399d31c0a48b634e7eae6786ba2675194b (patch)
treec1619acbe80987d25e7a6344c703a4d4459e8528
parent0917d91b33444ca55b132954cc33f0d409f5a4cc (diff)
downloadsrc-5d745b399d31c0a48b634e7eae6786ba2675194b.tar.gz
src-5d745b399d31c0a48b634e7eae6786ba2675194b.zip
vfs: elide vnode locking when it is only needed for audit if possible
(cherry picked from commit a269183875f6d5141c81277d41b552871e2171e5)
-rw-r--r--sys/kern/vfs_syscalls.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 26a8d31e4456..c18bb56fc632 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -2802,9 +2802,11 @@ sys_fchflags(struct thread *td, struct fchflags_args *uap)
if (error != 0)
return (error);
#ifdef AUDIT
- vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
- AUDIT_ARG_VNODE1(fp->f_vnode);
- VOP_UNLOCK(fp->f_vnode);
+ if (AUDITING_TD(td)) {
+ vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
+ AUDIT_ARG_VNODE1(fp->f_vnode);
+ VOP_UNLOCK(fp->f_vnode);
+ }
#endif
error = setfflags(td, fp->f_vnode, uap->flags);
fdrop(fp, td);
@@ -3303,9 +3305,11 @@ kern_futimes(struct thread *td, int fd, struct timeval *tptr,
if (error != 0)
return (error);
#ifdef AUDIT
- vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
- AUDIT_ARG_VNODE1(fp->f_vnode);
- VOP_UNLOCK(fp->f_vnode);
+ if (AUDITING_TD(td)) {
+ vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
+ AUDIT_ARG_VNODE1(fp->f_vnode);
+ VOP_UNLOCK(fp->f_vnode);
+ }
#endif
error = setutimes(td, fp->f_vnode, ts, 2, tptr == NULL);
fdrop(fp, td);
@@ -3337,9 +3341,11 @@ kern_futimens(struct thread *td, int fd, struct timespec *tptr,
if (error != 0)
return (error);
#ifdef AUDIT
- vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
- AUDIT_ARG_VNODE1(fp->f_vnode);
- VOP_UNLOCK(fp->f_vnode);
+ if (AUDITING_TD(td)) {
+ vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY);
+ AUDIT_ARG_VNODE1(fp->f_vnode);
+ VOP_UNLOCK(fp->f_vnode);
+ }
#endif
error = setutimes(td, fp->f_vnode, ts, 2, flags & UTIMENS_NULL);
fdrop(fp, td);