diff -urpNX dontdiff linux-2.5.38/arch/ppc64/kernel/sys_ppc32.c linux-2.5.38-willy/arch/ppc64/kernel/sys_ppc32.c
--- linux-2.5.38/arch/ppc64/kernel/sys_ppc32.c	2002-09-23 10:20:27.000000000 -0400
+++ linux-2.5.38-willy/arch/ppc64/kernel/sys_ppc32.c	2002-09-27 09:48:18.000000000 -0400
@@ -3889,21 +3889,18 @@ long sys32_open(const char * filename, i
 	if (!IS_ERR(tmp)) {
 		fd = get_unused_fd();
 		if (fd >= 0) {
-			struct file * f = filp_open(tmp, flags, mode);
+			struct file * f = filp_open(tmp, flags | O_PUTNAME, mode);
 			error = PTR_ERR(f);
 			if (IS_ERR(f))
 				goto out_error;
 			fd_install(fd, f);
 		}
-out:
-		putname(tmp);
 	}
 	return fd;
 
 out_error:
 	put_unused_fd(fd);
-	fd = error;
-	goto out;
+	return error;
 }
 
 extern asmlinkage long sys_readlink(const char * path, char * buf, int bufsiz);
diff -urpNX dontdiff linux-2.5.38/arch/sparc64/kernel/sys_sparc32.c linux-2.5.38-willy/arch/sparc64/kernel/sys_sparc32.c
--- linux-2.5.38/arch/sparc64/kernel/sys_sparc32.c	2002-09-16 14:46:59.000000000 -0400
+++ linux-2.5.38-willy/arch/sparc64/kernel/sys_sparc32.c	2002-09-27 09:47:23.000000000 -0400
@@ -4061,21 +4061,18 @@ asmlinkage long sparc32_open(const char 
 	if (!IS_ERR(tmp)) {
 		fd = get_unused_fd();
 		if (fd >= 0) {
-			struct file * f = filp_open(tmp, flags, mode);
+			struct file * f = filp_open(tmp, flags | O_PUTNAME, mode);
 			error = PTR_ERR(f);
 			if (IS_ERR(f))
 				goto out_error;
 			fd_install(fd, f);
 		}
-out:
-		putname(tmp);
 	}
 	return fd;
 
 out_error:
 	put_unused_fd(fd);
-	fd = error;
-	goto out;
+	return error;
 }
 
 extern unsigned long do_mremap(unsigned long addr,
diff -urpNX dontdiff linux-2.5.38/fs/namei.c linux-2.5.38-willy/fs/namei.c
--- linux-2.5.38/fs/namei.c	2002-09-23 10:20:32.000000000 -0400
+++ linux-2.5.38-willy/fs/namei.c	2002-09-27 09:45:15.000000000 -0400
@@ -1244,6 +1244,8 @@ int open_namei(const char * pathname, in
 	 */
 	if (!(flag & O_CREAT)) {
 		error = path_lookup(pathname, lookup_flags(flag), nd);
+		if (flag & O_PUTNAME)
+			putname(pathname);
 		if (error)
 			return error;
 		dentry = nd->dentry;
@@ -1254,6 +1256,8 @@ int open_namei(const char * pathname, in
 	 * Create - we need to know the parent.
 	 */
 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
+	if (flag & O_PUTNAME)
+		putname(pathname);
 	if (error)
 		return error;
 
diff -urpNX dontdiff linux-2.5.38/fs/open.c linux-2.5.38-willy/fs/open.c
--- linux-2.5.38/fs/open.c	2002-07-27 14:09:31.000000000 -0400
+++ linux-2.5.38-willy/fs/open.c	2002-09-27 09:42:48.000000000 -0400
@@ -797,21 +797,18 @@ asmlinkage long sys_open(const char * fi
 	if (!IS_ERR(tmp)) {
 		fd = get_unused_fd();
 		if (fd >= 0) {
-			struct file *f = filp_open(tmp, flags, mode);
+			struct file *f = filp_open(tmp, flags | O_PUTNAME, mode);
 			error = PTR_ERR(f);
 			if (IS_ERR(f))
 				goto out_error;
 			fd_install(fd, f);
 		}
-out:
-		putname(tmp);
 	}
 	return fd;
 
 out_error:
 	put_unused_fd(fd);
-	fd = error;
-	goto out;
+	return error;
 }
 
 #ifndef __alpha__
diff -urpNX dontdiff linux-2.5.38/include/linux/fcntl.h linux-2.5.38-willy/include/linux/fcntl.h
--- linux-2.5.38/include/linux/fcntl.h	2002-06-20 18:53:48.000000000 -0400
+++ linux-2.5.38-willy/include/linux/fcntl.h	2002-09-27 09:50:29.000000000 -0400
@@ -7,7 +7,7 @@
 #define F_GETLEASE	(F_LINUX_SPECIFIC_BASE+1)
 
 /*
- * Request nofications on a directory.
+ * Request notifications on a directory.
  * See below for events that may be notified.
  */
 #define F_NOTIFY	(F_LINUX_SPECIFIC_BASE+2)
@@ -45,6 +45,11 @@
 #define IS_SETLK(cmd)	(IS_SETLK32(cmd)  || IS_SETLK64(cmd))
 #define IS_SETLKW(cmd)	(IS_SETLKW32(cmd) || IS_SETLKW64(cmd))
 
+/* Instructs open_namei() to get rid of the name ASAP */
+#ifndef O_PUTNAME
+#define O_PUTNAME 0x80000000
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif
