diff options
Diffstat (limited to 'fs/nfs/namespace.c')
| -rw-r--r-- | fs/nfs/namespace.c | 103 | 
1 files changed, 19 insertions, 84 deletions
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index d51868e5683..08b9c93675d 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c @@ -26,11 +26,6 @@ static LIST_HEAD(nfs_automount_list);  static DECLARE_DELAYED_WORK(nfs_automount_task, nfs_expire_automounts);  int nfs_mountpoint_expiry_timeout = 500 * HZ; -static struct vfsmount *nfs_do_submount(struct dentry *dentry, -					struct nfs_fh *fh, -					struct nfs_fattr *fattr, -					rpc_authflavor_t authflavor); -  /*   * nfs_path - reconstruct the path given an arbitrary dentry   * @base - used to return pointer to the end of devname part of path @@ -118,64 +113,6 @@ Elong:  	return ERR_PTR(-ENAMETOOLONG);  } -#ifdef CONFIG_NFS_V4 -rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors) -{ -	struct gss_api_mech *mech; -	struct xdr_netobj oid; -	int i; -	rpc_authflavor_t pseudoflavor = RPC_AUTH_UNIX; - -	for (i = 0; i < flavors->num_flavors; i++) { -		struct nfs4_secinfo_flavor *flavor; -		flavor = &flavors->flavors[i]; - -		if (flavor->flavor == RPC_AUTH_NULL || flavor->flavor == RPC_AUTH_UNIX) { -			pseudoflavor = flavor->flavor; -			break; -		} else if (flavor->flavor == RPC_AUTH_GSS) { -			oid.len  = flavor->gss.sec_oid4.len; -			oid.data = flavor->gss.sec_oid4.data; -			mech = gss_mech_get_by_OID(&oid); -			if (!mech) -				continue; -			pseudoflavor = gss_svc_to_pseudoflavor(mech, flavor->gss.service); -			gss_mech_put(mech); -			break; -		} -	} - -	return pseudoflavor; -} - -static struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir, -					      struct qstr *name, -					      struct nfs_fh *fh, -					      struct nfs_fattr *fattr) -{ -	int err; - -	if (NFS_PROTO(dir)->version == 4) -		return nfs4_proc_lookup_mountpoint(dir, name, fh, fattr); - -	err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr); -	if (err) -		return ERR_PTR(err); -	return rpc_clone_client(NFS_SERVER(dir)->client); -} -#else /* CONFIG_NFS_V4 */ -static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir, -						     struct qstr *name, -						     struct nfs_fh *fh, -						     struct nfs_fattr *fattr) -{ -	int err = NFS_PROTO(dir)->lookup(NFS_SERVER(dir)->client, dir, name, fh, fattr); -	if (err) -		return ERR_PTR(err); -	return rpc_clone_client(NFS_SERVER(dir)->client); -} -#endif /* CONFIG_NFS_V4 */ -  /*   * nfs_d_automount - Handle crossing a mountpoint on the server   * @path - The mountpoint @@ -191,10 +128,9 @@ static inline struct rpc_clnt *nfs_lookup_mountpoint(struct inode *dir,  struct vfsmount *nfs_d_automount(struct path *path)  {  	struct vfsmount *mnt; -	struct dentry *parent; +	struct nfs_server *server = NFS_SERVER(path->dentry->d_inode);  	struct nfs_fh *fh = NULL;  	struct nfs_fattr *fattr = NULL; -	struct rpc_clnt *client;  	dprintk("--> nfs_d_automount()\n"); @@ -210,21 +146,7 @@ struct vfsmount *nfs_d_automount(struct path *path)  	dprintk("%s: enter\n", __func__); -	/* Look it up again to get its attributes */ -	parent = dget_parent(path->dentry); -	client = nfs_lookup_mountpoint(parent->d_inode, &path->dentry->d_name, fh, fattr); -	dput(parent); -	if (IS_ERR(client)) { -		mnt = ERR_CAST(client); -		goto out; -	} - -	if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) -		mnt = nfs_do_refmount(client, path->dentry); -	else -		mnt = nfs_do_submount(path->dentry, fh, fattr, client->cl_auth->au_flavor); -	rpc_shutdown_client(client); - +	mnt = server->nfs_client->rpc_ops->submount(server, path->dentry, fh, fattr);  	if (IS_ERR(mnt))  		goto out; @@ -297,10 +219,8 @@ static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server,   * @authflavor - security flavor to use when performing the mount   *   */ -static struct vfsmount *nfs_do_submount(struct dentry *dentry, -					struct nfs_fh *fh, -					struct nfs_fattr *fattr, -					rpc_authflavor_t authflavor) +struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh, +				 struct nfs_fattr *fattr, rpc_authflavor_t authflavor)  {  	struct nfs_clone_mount mountdata = {  		.sb = dentry->d_sb, @@ -333,3 +253,18 @@ out:  	dprintk("<-- nfs_do_submount() = %p\n", mnt);  	return mnt;  } + +struct vfsmount *nfs_submount(struct nfs_server *server, struct dentry *dentry, +			      struct nfs_fh *fh, struct nfs_fattr *fattr) +{ +	int err; +	struct dentry *parent = dget_parent(dentry); + +	/* Look it up again to get its attributes */ +	err = server->nfs_client->rpc_ops->lookup(parent->d_inode, &dentry->d_name, fh, fattr); +	dput(parent); +	if (err != 0) +		return ERR_PTR(err); + +	return nfs_do_submount(dentry, fh, fattr, server->client->cl_auth->au_flavor); +}  |