svn commit: r366019 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Tue Sep 22 22:23:59 UTC 2020
Author: kib
Date: Tue Sep 22 22:23:58 2020
New Revision: 366019
URL: https://svnweb.freebsd.org/changeset/base/366019
Log:
Add open2nameif()
the helper to calculate namei flags both for open(2) and creat(2).
Suggested and reviewed by: markj
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D25886
Modified:
head/sys/kern/vfs_vnops.c
Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c Tue Sep 22 22:22:29 2020 (r366018)
+++ head/sys/kern/vfs_vnops.c Tue Sep 22 22:23:58 2020 (r366019)
@@ -192,6 +192,21 @@ vn_open(struct nameidata *ndp, int *flagp, int cmode,
return (vn_open_cred(ndp, flagp, cmode, 0, td->td_ucred, fp));
}
+static uint64_t
+open2nameif(int fmode, u_int vn_open_flags)
+{
+ uint64_t res;
+
+ res = ISOPEN | LOCKLEAF;
+ if ((fmode & O_BENEATH) != 0)
+ res |= BENEATH;
+ if ((vn_open_flags & VN_OPEN_NOAUDIT) == 0)
+ res |= AUDITVNODE1;
+ if ((vn_open_flags & VN_OPEN_NOCAPCHECK) != 0)
+ res |= NOCAPCHECK;
+ return (res);
+}
+
/*
* Common code for vnode open operations via a name lookup.
* Lookup the vnode and invoke VOP_CREATE if needed.
@@ -218,19 +233,14 @@ restart:
return (EINVAL);
else if ((fmode & (O_CREAT | O_DIRECTORY)) == O_CREAT) {
ndp->ni_cnd.cn_nameiop = CREATE;
+ ndp->ni_cnd.cn_flags = open2nameif(fmode, vn_open_flags);
/*
* Set NOCACHE to avoid flushing the cache when
* rolling in many files at once.
*/
- ndp->ni_cnd.cn_flags = ISOPEN | LOCKPARENT | LOCKLEAF | NOCACHE;
+ ndp->ni_cnd.cn_flags |= LOCKPARENT | NOCACHE;
if ((fmode & O_EXCL) == 0 && (fmode & O_NOFOLLOW) == 0)
ndp->ni_cnd.cn_flags |= FOLLOW;
- if ((fmode & O_BENEATH) != 0)
- ndp->ni_cnd.cn_flags |= BENEATH;
- if (!(vn_open_flags & VN_OPEN_NOAUDIT))
- ndp->ni_cnd.cn_flags |= AUDITVNODE1;
- if (vn_open_flags & VN_OPEN_NOCAPCHECK)
- ndp->ni_cnd.cn_flags |= NOCAPCHECK;
if ((vn_open_flags & VN_OPEN_INVFS) == 0)
bwillwrite();
if ((error = namei(ndp)) != 0)
@@ -285,16 +295,11 @@ restart:
}
} else {
ndp->ni_cnd.cn_nameiop = LOOKUP;
- ndp->ni_cnd.cn_flags = ISOPEN |
- ((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) | LOCKLEAF;
- if (!(fmode & FWRITE))
+ ndp->ni_cnd.cn_flags = open2nameif(fmode, vn_open_flags);
+ ndp->ni_cnd.cn_flags |= (fmode & O_NOFOLLOW) != 0 ? NOFOLLOW :
+ FOLLOW;
+ if ((fmode & FWRITE) == 0)
ndp->ni_cnd.cn_flags |= LOCKSHARED;
- if ((fmode & O_BENEATH) != 0)
- ndp->ni_cnd.cn_flags |= BENEATH;
- if (!(vn_open_flags & VN_OPEN_NOAUDIT))
- ndp->ni_cnd.cn_flags |= AUDITVNODE1;
- if (vn_open_flags & VN_OPEN_NOCAPCHECK)
- ndp->ni_cnd.cn_flags |= NOCAPCHECK;
if ((error = namei(ndp)) != 0)
return (error);
vp = ndp->ni_vp;
More information about the svn-src-all
mailing list