aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2005-11-09 00:35:06 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-09 10:56:00 -0500
commit49705b7743fd8f5632a95ec4c6547d169d27ac1f (patch)
treeb209b1f94bfcfee522c44d2abef1cdb196219a52
parent8c744fb83da0771afa04695028e3550b798dad90 (diff)
[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>
-rw-r--r--Documentation/feature-removal-schedule.txt7
-rw-r--r--fs/namei.c20
-rw-r--r--include/linux/namei.h2
-rw-r--r--net/sunrpc/rpc_pipe.c6
4 files changed, 21 insertions, 14 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index 910cc9998731..66e4ca28fc0a 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -118,3 +118,10 @@ Why: This interface has been obsoleted by the new layer3-independent
118 to link against API-compatible library on top of libnfnetlink_queue 118 to link against API-compatible library on top of libnfnetlink_queue
119 instead of the current 'libipq'. 119 instead of the current 'libipq'.
120Who: Harald Welte <laforge@netfilter.org> 120Who: Harald Welte <laforge@netfilter.org>
121
122---------------------------
123
124What: EXPORT_SYMBOL(lookup_hash)
125When: January 2006
126Why: Too low-level interface. Use lookup_one_len or lookup_create instead.
127Who: Christoph Hellwig <hch@lst.de>
diff --git a/fs/namei.c b/fs/namei.c
index b69f6ebadb95..f02ec0e50fca 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1204,9 +1204,9 @@ out:
1204 return dentry; 1204 return dentry;
1205} 1205}
1206 1206
1207struct dentry * lookup_hash(struct qstr *name, struct dentry * base) 1207struct dentry * lookup_hash(struct nameidata *nd)
1208{ 1208{
1209 return __lookup_hash(name, base, NULL); 1209 return __lookup_hash(&nd->last, nd->dentry, nd);
1210} 1210}
1211 1211
1212/* SMP-safe */ 1212/* SMP-safe */
@@ -1230,7 +1230,7 @@ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
1230 } 1230 }
1231 this.hash = end_name_hash(hash); 1231 this.hash = end_name_hash(hash);
1232 1232
1233 return lookup_hash(&this, base); 1233 return __lookup_hash(&this, base, NULL);
1234access: 1234access:
1235 return ERR_PTR(-EACCES); 1235 return ERR_PTR(-EACCES);
1236} 1236}
@@ -1563,7 +1563,7 @@ int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
1563 dir = nd->dentry; 1563 dir = nd->dentry;
1564 nd->flags &= ~LOOKUP_PARENT; 1564 nd->flags &= ~LOOKUP_PARENT;
1565 down(&dir->d_inode->i_sem); 1565 down(&dir->d_inode->i_sem);
1566 path.dentry = __lookup_hash(&nd->last, nd->dentry, nd); 1566 path.dentry = lookup_hash(nd);
1567 path.mnt = nd->mnt; 1567 path.mnt = nd->mnt;
1568 1568
1569do_last: 1569do_last:
@@ -1665,7 +1665,7 @@ do_link:
1665 } 1665 }
1666 dir = nd->dentry; 1666 dir = nd->dentry;
1667 down(&dir->d_inode->i_sem); 1667 down(&dir->d_inode->i_sem);
1668 path.dentry = __lookup_hash(&nd->last, nd->dentry, nd); 1668 path.dentry = lookup_hash(nd);
1669 path.mnt = nd->mnt; 1669 path.mnt = nd->mnt;
1670 __putname(nd->last.name); 1670 __putname(nd->last.name);
1671 goto do_last; 1671 goto do_last;
@@ -1697,7 +1697,7 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
1697 /* 1697 /*
1698 * Do the final lookup. 1698 * Do the final lookup.
1699 */ 1699 */
1700 dentry = lookup_hash(&nd->last, nd->dentry); 1700 dentry = lookup_hash(nd);
1701 if (IS_ERR(dentry)) 1701 if (IS_ERR(dentry))
1702 goto fail; 1702 goto fail;
1703 1703
@@ -1932,7 +1932,7 @@ asmlinkage long sys_rmdir(const char __user * pathname)
1932 goto exit1; 1932 goto exit1;
1933 } 1933 }
1934 down(&nd.dentry->d_inode->i_sem); 1934 down(&nd.dentry->d_inode->i_sem);
1935 dentry = lookup_hash(&nd.last, nd.dentry); 1935 dentry = lookup_hash(&nd);
1936 error = PTR_ERR(dentry); 1936 error = PTR_ERR(dentry);
1937 if (!IS_ERR(dentry)) { 1937 if (!IS_ERR(dentry)) {
1938 error = vfs_rmdir(nd.dentry->d_inode, dentry); 1938 error = vfs_rmdir(nd.dentry->d_inode, dentry);
@@ -2001,7 +2001,7 @@ asmlinkage long sys_unlink(const char __user * pathname)
2001 if (nd.last_type != LAST_NORM) 2001 if (nd.last_type != LAST_NORM)
2002 goto exit1; 2002 goto exit1;
2003 down(&nd.dentry->d_inode->i_sem); 2003 down(&nd.dentry->d_inode->i_sem);
2004 dentry = lookup_hash(&nd.last, nd.dentry); 2004 dentry = lookup_hash(&nd);
2005 error = PTR_ERR(dentry); 2005 error = PTR_ERR(dentry);
2006 if (!IS_ERR(dentry)) { 2006 if (!IS_ERR(dentry)) {
2007 /* Why not before? Because we want correct error value */ 2007 /* Why not before? Because we want correct error value */
@@ -2344,7 +2344,7 @@ static inline int do_rename(const char * oldname, const char * newname)
2344 2344
2345 trap = lock_rename(new_dir, old_dir); 2345 trap = lock_rename(new_dir, old_dir);
2346 2346
2347 old_dentry = lookup_hash(&oldnd.last, old_dir); 2347 old_dentry = lookup_hash(&oldnd);
2348 error = PTR_ERR(old_dentry); 2348 error = PTR_ERR(old_dentry);
2349 if (IS_ERR(old_dentry)) 2349 if (IS_ERR(old_dentry))
2350 goto exit3; 2350 goto exit3;
@@ -2364,7 +2364,7 @@ static inline int do_rename(const char * oldname, const char * newname)
2364 error = -EINVAL; 2364 error = -EINVAL;
2365 if (old_dentry == trap) 2365 if (old_dentry == trap)
2366 goto exit4; 2366 goto exit4;
2367 new_dentry = lookup_hash(&newnd.last, new_dir); 2367 new_dentry = lookup_hash(&newnd);
2368 error = PTR_ERR(new_dentry); 2368 error = PTR_ERR(new_dentry);
2369 if (IS_ERR(new_dentry)) 2369 if (IS_ERR(new_dentry))
2370 goto exit4; 2370 goto exit4;
diff --git a/include/linux/namei.h b/include/linux/namei.h
index 1c975d0d9e94..455660eafba9 100644
--- a/include/linux/namei.h
+++ b/include/linux/namei.h
@@ -74,7 +74,7 @@ extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
74extern void release_open_intent(struct nameidata *); 74extern void release_open_intent(struct nameidata *);
75 75
76extern struct dentry * lookup_one_len(const char *, struct dentry *, int); 76extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
77extern struct dentry * lookup_hash(struct qstr *, struct dentry *); 77extern struct dentry * lookup_hash(struct nameidata *);
78 78
79extern int follow_down(struct vfsmount **, struct dentry **); 79extern int follow_down(struct vfsmount **, struct dentry **);
80extern int follow_up(struct vfsmount **, struct dentry **); 80extern int follow_up(struct vfsmount **, struct dentry **);
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 4f188d0a5d11..81e00a6c19de 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -603,7 +603,7 @@ rpc_lookup_negative(char *path, struct nameidata *nd)
603 return ERR_PTR(error); 603 return ERR_PTR(error);
604 dir = nd->dentry->d_inode; 604 dir = nd->dentry->d_inode;
605 down(&dir->i_sem); 605 down(&dir->i_sem);
606 dentry = lookup_hash(&nd->last, nd->dentry); 606 dentry = lookup_hash(nd);
607 if (IS_ERR(dentry)) 607 if (IS_ERR(dentry))
608 goto out_err; 608 goto out_err;
609 if (dentry->d_inode) { 609 if (dentry->d_inode) {
@@ -665,7 +665,7 @@ rpc_rmdir(char *path)
665 return error; 665 return error;
666 dir = nd.dentry->d_inode; 666 dir = nd.dentry->d_inode;
667 down(&dir->i_sem); 667 down(&dir->i_sem);
668 dentry = lookup_hash(&nd.last, nd.dentry); 668 dentry = lookup_hash(&nd);
669 if (IS_ERR(dentry)) { 669 if (IS_ERR(dentry)) {
670 error = PTR_ERR(dentry); 670 error = PTR_ERR(dentry);
671 goto out_release; 671 goto out_release;
@@ -726,7 +726,7 @@ rpc_unlink(char *path)
726 return error; 726 return error;
727 dir = nd.dentry->d_inode; 727 dir = nd.dentry->d_inode;
728 down(&dir->i_sem); 728 down(&dir->i_sem);
729 dentry = lookup_hash(&nd.last, nd.dentry); 729 dentry = lookup_hash(&nd);
730 if (IS_ERR(dentry)) { 730 if (IS_ERR(dentry)) {
731 error = PTR_ERR(dentry); 731 error = PTR_ERR(dentry);
732 goto out_release; 732 goto out_release;