Commit ef3daeda authored by Yoav Zach's avatar Yoav Zach Committed by Linus Torvalds

[PATCH] Don't force O_LARGEFILE for 32 bit processes on ia64

In ia64 kernel, the O_LARGEFILE flag is forced when opening a file.  This
is problematic for execution of 32 bit processes, which are not largefile
aware, either by SW emulation or by HW execution.

For such processes, the problem is two-fold:

1) When trying to open a file that is larger than 4G
   the operation should fail, but it's not
2) Writing to offset larger than 4G should fail, but
   it's not

The proposed patch takes advantage of the way 32 bit processes are
identified in ia64 systems.  Such processes have PER_LINUX32 for their
personality.  With the patch, the ia64 kernel will not enforce the
O_LARGEFILE flag if the current process has PER_LINUX32 set.  The behavior
for all other architectures remains unchanged.
Signed-off-by: default avatarYoav Zach <yoav.zach@intel.com>
Acked-by: default avatarTony Luck <tony.luck@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 44e58a6a
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/vfs.h> #include <linux/vfs.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/personality.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
...@@ -935,9 +936,9 @@ asmlinkage long sys_open(const char __user * filename, int flags, int mode) ...@@ -935,9 +936,9 @@ asmlinkage long sys_open(const char __user * filename, int flags, int mode)
char * tmp; char * tmp;
int fd, error; int fd, error;
#if BITS_PER_LONG != 32 if (force_o_largefile())
flags |= O_LARGEFILE; flags |= O_LARGEFILE;
#endif
tmp = getname(filename); tmp = getname(filename);
fd = PTR_ERR(tmp); fd = PTR_ERR(tmp);
if (!IS_ERR(tmp)) { if (!IS_ERR(tmp)) {
......
...@@ -81,4 +81,6 @@ struct flock { ...@@ -81,4 +81,6 @@ struct flock {
#define F_LINUX_SPECIFIC_BASE 1024 #define F_LINUX_SPECIFIC_BASE 1024
#define force_o_largefile() ( ! (current->personality & PER_LINUX32) )
#endif /* _ASM_IA64_FCNTL_H */ #endif /* _ASM_IA64_FCNTL_H */
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifndef force_o_largefile
#define force_o_largefile() (BITS_PER_LONG != 32)
#endif
#if BITS_PER_LONG == 32 #if BITS_PER_LONG == 32
#define IS_GETLK32(cmd) ((cmd) == F_GETLK) #define IS_GETLK32(cmd) ((cmd) == F_GETLK)
#define IS_SETLK32(cmd) ((cmd) == F_SETLK) #define IS_SETLK32(cmd) ((cmd) == F_SETLK)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment