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 .