aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Schumaker <bjschuma@netapp.com>2012-04-27 13:27:39 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-04-27 14:10:01 -0400
commitdb0a9593d52f935c80085d8993bdcead1ad30b0c (patch)
treee0ca32d8d4366042479cb2a87d6fe87998a9849f
parent31e4dda4747713de13889f7c79c7aec341fea61b (diff)
NFS: Handle exceptions coming out of nfs4_proc_fs_locations()
We don't want to return -NFS4ERR_WRONGSEC to the VFS because it could cause the kernel to oops. Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/nfs4proc.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 2ce069880d6b..ff7571f12bb8 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4921,7 +4921,7 @@ static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
4921 fattr->nlink = 2; 4921 fattr->nlink = 2;
4922} 4922}
4923 4923
4924int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, 4924static int _nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
4925 struct nfs4_fs_locations *fs_locations, struct page *page) 4925 struct nfs4_fs_locations *fs_locations, struct page *page)
4926{ 4926{
4927 struct nfs_server *server = NFS_SERVER(dir); 4927 struct nfs_server *server = NFS_SERVER(dir);
@@ -4961,6 +4961,19 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
4961 return status; 4961 return status;
4962} 4962}
4963 4963
4964int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
4965 struct nfs4_fs_locations *fs_locations, struct page *page)
4966{
4967 struct nfs4_exception exception = { };
4968 int err;
4969 do {
4970 err = nfs4_handle_exception(NFS_SERVER(dir),
4971 _nfs4_proc_fs_locations(dir, name, fs_locations, page),
4972 &exception);
4973 } while (exception.retry);
4974 return err;
4975}
4976
4964static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors) 4977static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors)
4965{ 4978{
4966 int status; 4979 int status;