NFSv3: try get_root user-supplied security_flavor
Thanks to Ed Keizer for bug and root cause. He says: "... we could only mount the top-level Solaris share. We could not mount deeper into the tree. Investigation showed that Solaris allows UNIX authenticated FSINFO only on the top level of the share. This is a problem because we share/export our home directories one level higher than we mount them. I.e. we share the partition and not the individual home directories. This prevented access to home directories." We still may need to try auth_sys for the case where the client doesn't have appropriate credentials. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
a659753ecc
commit
03c2173393
1 changed files with 20 additions and 8 deletions
|
@ -68,6 +68,23 @@ nfs3_async_handle_jukebox(struct rpc_task *task)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
|
||||||
|
struct nfs_fsinfo *info)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
dprintk("%s: call fsinfo\n", __FUNCTION__);
|
||||||
|
nfs_fattr_init(info->fattr);
|
||||||
|
status = rpc_call(client, NFS3PROC_FSINFO, fhandle, info, 0);
|
||||||
|
dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status);
|
||||||
|
if (!(info->fattr->valid & NFS_ATTR_FATTR)) {
|
||||||
|
status = rpc_call(client, NFS3PROC_GETATTR, fhandle, info->fattr, 0);
|
||||||
|
dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bare-bones access to getattr: this is for nfs_read_super.
|
* Bare-bones access to getattr: this is for nfs_read_super.
|
||||||
*/
|
*/
|
||||||
|
@ -77,14 +94,9 @@ nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
dprintk("%s: call fsinfo\n", __FUNCTION__);
|
status = do_proc_get_root(server->client, fhandle, info);
|
||||||
nfs_fattr_init(info->fattr);
|
if (status && server->client_sys != server->client)
|
||||||
status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0);
|
status = do_proc_get_root(server->client_sys, fhandle, info);
|
||||||
dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status);
|
|
||||||
if (!(info->fattr->valid & NFS_ATTR_FATTR)) {
|
|
||||||
status = rpc_call(server->client_sys, NFS3PROC_GETATTR, fhandle, info->fattr, 0);
|
|
||||||
dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
|
|
||||||
}
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue