From: Miklos Szeredi 64 bit architectures all implement their own compatibility sys_open(), when in fact the difference is simply not forcing the O_LARGEFILE flag. So use the a common function instead. Signed-off-by: Miklos Szeredi Cc: Cc: Christoph Hellwig Signed-off-by: Andrew Morton --- arch/ia64/ia32/ia32_entry.S | 2 +- arch/ia64/ia32/sys_ia32.c | 31 ------------------------------- arch/ppc64/kernel/misc.S | 2 +- arch/ppc64/kernel/sys_ppc32.c | 31 ------------------------------- arch/sparc64/kernel/sys_sparc32.c | 24 +----------------------- arch/x86_64/ia32/ia32entry.S | 2 +- arch/x86_64/ia32/sys_ia32.c | 26 -------------------------- fs/compat.c | 10 ++++++++++ fs/open.c | 19 +++++++++++-------- include/linux/fs.h | 1 + 10 files changed, 26 insertions(+), 122 deletions(-) diff -puN arch/ia64/ia32/ia32_entry.S~remove-duplicated-sys_open32-code-from-64bit-archs arch/ia64/ia32/ia32_entry.S --- devel/arch/ia64/ia32/ia32_entry.S~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/ia64/ia32/ia32_entry.S 2005-08-30 18:42:04.000000000 -0700 @@ -215,7 +215,7 @@ ia32_syscall_table: data8 sys32_fork data8 sys_read data8 sys_write - data8 sys32_open /* 5 */ + data8 compat_sys_open /* 5 */ data8 sys_close data8 sys32_waitpid data8 sys_creat diff -puN arch/ia64/ia32/sys_ia32.c~remove-duplicated-sys_open32-code-from-64bit-archs arch/ia64/ia32/sys_ia32.c --- devel/arch/ia64/ia32/sys_ia32.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/ia64/ia32/sys_ia32.c 2005-08-30 18:42:04.000000000 -0700 @@ -2347,37 +2347,6 @@ sys32_brk (unsigned int brk) return ret; } -/* - * Exactly like fs/open.c:sys_open(), except that it doesn't set the O_LARGEFILE flag. - */ -asmlinkage long -sys32_open (const char __user * filename, int flags, int mode) -{ - char * tmp; - int fd, error; - - tmp = getname(filename); - fd = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - fd = get_unused_fd(); - if (fd >= 0) { - struct file *f = filp_open(tmp, flags, 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; -} - /* Structure for ia32 emulation on ia64 */ struct epoll_event32 { diff -puN arch/ppc64/kernel/misc.S~remove-duplicated-sys_open32-code-from-64bit-archs arch/ppc64/kernel/misc.S --- devel/arch/ppc64/kernel/misc.S~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/ppc64/kernel/misc.S 2005-08-30 18:42:04.000000000 -0700 @@ -957,7 +957,7 @@ _GLOBAL(sys_call_table32) .llong .ppc_fork .llong .sys_read .llong .sys_write - .llong .sys32_open /* 5 */ + .llong .compat_sys_open /* 5 */ .llong .sys_close .llong .sys32_waitpid .llong .sys32_creat diff -puN arch/ppc64/kernel/sys_ppc32.c~remove-duplicated-sys_open32-code-from-64bit-archs arch/ppc64/kernel/sys_ppc32.c --- devel/arch/ppc64/kernel/sys_ppc32.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/ppc64/kernel/sys_ppc32.c 2005-08-30 18:42:04.000000000 -0700 @@ -867,37 +867,6 @@ off_t ppc32_lseek(unsigned int fd, u32 o return sys_lseek(fd, (int)offset, origin); } -/* - * This is just a version for 32-bit applications which does - * not force O_LARGEFILE on. - */ -asmlinkage long sys32_open(const char __user * filename, int flags, int mode) -{ - char * tmp; - int fd, error; - - tmp = getname(filename); - fd = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - fd = get_unused_fd(); - if (fd >= 0) { - struct file * f = filp_open(tmp, flags, 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; -} - /* Note: it is necessary to treat bufsiz as an unsigned int, * with the corresponding cast to a signed int to insure that the * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) diff -puN arch/sparc64/kernel/sys_sparc32.c~remove-duplicated-sys_open32-code-from-64bit-archs arch/sparc64/kernel/sys_sparc32.c --- devel/arch/sparc64/kernel/sys_sparc32.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/sparc64/kernel/sys_sparc32.c 2005-08-30 18:42:04.000000000 -0700 @@ -1002,29 +1002,7 @@ asmlinkage long sys32_adjtimex(struct ti asmlinkage long sparc32_open(const char __user *filename, int flags, int mode) { - char * tmp; - int fd, error; - - tmp = getname(filename); - fd = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - fd = get_unused_fd(); - if (fd >= 0) { - struct file * f = filp_open(tmp, flags, 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 do_sys_open(filename, flags, mode); } extern unsigned long do_mremap(unsigned long addr, diff -puN arch/x86_64/ia32/ia32entry.S~remove-duplicated-sys_open32-code-from-64bit-archs arch/x86_64/ia32/ia32entry.S --- devel/arch/x86_64/ia32/ia32entry.S~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/x86_64/ia32/ia32entry.S 2005-08-30 18:42:04.000000000 -0700 @@ -298,7 +298,7 @@ ia32_sys_call_table: .quad stub32_fork .quad sys_read .quad sys_write - .quad sys32_open /* 5 */ + .quad compat_sys_open /* 5 */ .quad sys_close .quad sys32_waitpid .quad sys_creat diff -puN arch/x86_64/ia32/sys_ia32.c~remove-duplicated-sys_open32-code-from-64bit-archs arch/x86_64/ia32/sys_ia32.c --- devel/arch/x86_64/ia32/sys_ia32.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/arch/x86_64/ia32/sys_ia32.c 2005-08-30 18:42:04.000000000 -0700 @@ -969,32 +969,6 @@ long sys32_kill(int pid, int sig) return sys_kill(pid, sig); } -asmlinkage long sys32_open(const char __user * filename, int flags, int mode) -{ - char * tmp; - int fd, error; - - /* don't force O_LARGEFILE */ - tmp = getname(filename); - fd = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - fd = get_unused_fd(); - if (fd >= 0) { - struct file *f = filp_open(tmp, flags, mode); - error = PTR_ERR(f); - if (IS_ERR(f)) { - put_unused_fd(fd); - fd = error; - } else { - fsnotify_open(f->f_dentry); - fd_install(fd, f); - } - } - putname(tmp); - } - return fd; -} - extern asmlinkage long sys_timer_create(clockid_t which_clock, struct sigevent __user *timer_event_spec, diff -puN fs/compat.c~remove-duplicated-sys_open32-code-from-64bit-archs fs/compat.c --- devel/fs/compat.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/fs/compat.c 2005-08-30 18:42:04.000000000 -0700 @@ -1277,6 +1277,16 @@ out: } /* + * Exactly like fs/open.c:sys_open(), except that it doesn't set the + * O_LARGEFILE flag. + */ +asmlinkage long +compat_sys_open(const char __user *filename, int flags, int mode) +{ + return do_sys_open(filename, flags, mode); +} + +/* * compat_count() counts the number of arguments/envelopes. It is basically * a copy of count() from fs/exec.c, except that it works with 32 bit argv * and envp pointers. diff -puN fs/open.c~remove-duplicated-sys_open32-code-from-64bit-archs fs/open.c --- devel/fs/open.c~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/fs/open.c 2005-08-30 18:42:04.000000000 -0700 @@ -933,16 +933,11 @@ void fastcall fd_install(unsigned int fd EXPORT_SYMBOL(fd_install); -asmlinkage long sys_open(const char __user * filename, int flags, int mode) +long do_sys_open(const char __user *filename, int flags, int mode) { - char * tmp; - int fd; + char *tmp = getname(filename); + int fd = PTR_ERR(tmp); - if (force_o_largefile()) - flags |= O_LARGEFILE; - - tmp = getname(filename); - fd = PTR_ERR(tmp); if (!IS_ERR(tmp)) { fd = get_unused_fd(); if (fd >= 0) { @@ -959,6 +954,14 @@ asmlinkage long sys_open(const char __us } return fd; } + +asmlinkage long sys_open(const char __user *filename, int flags, int mode) +{ + if (force_o_largefile()) + flags |= O_LARGEFILE; + + return do_sys_open(filename, flags, mode); +} EXPORT_SYMBOL_GPL(sys_open); #ifndef __alpha__ diff -puN include/linux/fs.h~remove-duplicated-sys_open32-code-from-64bit-archs include/linux/fs.h --- devel/include/linux/fs.h~remove-duplicated-sys_open32-code-from-64bit-archs 2005-08-30 18:42:04.000000000 -0700 +++ devel-akpm/include/linux/fs.h 2005-08-30 18:42:04.000000000 -0700 @@ -1280,6 +1280,7 @@ static inline int break_lease(struct ino /* fs/open.c */ extern int do_truncate(struct dentry *, loff_t start); +extern long do_sys_open(const char __user *filename, int flags, int mode); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); extern int filp_close(struct file *, fl_owner_t id); _