mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
[PATCH] sanitize lookup_hash prototype
->permission and ->lookup have a struct nameidata * argument these days to pass down lookup intents. Unfortunately some callers of lookup_hash don't actually pass this one down. For lookup_one_len() we don't have a struct nameidata to pass down, but as this function is a library function only used by filesystem code this is an acceptable limitation. All other callers should pass down the nameidata, so this patch changes the lookup_hash interface to only take a struct nameidata argument and derives the other two arguments to __lookup_hash from it. All callers already have the nameidata argument available so this is not a problem. At the same time I'd like to deprecate the lookup_hash interface as there are better exported interfaces for filesystem usage. Before it can actually be removed I need to fix up rpc_pipefs. Signed-off-by: Christoph Hellwig <hch@lst.de> Cc: Ram Pai <linuxram@us.ibm.com> Cc: Jeff Mahoney <jeffm@suse.com> Cc: Al Viro <viro@ftp.linux.org.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
8c744fb83d
commit
49705b7743
4 changed files with 21 additions and 14 deletions
|
@ -118,3 +118,10 @@ Why: This interface has been obsoleted by the new layer3-independent
|
|||
to link against API-compatible library on top of libnfnetlink_queue
|
||||
instead of the current 'libipq'.
|
||||
Who: Harald Welte <laforge@netfilter.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: EXPORT_SYMBOL(lookup_hash)
|
||||
When: January 2006
|
||||
Why: Too low-level interface. Use lookup_one_len or lookup_create instead.
|
||||
Who: Christoph Hellwig <hch@lst.de>
|
||||
|
|
20
fs/namei.c
20
fs/namei.c
|
@ -1204,9 +1204,9 @@ static struct dentry * __lookup_hash(struct qstr *name, struct dentry * base, st
|
|||
return dentry;
|
||||
}
|
||||
|
||||
struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
|
||||
struct dentry * lookup_hash(struct nameidata *nd)
|
||||
{
|
||||
return __lookup_hash(name, base, NULL);
|
||||
return __lookup_hash(&nd->last, nd->dentry, nd);
|
||||
}
|
||||
|
||||
/* SMP-safe */
|
||||
|
@ -1230,7 +1230,7 @@ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
|
|||
}
|
||||
this.hash = end_name_hash(hash);
|
||||
|
||||
return lookup_hash(&this, base);
|
||||
return __lookup_hash(&this, base, NULL);
|
||||
access:
|
||||
return ERR_PTR(-EACCES);
|
||||
}
|
||||
|
@ -1563,7 +1563,7 @@ int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
|
|||
dir = nd->dentry;
|
||||
nd->flags &= ~LOOKUP_PARENT;
|
||||
down(&dir->d_inode->i_sem);
|
||||
path.dentry = __lookup_hash(&nd->last, nd->dentry, nd);
|
||||
path.dentry = lookup_hash(nd);
|
||||
path.mnt = nd->mnt;
|
||||
|
||||
do_last:
|
||||
|
@ -1665,7 +1665,7 @@ int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
|
|||
}
|
||||
dir = nd->dentry;
|
||||
down(&dir->d_inode->i_sem);
|
||||
path.dentry = __lookup_hash(&nd->last, nd->dentry, nd);
|
||||
path.dentry = lookup_hash(nd);
|
||||
path.mnt = nd->mnt;
|
||||
__putname(nd->last.name);
|
||||
goto do_last;
|
||||
|
@ -1697,7 +1697,7 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
|
|||
/*
|
||||
* Do the final lookup.
|
||||
*/
|
||||
dentry = lookup_hash(&nd->last, nd->dentry);
|
||||
dentry = lookup_hash(nd);
|
||||
if (IS_ERR(dentry))
|
||||
goto fail;
|
||||
|
||||
|
@ -1932,7 +1932,7 @@ asmlinkage long sys_rmdir(const char __user * pathname)
|
|||
goto exit1;
|
||||
}
|
||||
down(&nd.dentry->d_inode->i_sem);
|
||||
dentry = lookup_hash(&nd.last, nd.dentry);
|
||||
dentry = lookup_hash(&nd);
|
||||
error = PTR_ERR(dentry);
|
||||
if (!IS_ERR(dentry)) {
|
||||
error = vfs_rmdir(nd.dentry->d_inode, dentry);
|
||||
|
@ -2001,7 +2001,7 @@ asmlinkage long sys_unlink(const char __user * pathname)
|
|||
if (nd.last_type != LAST_NORM)
|
||||
goto exit1;
|
||||
down(&nd.dentry->d_inode->i_sem);
|
||||
dentry = lookup_hash(&nd.last, nd.dentry);
|
||||
dentry = lookup_hash(&nd);
|
||||
error = PTR_ERR(dentry);
|
||||
if (!IS_ERR(dentry)) {
|
||||
/* Why not before? Because we want correct error value */
|
||||
|
@ -2344,7 +2344,7 @@ static inline int do_rename(const char * oldname, const char * newname)
|
|||
|
||||
trap = lock_rename(new_dir, old_dir);
|
||||
|
||||
old_dentry = lookup_hash(&oldnd.last, old_dir);
|
||||
old_dentry = lookup_hash(&oldnd);
|
||||
error = PTR_ERR(old_dentry);
|
||||
if (IS_ERR(old_dentry))
|
||||
goto exit3;
|
||||
|
@ -2364,7 +2364,7 @@ static inline int do_rename(const char * oldname, const char * newname)
|
|||
error = -EINVAL;
|
||||
if (old_dentry == trap)
|
||||
goto exit4;
|
||||
new_dentry = lookup_hash(&newnd.last, new_dir);
|
||||
new_dentry = lookup_hash(&newnd);
|
||||
error = PTR_ERR(new_dentry);
|
||||
if (IS_ERR(new_dentry))
|
||||
goto exit4;
|
||||
|
|
|
@ -74,7 +74,7 @@ extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
|
|||
extern void release_open_intent(struct nameidata *);
|
||||
|
||||
extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
|
||||
extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
|
||||
extern struct dentry * lookup_hash(struct nameidata *);
|
||||
|
||||
extern int follow_down(struct vfsmount **, struct dentry **);
|
||||
extern int follow_up(struct vfsmount **, struct dentry **);
|
||||
|
|
|
@ -603,7 +603,7 @@ rpc_lookup_negative(char *path, struct nameidata *nd)
|
|||
return ERR_PTR(error);
|
||||
dir = nd->dentry->d_inode;
|
||||
down(&dir->i_sem);
|
||||
dentry = lookup_hash(&nd->last, nd->dentry);
|
||||
dentry = lookup_hash(nd);
|
||||
if (IS_ERR(dentry))
|
||||
goto out_err;
|
||||
if (dentry->d_inode) {
|
||||
|
@ -665,7 +665,7 @@ rpc_rmdir(char *path)
|
|||
return error;
|
||||
dir = nd.dentry->d_inode;
|
||||
down(&dir->i_sem);
|
||||
dentry = lookup_hash(&nd.last, nd.dentry);
|
||||
dentry = lookup_hash(&nd);
|
||||
if (IS_ERR(dentry)) {
|
||||
error = PTR_ERR(dentry);
|
||||
goto out_release;
|
||||
|
@ -726,7 +726,7 @@ rpc_unlink(char *path)
|
|||
return error;
|
||||
dir = nd.dentry->d_inode;
|
||||
down(&dir->i_sem);
|
||||
dentry = lookup_hash(&nd.last, nd.dentry);
|
||||
dentry = lookup_hash(&nd);
|
||||
if (IS_ERR(dentry)) {
|
||||
error = PTR_ERR(dentry);
|
||||
goto out_release;
|
||||
|
|
Loading…
Reference in a new issue