VFS: introduce lookup_one_len_nd
authorErez Zadok <ezk@cs.sunysb.edu>
Thu, 28 Apr 2011 06:12:55 +0000 (02:12 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Thu, 16 Jun 2011 22:48:44 +0000 (15:48 -0700)
Just like lookup_one_len() but passes a nameidata parameter, which is now
required by NFS3, else you get an oops.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/namei.c
include/linux/namei.h

index 6f7c1da04a8790e1e77abdb4b687a7b83acf26fe..db2a6743fdfd9a709d1a898376ddbfcd57718c27 100644 (file)
@@ -1896,6 +1896,22 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
        return __lookup_hash(&this, base, NULL);
 }
 
+/* pass nameidata from caller (useful for NFS) */
+struct dentry *lookup_one_len_nd(const char *name, struct dentry *base,
+                                int len, struct nameidata *nd)
+{
+       int err;
+       struct qstr this;
+
+       WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex));
+
+       err = __lookup_one_len(name, &this, base, len);
+       if (err)
+               return ERR_PTR(err);
+
+       return __lookup_hash(&this, base, nd);
+}
+
 int user_path_at(int dfd, const char __user *name, unsigned flags,
                 struct path *path)
 {
@@ -3582,6 +3598,7 @@ EXPORT_SYMBOL(get_write_access); /* binfmt_aout */
 EXPORT_SYMBOL(getname);
 EXPORT_SYMBOL(lock_rename);
 EXPORT_SYMBOL(lookup_one_len);
+EXPORT_SYMBOL(lookup_one_len_nd);
 EXPORT_SYMBOL(page_follow_link_light);
 EXPORT_SYMBOL(page_put_link);
 EXPORT_SYMBOL(page_readlink);
index cf4ec6c12a37ebc0921deb4f31637423ae6dbc8f..c90e03b8ab288f33672b916d922407a1ee5ab619 100644 (file)
@@ -81,6 +81,8 @@ extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry
 extern void release_open_intent(struct nameidata *);
 
 extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
+extern struct dentry *lookup_one_len_nd(const char *, struct dentry *, int,
+                                     struct nameidata *nd);
 
 extern int follow_down_one(struct path *);
 extern int follow_down(struct path *, bool);