From: Miklos Szeredi <mszeredi@suse.cz>
Currently callers of path_permission() either pass zero or
nameidata->flags as the flags argument. Passing lookup flags to
filesystems is completely unecessary, only the "intent" flags are
interesting.
More specifically nfs uses LOOKUP_ACCESS and LOOKUP_OPEN flags, while
fuse uses LOOKUP_ACCESS and LOOKUP_CHDIR flags.
So clean up path_permission() calls to just pass these flags.
In case of LOOKUP_CHDIR and LOOKUP_ACCESS the lookup routines need not
be passed these flags at all, they are only needed for the permission
checks.
Also remove the nameidata argument of may_create(). NFS doesn't need
LOOKUP_OPEN in this case, since it handles the creation checks on the
parent directory specially anyway.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
---
fs/exec.c | 4 ++--
fs/inotify_user.c | 2 +-
fs/namei.c | 25 +++++++++++--------------
fs/open.c | 15 +++++++--------
fs/utimes.c | 2 +-
net/unix/af_unix.c | 2 +-
6 files changed, 23 insertions(+), 27 deletions(-)
Index: linux-2.6/fs/exec.c
===================================================================
--- linux-2.6.orig/fs/exec.c 2008-05-21 18:15:02.000000000 +0200
+++ linux-2.6/fs/exec.c 2008-05-21 18:30:34.000000000 +0200
@@ -116,7 +116,7 @@ asmlinkage long sys_uselib(const char __
if (!S_ISREG(nd.path.dentry->d_inode->i_mode))
goto exit;
- error = path_permission(&nd.path, MAY_READ | MAY_EXEC, nd.flags);
+ error = path_permission(&nd.path, MAY_READ | MAY_EXEC, 0);
if (error)
goto exit;
@@ -664,7 +664,7 @@ struct file *open_exec(const char *name)
struct inode *inode = nd.path.dentry->d_inode;
file = ERR_PTR(-EACCES);
if (S_ISREG(inode->i_mode)) {
- int err = path_permission(&nd.path, MAY_EXEC, nd.flags);
+ int err = path_permission(&nd.path, MAY_EXEC, 0);
file = ERR_PTR(err);
if (!err) {
file = nameidata_to_filp(&nd,
Index: ...