mirror of
https://github.com/joel16/android_kernel_sony_msm8994.git
synced 2024-11-28 22:51:06 +00:00
[PATCH] remove duplicated sys_open32() code from 64bit archs
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>
This commit is contained in:
parent
ab8d11beb4
commit
e922efc342
@ -215,7 +215,7 @@ ia32_syscall_table:
|
|||||||
data8 sys32_fork
|
data8 sys32_fork
|
||||||
data8 sys_read
|
data8 sys_read
|
||||||
data8 sys_write
|
data8 sys_write
|
||||||
data8 sys32_open /* 5 */
|
data8 compat_sys_open /* 5 */
|
||||||
data8 sys_close
|
data8 sys_close
|
||||||
data8 sys32_waitpid
|
data8 sys32_waitpid
|
||||||
data8 sys_creat
|
data8 sys_creat
|
||||||
|
@ -2359,37 +2359,6 @@ sys32_brk (unsigned int brk)
|
|||||||
return ret;
|
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 */
|
/* Structure for ia32 emulation on ia64 */
|
||||||
struct epoll_event32
|
struct epoll_event32
|
||||||
{
|
{
|
||||||
|
@ -957,7 +957,7 @@ _GLOBAL(sys_call_table32)
|
|||||||
.llong .ppc_fork
|
.llong .ppc_fork
|
||||||
.llong .sys_read
|
.llong .sys_read
|
||||||
.llong .sys_write
|
.llong .sys_write
|
||||||
.llong .sys32_open /* 5 */
|
.llong .compat_sys_open /* 5 */
|
||||||
.llong .sys_close
|
.llong .sys_close
|
||||||
.llong .sys32_waitpid
|
.llong .sys32_waitpid
|
||||||
.llong .sys32_creat
|
.llong .sys32_creat
|
||||||
|
@ -867,37 +867,6 @@ off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin)
|
|||||||
return sys_lseek(fd, (int)offset, 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,
|
/* Note: it is necessary to treat bufsiz as an unsigned int,
|
||||||
* with the corresponding cast to a signed int to insure that the
|
* 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)
|
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
|
||||||
|
@ -1002,29 +1002,7 @@ asmlinkage long sys32_adjtimex(struct timex32 __user *utp)
|
|||||||
asmlinkage long sparc32_open(const char __user *filename,
|
asmlinkage long sparc32_open(const char __user *filename,
|
||||||
int flags, int mode)
|
int flags, int mode)
|
||||||
{
|
{
|
||||||
char * tmp;
|
return do_sys_open(filename, flags, mode);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unsigned long do_mremap(unsigned long addr,
|
extern unsigned long do_mremap(unsigned long addr,
|
||||||
|
@ -307,7 +307,7 @@ ia32_sys_call_table:
|
|||||||
.quad stub32_fork
|
.quad stub32_fork
|
||||||
.quad sys_read
|
.quad sys_read
|
||||||
.quad sys_write
|
.quad sys_write
|
||||||
.quad sys32_open /* 5 */
|
.quad compat_sys_open /* 5 */
|
||||||
.quad sys_close
|
.quad sys_close
|
||||||
.quad sys32_waitpid
|
.quad sys32_waitpid
|
||||||
.quad sys_creat
|
.quad sys_creat
|
||||||
|
@ -969,32 +969,6 @@ long sys32_kill(int pid, int sig)
|
|||||||
return sys_kill(pid, 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
|
extern asmlinkage long
|
||||||
sys_timer_create(clockid_t which_clock,
|
sys_timer_create(clockid_t which_clock,
|
||||||
struct sigevent __user *timer_event_spec,
|
struct sigevent __user *timer_event_spec,
|
||||||
|
10
fs/compat.c
10
fs/compat.c
@ -1274,6 +1274,16 @@ out:
|
|||||||
return ret;
|
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
|
* 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
|
* a copy of count() from fs/exec.c, except that it works with 32 bit argv
|
||||||
|
19
fs/open.c
19
fs/open.c
@ -933,16 +933,11 @@ void fastcall fd_install(unsigned int fd, struct file * file)
|
|||||||
|
|
||||||
EXPORT_SYMBOL(fd_install);
|
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;
|
char *tmp = getname(filename);
|
||||||
int fd;
|
int fd = PTR_ERR(tmp);
|
||||||
|
|
||||||
if (force_o_largefile())
|
|
||||||
flags |= O_LARGEFILE;
|
|
||||||
|
|
||||||
tmp = getname(filename);
|
|
||||||
fd = PTR_ERR(tmp);
|
|
||||||
if (!IS_ERR(tmp)) {
|
if (!IS_ERR(tmp)) {
|
||||||
fd = get_unused_fd();
|
fd = get_unused_fd();
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
@ -959,6 +954,14 @@ asmlinkage long sys_open(const char __user * filename, int flags, int mode)
|
|||||||
}
|
}
|
||||||
return fd;
|
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);
|
EXPORT_SYMBOL_GPL(sys_open);
|
||||||
|
|
||||||
#ifndef __alpha__
|
#ifndef __alpha__
|
||||||
|
@ -1280,6 +1280,7 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
|
|||||||
/* fs/open.c */
|
/* fs/open.c */
|
||||||
|
|
||||||
extern int do_truncate(struct dentry *, loff_t start);
|
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 *filp_open(const char *, int, int);
|
||||||
extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
|
extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
|
||||||
extern int filp_close(struct file *, fl_owner_t id);
|
extern int filp_close(struct file *, fl_owner_t id);
|
||||||
|
Loading…
Reference in New Issue
Block a user