Skip to content

Commit

Permalink
[PATCH] remove duplicated sys_open32() code from 64bit archs
Browse files Browse the repository at this point in the history
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 <miklos@szeredi.hu>
Cc: <viro@parcelfarce.linux.theplanet.co.uk>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Miklos Szeredi authored and Linus Torvalds committed Sep 7, 2005
1 parent ab8d11b commit e922efc
Show file tree
Hide file tree
Showing 10 changed files with 26 additions and 122 deletions.
2 changes: 1 addition & 1 deletion arch/ia64/ia32/ia32_entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 0 additions & 31 deletions arch/ia64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -2359,37 +2359,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
{
Expand Down
2 changes: 1 addition & 1 deletion arch/ppc64/kernel/misc.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 0 additions & 31 deletions arch/ppc64/kernel/sys_ppc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,37 +867,6 @@ off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin)
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)
Expand Down
24 changes: 1 addition & 23 deletions arch/sparc64/kernel/sys_sparc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,29 +1002,7 @@ asmlinkage long sys32_adjtimex(struct timex32 __user *utp)
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,
Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/ia32/ia32entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,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
Expand Down
26 changes: 0 additions & 26 deletions arch/x86_64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 10 additions & 0 deletions fs/compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,6 +1274,16 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig
return ret;
}

/*
* 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
Expand Down
19 changes: 11 additions & 8 deletions fs/open.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,16 +933,11 @@ void fastcall fd_install(unsigned int fd, struct file * file)

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) {
Expand All @@ -959,6 +954,14 @@ asmlinkage long sys_open(const char __user * filename, int flags, int mode)
}
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__
Expand Down
1 change: 1 addition & 0 deletions include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,7 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
/* 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);
Expand Down

0 comments on commit e922efc

Please sign in to comment.