aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/idmap.c6
-rw-r--r--include/linux/sunrpc/rpc_pipe_fs.h2
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c7
-rw-r--r--net/sunrpc/rpc_pipe.c38
4 files changed, 27 insertions, 26 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c
index f96dfac7dc9a..82ad7110a1c0 100644
--- a/fs/nfs/idmap.c
+++ b/fs/nfs/idmap.c
@@ -84,7 +84,6 @@ struct idmap_hashtable {
84}; 84};
85 85
86struct idmap { 86struct idmap {
87 char idmap_path[48];
88 struct dentry *idmap_dentry; 87 struct dentry *idmap_dentry;
89 wait_queue_head_t idmap_wq; 88 wait_queue_head_t idmap_wq;
90 struct idmap_msg idmap_im; 89 struct idmap_msg idmap_im;
@@ -119,10 +118,7 @@ nfs_idmap_new(struct nfs_client *clp)
119 if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL) 118 if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL)
120 return -ENOMEM; 119 return -ENOMEM;
121 120
122 snprintf(idmap->idmap_path, sizeof(idmap->idmap_path), 121 idmap->idmap_dentry = rpc_mkpipe(clp->cl_rpcclient->cl_dentry, "idmap",
123 "%s/idmap", clp->cl_rpcclient->cl_pathname);
124
125 idmap->idmap_dentry = rpc_mkpipe(idmap->idmap_path,
126 idmap, &idmap_upcall_ops, 0); 122 idmap, &idmap_upcall_ops, 0);
127 if (IS_ERR(idmap->idmap_dentry)) { 123 if (IS_ERR(idmap->idmap_dentry)) {
128 error = PTR_ERR(idmap->idmap_dentry); 124 error = PTR_ERR(idmap->idmap_dentry);
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h
index a481472c9484..a2eb9b4a9de3 100644
--- a/include/linux/sunrpc/rpc_pipe_fs.h
+++ b/include/linux/sunrpc/rpc_pipe_fs.h
@@ -43,7 +43,7 @@ extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);
43 43
44extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); 44extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *);
45extern int rpc_rmdir(struct dentry *); 45extern int rpc_rmdir(struct dentry *);
46extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); 46extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *, struct rpc_pipe_ops *, int flags);
47extern int rpc_unlink(struct dentry *); 47extern int rpc_unlink(struct dentry *);
48extern struct vfsmount *rpc_get_mount(void); 48extern struct vfsmount *rpc_get_mount(void);
49extern void rpc_put_mount(void); 49extern void rpc_put_mount(void);
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index ef1cf5b476c8..6eed3e166ba3 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -88,7 +88,6 @@ struct gss_auth {
88 struct list_head upcalls; 88 struct list_head upcalls;
89 struct rpc_clnt *client; 89 struct rpc_clnt *client;
90 struct dentry *dentry; 90 struct dentry *dentry;
91 char path[48];
92 spinlock_t lock; 91 spinlock_t lock;
93}; 92};
94 93
@@ -690,10 +689,8 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
690 if (err) 689 if (err)
691 goto err_put_mech; 690 goto err_put_mech;
692 691
693 snprintf(gss_auth->path, sizeof(gss_auth->path), "%s/%s", 692 gss_auth->dentry = rpc_mkpipe(clnt->cl_dentry, gss_auth->mech->gm_name,
694 clnt->cl_pathname, 693 clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
695 gss_auth->mech->gm_name);
696 gss_auth->dentry = rpc_mkpipe(gss_auth->path, clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
697 if (IS_ERR(gss_auth->dentry)) { 694 if (IS_ERR(gss_auth->dentry)) {
698 err = PTR_ERR(gss_auth->dentry); 695 err = PTR_ERR(gss_auth->dentry);
699 goto err_put_mech; 696 goto err_put_mech;
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index c21dc07f2a8c..11ec12a09d70 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -621,17 +621,13 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)
621} 621}
622 622
623static struct dentry * 623static struct dentry *
624rpc_lookup_negative(char *path, struct nameidata *nd) 624rpc_lookup_create(struct dentry *parent, const char *name, int len)
625{ 625{
626 struct inode *dir = parent->d_inode;
626 struct dentry *dentry; 627 struct dentry *dentry;
627 struct inode *dir;
628 int error;
629 628
630 if ((error = rpc_lookup_parent(path, nd)) != 0)
631 return ERR_PTR(error);
632 dir = nd->dentry->d_inode;
633 mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); 629 mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
634 dentry = lookup_one_len(nd->last.name, nd->dentry, nd->last.len); 630 dentry = lookup_one_len(name, parent, len);
635 if (IS_ERR(dentry)) 631 if (IS_ERR(dentry))
636 goto out_err; 632 goto out_err;
637 if (dentry->d_inode) { 633 if (dentry->d_inode) {
@@ -642,7 +638,20 @@ rpc_lookup_negative(char *path, struct nameidata *nd)
642 return dentry; 638 return dentry;
643out_err: 639out_err:
644 mutex_unlock(&dir->i_mutex); 640 mutex_unlock(&dir->i_mutex);
645 rpc_release_path(nd); 641 return dentry;
642}
643
644static struct dentry *
645rpc_lookup_negative(char *path, struct nameidata *nd)
646{
647 struct dentry *dentry;
648 int error;
649
650 if ((error = rpc_lookup_parent(path, nd)) != 0)
651 return ERR_PTR(error);
652 dentry = rpc_lookup_create(nd->dentry, nd->last.name, nd->last.len);
653 if (IS_ERR(dentry))
654 rpc_release_path(nd);
646 return dentry; 655 return dentry;
647} 656}
648 657
@@ -701,17 +710,16 @@ rpc_rmdir(struct dentry *dentry)
701} 710}
702 711
703struct dentry * 712struct dentry *
704rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) 713rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pipe_ops *ops, int flags)
705{ 714{
706 struct nameidata nd;
707 struct dentry *dentry; 715 struct dentry *dentry;
708 struct inode *dir, *inode; 716 struct inode *dir, *inode;
709 struct rpc_inode *rpci; 717 struct rpc_inode *rpci;
710 718
711 dentry = rpc_lookup_negative(path, &nd); 719 dentry = rpc_lookup_create(parent, name, strlen(name));
712 if (IS_ERR(dentry)) 720 if (IS_ERR(dentry))
713 return dentry; 721 return dentry;
714 dir = nd.dentry->d_inode; 722 dir = parent->d_inode;
715 inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR); 723 inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR);
716 if (!inode) 724 if (!inode)
717 goto err_dput; 725 goto err_dput;
@@ -726,13 +734,13 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags)
726 dget(dentry); 734 dget(dentry);
727out: 735out:
728 mutex_unlock(&dir->i_mutex); 736 mutex_unlock(&dir->i_mutex);
729 rpc_release_path(&nd);
730 return dentry; 737 return dentry;
731err_dput: 738err_dput:
732 dput(dentry); 739 dput(dentry);
733 dentry = ERR_PTR(-ENOMEM); 740 dentry = ERR_PTR(-ENOMEM);
734 printk(KERN_WARNING "%s: %s() failed to create pipe %s (errno = %d)\n", 741 printk(KERN_WARNING "%s: %s() failed to create pipe %s/%s (errno = %d)\n",
735 __FILE__, __FUNCTION__, path, -ENOMEM); 742 __FILE__, __FUNCTION__, parent->d_name.name, name,
743 -ENOMEM);
736 goto out; 744 goto out;
737} 745}
738 746