diff options
author | J. Bruce Fields <bfields@fieldses.org> | 2006-01-03 03:55:48 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-06 14:58:55 -0500 |
commit | 03c21733938aad0758f5f88e1cc7ede69fc3c910 (patch) | |
tree | d6e7295cb3d325d1de975eb072b363212ba1f6e6 /fs/nfs/nfs3proc.c | |
parent | a659753ecc66945e9c69823fcbbe222b446c66d7 (diff) |
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>
Diffstat (limited to 'fs/nfs/nfs3proc.c')
-rw-r--r-- | fs/nfs/nfs3proc.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index c172a758464..ed67567f055 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c | |||
@@ -68,27 +68,39 @@ nfs3_async_handle_jukebox(struct rpc_task *task) | |||
68 | return 1; | 68 | return 1; |
69 | } | 69 | } |
70 | 70 | ||
71 | /* | ||
72 | * Bare-bones access to getattr: this is for nfs_read_super. | ||
73 | */ | ||
74 | static int | 71 | static int |
75 | nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, | 72 | do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle, |
76 | struct nfs_fsinfo *info) | 73 | struct nfs_fsinfo *info) |
77 | { | 74 | { |
78 | int status; | 75 | int status; |
79 | 76 | ||
80 | dprintk("%s: call fsinfo\n", __FUNCTION__); | 77 | dprintk("%s: call fsinfo\n", __FUNCTION__); |
81 | nfs_fattr_init(info->fattr); | 78 | nfs_fattr_init(info->fattr); |
82 | status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0); | 79 | status = rpc_call(client, NFS3PROC_FSINFO, fhandle, info, 0); |
83 | dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status); | 80 | dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status); |
84 | if (!(info->fattr->valid & NFS_ATTR_FATTR)) { | 81 | if (!(info->fattr->valid & NFS_ATTR_FATTR)) { |
85 | status = rpc_call(server->client_sys, NFS3PROC_GETATTR, fhandle, info->fattr, 0); | 82 | status = rpc_call(client, NFS3PROC_GETATTR, fhandle, info->fattr, 0); |
86 | dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); | 83 | dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); |
87 | } | 84 | } |
88 | return status; | 85 | return status; |
89 | } | 86 | } |
90 | 87 | ||
91 | /* | 88 | /* |
89 | * Bare-bones access to getattr: this is for nfs_read_super. | ||
90 | */ | ||
91 | static int | ||
92 | nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, | ||
93 | struct nfs_fsinfo *info) | ||
94 | { | ||
95 | int status; | ||
96 | |||
97 | status = do_proc_get_root(server->client, fhandle, info); | ||
98 | if (status && server->client_sys != server->client) | ||
99 | status = do_proc_get_root(server->client_sys, fhandle, info); | ||
100 | return status; | ||
101 | } | ||
102 | |||
103 | /* | ||
92 | * One function for each procedure in the NFS protocol. | 104 | * One function for each procedure in the NFS protocol. |
93 | */ | 105 | */ |
94 | static int | 106 | static int |