patch-2.1.43 linux/include/asm-sparc/namei.h

Next file: linux/include/asm-sparc/spinlock.h
Previous file: linux/include/asm-sparc/byteorder.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.42/linux/include/asm-sparc/namei.h linux/include/asm-sparc/namei.h
@@ -1,4 +1,4 @@
-/* $Id: namei.h,v 1.3 1997/01/26 23:36:36 davem Exp $
+/* $Id: namei.h,v 1.5 1997/06/07 08:32:54 ecd Exp $
  * linux/include/asm-sparc/namei.h
  *
  * Routines to handle famous /usr/gnemul/s*.
@@ -11,44 +11,37 @@
 #define SPARC_BSD_EMUL "usr/gnemul/sunos/"
 #define SPARC_SOL_EMUL "usr/gnemul/solaris/"
 
-#define translate_namei(pathname, base, follow_links, res_inode) ({					\
-	if ((current->personality & (PER_BSD|PER_SVR4)) && !base && *pathname == '/') {			\
-		struct inode *emul_ino;									\
-		int namelen;										\
-		const char *name;									\
-													\
-		while (*pathname == '/')								\
-			pathname++;									\
-		current->fs->root->i_count++;								\
-		if (dir_namei (current->personality & PER_BSD ? SPARC_BSD_EMUL : SPARC_SOL_EMUL, 	\
-				&namelen, &name, current->fs->root, &emul_ino) >= 0 && emul_ino) {	\
-			*res_inode = NULL;								\
-			if (_namei (pathname, emul_ino, follow_links, res_inode) >= 0 && *res_inode) 	\
-				return 0;								\
-		}											\
-		base = current->fs->root;								\
-		base->i_count++;									\
-	}												\
-})
-
-#define translate_open_namei(pathname, flag, mode, res_inode, base) ({					\
-	if ((current->personality & (PER_BSD|PER_SVR4)) && !base && *pathname == '/') {			\
-		struct inode *emul_ino;									\
-		int namelen;										\
-		const char *name;									\
-													\
-		while (*pathname == '/')								\
-			pathname++;									\
-		current->fs->root->i_count++;								\
-		if (dir_namei (current->personality & PER_BSD ? SPARC_BSD_EMUL : SPARC_SOL_EMUL, 	\
-				&namelen, &name, current->fs->root, &emul_ino) >= 0 && emul_ino) {	\
-			*res_inode = NULL;								\
-			if (open_namei (pathname, flag, mode, res_inode, emul_ino) >= 0 && *res_inode)	\
-				return 0;								\
-		}											\
-		base = current->fs->root;								\
-		base->i_count++;									\
-	}												\
-})
+extern int __namei(int, const char *, struct inode *, char *, struct inode **,
+		   struct inode **, struct qstr *, struct dentry **, int *);
+
+static __inline__ int
+__prefix_namei(int retrieve_mode, const char * name, struct inode * base,
+	       char * buf, struct inode ** res_dir, struct inode ** res_inode,
+	       struct qstr * last_name, struct dentry ** last_entry,
+	       int * last_error)
+{
+	int error;
+
+	if (!(current->personality & (PER_BSD|PER_SVR4)))
+		return -ENOENT;
+
+	while (*name == '/')
+		name++;
+
+	atomic_inc(&current->fs->root->i_count);
+	error = __namei(NAM_FOLLOW_LINK,
+		        current->personality & PER_BSD ?
+		        SPARC_BSD_EMUL : SPARC_SOL_EMUL, current->fs->root,
+		        buf, NULL, &base, NULL, NULL, NULL);
+	if (error)
+		return error;
+
+	error = __namei(retrieve_mode, name, base, buf, res_dir, res_inode,
+			last_name, last_entry, last_error);
+	if (error)
+		return error;
+
+	return 0;
+}
 
 #endif /* __SPARC_NAMEI_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov