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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to