Module Name: src
Committed By: dholland
Date: Mon Oct 8 23:43:33 UTC 2012
Modified Files:
src/sys/kern: vfs_lookup.c
src/sys/sys: namei.src
Log Message:
Add namei-level support for openat() and friends. The way you do it is
by calling NDAT(&nd, dirvp) after NDINIT().
Right now the implementation is vile and unspeakable to avoid changing
the kernel ABI; this way we can get openat() and friends into 6.1. I
will rectify the mess and bump the kernel once things are working.
To generate a diff of this commit:
cvs rdiff -u -r1.193 -r1.194 src/sys/kern/vfs_lookup.c
cvs rdiff -u -r1.25 -r1.26 src/sys/sys/namei.src
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.193 src/sys/kern/vfs_lookup.c:1.194
--- src/sys/kern/vfs_lookup.c:1.193 Mon Oct 8 23:41:39 2012
+++ src/sys/kern/vfs_lookup.c Mon Oct 8 23:43:33 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_lookup.c,v 1.193 2012/10/08 23:41:39 dholland Exp $ */
+/* $NetBSD: vfs_lookup.c,v 1.194 2012/10/08 23:43:33 dholland Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.193 2012/10/08 23:41:39 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.194 2012/10/08 23:43:33 dholland Exp $");
#include "opt_magiclinks.h"
@@ -1468,10 +1468,20 @@ int
namei(struct nameidata *ndp)
{
struct namei_state state;
+ struct vnode *forcecwd;
int error;
+ if (ndp->ni_cnd.cn_flags & DIDNDAT) {
+ /* Gross. This is done this way so it can go into 6.1. */
+ forcecwd = ndp->ni_dvp;
+ ndp->ni_dvp = NULL;
+ KASSERT(forcecwd != NULL);
+ } else {
+ forcecwd = NULL;
+ }
+
namei_init(&state, ndp);
- error = namei_tryemulroot(&state, NULL,
+ error = namei_tryemulroot(&state, forcecwd,
0/*!neverfollow*/, 0/*!inhibitmagic*/,
0/*isnfsd*/);
namei_cleanup(&state);
@@ -1504,6 +1514,8 @@ lookup_for_nfsd(struct nameidata *ndp, s
struct namei_state state;
int error;
+ KASSERT((ndp->ni_cnd.cn_flags & DIDNDAT) == 0); /* not allowed */
+
namei_init(&state, ndp);
error = namei_tryemulroot(&state, forcecwd,
neverfollow, 1/*inhibitmagic*/, 1/*isnfsd*/);
@@ -1612,6 +1624,8 @@ lookup_for_nfsd_index(struct nameidata *
struct namei_state state;
int error;
+ KASSERT((ndp->ni_cnd.cn_flags & DIDNDAT) == 0); /* not allowed */
+
/*
* Note: the name sent in here (is not|should not be) allowed
* to contain a slash.
Index: src/sys/sys/namei.src
diff -u src/sys/sys/namei.src:1.25 src/sys/sys/namei.src:1.26
--- src/sys/sys/namei.src:1.25 Fri Nov 25 16:51:43 2011
+++ src/sys/sys/namei.src Mon Oct 8 23:43:33 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: namei.src,v 1.25 2011/11/25 16:51:43 dholland Exp $ */
+/* $NetBSD: namei.src,v 1.26 2012/10/08 23:43:33 dholland Exp $ */
/*
* Copyright (c) 1985, 1989, 1991, 1993
@@ -144,8 +144,9 @@ NAMEIFL NOFOLLOW 0x00000000 /* do not fo
(pseudo) */
NAMEIFL EMULROOTSET 0x00000080 /* emulation root already
in ni_erootdir */
+NAMEIFL DIDNDAT 0x00000400 /* did NDAT() (temporary) */
NAMEIFL NOCHROOT 0x01000000 /* no chroot on abs path lookups */
-NAMEIFL MODMASK 0x010000fc /* mask of operational modifiers */
+NAMEIFL MODMASK 0x010004fc /* mask of operational modifiers */
/*
* Namei parameter descriptors.
*/
@@ -163,7 +164,7 @@ NAMEIFL INRELOOKUP 0x0800000 /* set whil
NAMEIFL PARAMASK 0x0eee300 /* mask of parameter descriptors */
/*
- * Initialization of an nameidata structure.
+ * Initialization of a nameidata structure.
*/
#define NDINIT(ndp, op, flags, pathbuf) { \
(ndp)->ni_cnd.cn_nameiop = op; \
@@ -171,6 +172,15 @@ NAMEIFL PARAMASK 0x0eee300 /* mask of pa
(ndp)->ni_pathbuf = pathbuf; \
(ndp)->ni_cnd.cn_cred = kauth_cred_get(); \
}
+
+/*
+ * Use this to set the start directory for openat()-type operations.
+ */
+#define NDAT(ndp, dir) { \
+ (ndp)->ni_cnd.cn_flags |= DIDNDAT; \
+ (ndp)->ni_dvp = (dir); \
+}
+
#endif
/*