SUNRPC: pipefs dentry lookup helper introduced
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Mon, 26 Dec 2011 12:39:22 +0000 (15:39 +0300)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 31 Jan 2012 23:20:24 +0000 (18:20 -0500)
In all places, where pipefs dentries are created, only directory inode is
actually required to create new dentry. And all this directories has root
pipefs dentry as their parent. So we actually don't need this pipefs mount
point at all if some pipefs lookup method will be provided.
IOW, all we really need is just superblock and simple lookup method to find
root's child dentry with appropriate name. And this patch introduces this
method.
Note, that no locking implemented in rpc_d_lookup_sb(). So it can be used only
in case of assurance, that pipefs superblock still exist. IOW, we can use this
method only in pipefs mount-umount notification subscribers callbacks.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/rpc_pipe_fs.h
net/sunrpc/rpc_pipe.c

index d39782ce6c6739f528e6073a2a64343523f13b29..2f338223014159954cae0acc59283fa94823bf89 100644 (file)
@@ -51,6 +51,9 @@ enum {
        RPC_PIPEFS_UMOUNT,
 };
 
+extern struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
+                                     const unsigned char *dir_name);
+
 extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
                                       char __user *, size_t);
 extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);
index 58a5062df2606d7e5e60fb89d75cfb6633b11736..6f295e6c12a0f98a8d98f06965ef15bc45c655d3 100644 (file)
@@ -1007,6 +1007,22 @@ static const struct rpc_filelist files[] = {
        },
 };
 
+/*
+ * This call can be used only in RPC pipefs mount notification hooks.
+ */
+struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
+                              const unsigned char *dir_name)
+{
+       struct qstr dir = {
+               .name = dir_name,
+               .len = strlen(dir_name),
+               .hash = full_name_hash(dir_name, strlen(dir_name)),
+       };
+
+       return d_lookup(sb->s_root, &dir);
+}
+EXPORT_SYMBOL_GPL(rpc_d_lookup_sb);
+
 static int
 rpc_fill_super(struct super_block *sb, void *data, int silent)
 {