diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-08-09 15:14:25 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-08-09 15:14:25 -0400 |
commit | 23ac6581702ac6d029643328a7e6ea3baf834c5e (patch) | |
tree | e960a371127a240f17971596e0c456ccc8f01b7e /net/sunrpc/rpc_pipe.c | |
parent | 7d217caca5d704e48aa5e59aba0b3ad4c7af4fd2 (diff) |
SUNRPC: clean up rpc_setup_pipedir()
There is still a little wart or two there: Since we've already got a
vfsmount, we might as well pass that in to rpc_create_client_dir.
Another point is that if we open code __rpc_lookup_path() here, then we can
avoid looking up the entire parent directory path over and over again: it
doesn't change.
Also get rid of rpc_clnt->cl_pathname, since it has no users...
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/rpc_pipe.c')
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 58 |
1 files changed, 3 insertions, 55 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 6d152f69587e..1613d858ba38 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -443,42 +443,6 @@ static const struct dentry_operations rpc_dentry_operations = { | |||
443 | .d_delete = rpc_delete_dentry, | 443 | .d_delete = rpc_delete_dentry, |
444 | }; | 444 | }; |
445 | 445 | ||
446 | static int __rpc_lookup_path(const char *pathname, unsigned flags, | ||
447 | struct nameidata *nd) | ||
448 | { | ||
449 | struct vfsmount *mnt; | ||
450 | |||
451 | if (pathname[0] == '\0') | ||
452 | return -ENOENT; | ||
453 | |||
454 | mnt = rpc_get_mount(); | ||
455 | if (IS_ERR(mnt)) { | ||
456 | printk(KERN_WARNING "%s: %s failed to mount " | ||
457 | "pseudofilesystem \n", __FILE__, __func__); | ||
458 | return PTR_ERR(mnt); | ||
459 | } | ||
460 | |||
461 | if (vfs_path_lookup(mnt->mnt_root, mnt, pathname, flags, nd)) { | ||
462 | printk(KERN_WARNING "%s: %s failed to find path %s\n", | ||
463 | __FILE__, __func__, pathname); | ||
464 | rpc_put_mount(); | ||
465 | return -ENOENT; | ||
466 | } | ||
467 | return 0; | ||
468 | } | ||
469 | |||
470 | static int rpc_lookup_parent(const char *pathname, struct nameidata *nd) | ||
471 | { | ||
472 | return __rpc_lookup_path(pathname, LOOKUP_PARENT, nd); | ||
473 | } | ||
474 | |||
475 | static void | ||
476 | rpc_release_path(struct nameidata *nd) | ||
477 | { | ||
478 | path_put(&nd->path); | ||
479 | rpc_put_mount(); | ||
480 | } | ||
481 | |||
482 | static struct inode * | 446 | static struct inode * |
483 | rpc_get_inode(struct super_block *sb, umode_t mode) | 447 | rpc_get_inode(struct super_block *sb, umode_t mode) |
484 | { | 448 | { |
@@ -889,27 +853,11 @@ EXPORT_SYMBOL_GPL(rpc_unlink); | |||
889 | * information about the client, together with any "pipes" that may | 853 | * information about the client, together with any "pipes" that may |
890 | * later be created using rpc_mkpipe(). | 854 | * later be created using rpc_mkpipe(). |
891 | */ | 855 | */ |
892 | struct dentry *rpc_create_client_dir(const char *path, | 856 | struct dentry *rpc_create_client_dir(struct dentry *dentry, |
857 | struct qstr *name, | ||
893 | struct rpc_clnt *rpc_client) | 858 | struct rpc_clnt *rpc_client) |
894 | { | 859 | { |
895 | struct nameidata nd; | 860 | return rpc_mkdir_populate(dentry, name, S_IRUGO | S_IXUGO, rpc_client); |
896 | struct dentry *ret; | ||
897 | struct inode *dir; | ||
898 | |||
899 | ret = ERR_PTR(rpc_lookup_parent(path, &nd)); | ||
900 | if (IS_ERR(ret)) | ||
901 | goto out_err; | ||
902 | dir = nd.path.dentry->d_inode; | ||
903 | |||
904 | ret = rpc_mkdir_populate(nd.path.dentry, &nd.last, | ||
905 | S_IRUGO | S_IXUGO, rpc_client); | ||
906 | rpc_release_path(&nd); | ||
907 | if (!IS_ERR(ret)) | ||
908 | return ret; | ||
909 | out_err: | ||
910 | printk(KERN_WARNING "%s: %s() failed to create directory %s (errno = %ld)\n", | ||
911 | __FILE__, __func__, path, PTR_ERR(ret)); | ||
912 | return ret; | ||
913 | } | 861 | } |
914 | 862 | ||
915 | /* | 863 | /* |