On Mon, 2011-04-18 at 15:57 -0400, bjschuma@xxxxxxxxxx wrote: > From: Bryan Schumaker <bjschuma@xxxxxxxxxx> > > 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@xxxxxxxxxx> > > --- > 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); -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@xxxxxxxxxx www.netapp.com -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html