Message ID | 1303156652-5929-1-git-send-email-bjschuma@netapp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2011-04-18 at 15:57 -0400, bjschuma@netapp.com wrote: > From: Bryan Schumaker <bjschuma@netapp.com> > > I only want to try other secflavors during an initial mount if > NFS4ERR_WRONGSEC is returned. nfs4_handle_exception() could > potentially map other errors to EPERM, so we should handle this > error specially for correctness. > > Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> > > --- > fs/nfs/nfs4proc.c | 17 ++++++++++++----- > 1 files changed, 12 insertions(+), 5 deletions(-) > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index b8e1ac6..152e0eb 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -2186,9 +2186,14 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, > struct nfs4_exception exception = { }; > int err; > do { > - err = nfs4_handle_exception(server, > - _nfs4_lookup_root(server, fhandle, info), > - &exception); > + err = _nfs4_lookup_root(server, fhandle, info); > + switch (err) { > + case 0: > + case -NFS4ERR_WRONGSEC: > + break; > + default: > + err = nfs4_handle_exception(server, err, &exception); > + } > } while (exception.retry); > return err; > } > @@ -2221,10 +2226,12 @@ static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, > > for (i = 0; i < len; i++) { > status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]); > - if (status == -EPERM || status == -EACCES) > + if (status == -NFS4ERR_WRONGSEC || status == -EACCES) > continue; > break; > } > + if (status == -EACCES) > + status = -EPERM; Won't this leak -NFS4ERR_WRONGSEC errors to the user? I think you need to handle both errors above by mapping them into EPERM. > return status; > } > > @@ -2235,7 +2242,7 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, > struct nfs_fsinfo *info) > { > int status = nfs4_lookup_root(server, fhandle, info); > - if ((status == -EPERM) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) > + if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) > status = nfs4_find_root_sec(server, fhandle, info); > if (status == 0) > status = nfs4_server_capabilities(server, fhandle);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index b8e1ac6..152e0eb 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2186,9 +2186,14 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(server, - _nfs4_lookup_root(server, fhandle, info), - &exception); + err = _nfs4_lookup_root(server, fhandle, info); + switch (err) { + case 0: + case -NFS4ERR_WRONGSEC: + break; + default: + err = nfs4_handle_exception(server, err, &exception); + } } while (exception.retry); return err; } @@ -2221,10 +2226,12 @@ static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, for (i = 0; i < len; i++) { status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]); - if (status == -EPERM || status == -EACCES) + if (status == -NFS4ERR_WRONGSEC || status == -EACCES) continue; break; } + if (status == -EACCES) + status = -EPERM; return status; } @@ -2235,7 +2242,7 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *info) { int status = nfs4_lookup_root(server, fhandle, info); - if ((status == -EPERM) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) + if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) status = nfs4_find_root_sec(server, fhandle, info); if (status == 0) status = nfs4_server_capabilities(server, fhandle);