[PATCH] sanitize lookup_hash prototype
Christoph Hellwig [Wed, 9 Nov 2005 05:35:06 +0000 (21:35 -0800)]
->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>

Documentation/feature-removal-schedule.txt
fs/namei.c
include/linux/namei.h
net/sunrpc/rpc_pipe.c

index 910cc99..66e4ca2 100644 (file)
@@ -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>
index b69f6eb..f02ec0e 100644 (file)
@@ -1204,9 +1204,9 @@ out:
        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 @@ do_link:
        }
        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;
index 1c975d0..455660e 100644 (file)
@@ -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 **);
index 4f188d0..81e00a6 100644 (file)
@@ -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;