diff options
Diffstat (limited to 'net/sunrpc/rpc_pipe.c')
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 46 | 
1 files changed, 26 insertions, 20 deletions
| diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 0b1a1ac8a4bc..dfa504fe383f 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -327,10 +327,8 @@ rpc_show_info(struct seq_file *m, void *v)  	seq_printf(m, "RPC server: %s\n", clnt->cl_server);  	seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_protname,  			clnt->cl_prog, clnt->cl_vers); -	seq_printf(m, "address: %u.%u.%u.%u\n", -			NIPQUAD(clnt->cl_xprt->addr.sin_addr.s_addr)); -	seq_printf(m, "protocol: %s\n", -			clnt->cl_xprt->prot == IPPROTO_UDP ? "udp" : "tcp"); +	seq_printf(m, "address: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR)); +	seq_printf(m, "protocol: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_PROTO));  	return 0;  } @@ -623,17 +621,13 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)  }  static struct dentry * -rpc_lookup_negative(char *path, struct nameidata *nd) +rpc_lookup_create(struct dentry *parent, const char *name, int len)  { +	struct inode *dir = parent->d_inode;  	struct dentry *dentry; -	struct inode *dir; -	int error; -	if ((error = rpc_lookup_parent(path, nd)) != 0) -		return ERR_PTR(error); -	dir = nd->dentry->d_inode;  	mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); -	dentry = lookup_one_len(nd->last.name, nd->dentry, nd->last.len); +	dentry = lookup_one_len(name, parent, len);  	if (IS_ERR(dentry))  		goto out_err;  	if (dentry->d_inode) { @@ -644,7 +638,20 @@ rpc_lookup_negative(char *path, struct nameidata *nd)  	return dentry;  out_err:  	mutex_unlock(&dir->i_mutex); -	rpc_release_path(nd); +	return dentry; +} + +static struct dentry * +rpc_lookup_negative(char *path, struct nameidata *nd) +{ +	struct dentry *dentry; +	int error; + +	if ((error = rpc_lookup_parent(path, nd)) != 0) +		return ERR_PTR(error); +	dentry = rpc_lookup_create(nd->dentry, nd->last.name, nd->last.len); +	if (IS_ERR(dentry)) +		rpc_release_path(nd);  	return dentry;  } @@ -703,18 +710,17 @@ rpc_rmdir(struct dentry *dentry)  }  struct dentry * -rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) +rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pipe_ops *ops, int flags)  { -	struct nameidata nd;  	struct dentry *dentry;  	struct inode *dir, *inode;  	struct rpc_inode *rpci; -	dentry = rpc_lookup_negative(path, &nd); +	dentry = rpc_lookup_create(parent, name, strlen(name));  	if (IS_ERR(dentry))  		return dentry; -	dir = nd.dentry->d_inode; -	inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR); +	dir = parent->d_inode; +	inode = rpc_get_inode(dir->i_sb, S_IFIFO | S_IRUSR | S_IWUSR);  	if (!inode)  		goto err_dput;  	inode->i_ino = iunique(dir->i_sb, 100); @@ -728,13 +734,13 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags)  	dget(dentry);  out:  	mutex_unlock(&dir->i_mutex); -	rpc_release_path(&nd);  	return dentry;  err_dput:  	dput(dentry);  	dentry = ERR_PTR(-ENOMEM); -	printk(KERN_WARNING "%s: %s() failed to create pipe %s (errno = %d)\n", -			__FILE__, __FUNCTION__, path, -ENOMEM); +	printk(KERN_WARNING "%s: %s() failed to create pipe %s/%s (errno = %d)\n", +			__FILE__, __FUNCTION__, parent->d_name.name, name, +			-ENOMEM);  	goto out;  } | 
