Messages in this thread Patch in this message | | | Date | Fri, 14 Mar 2008 15:33:50 -0400 | Subject | Re: Oops in NFSv4 server in 2.6.23.17 | From | "J. Bruce Fields" <> |
| |
On Fri, Mar 14, 2008 at 02:14:13PM -0400, bfields wrote: > On Thu, Mar 13, 2008 at 03:36:31PM +0100, Lukas Hejtmanek wrote: > > Hello, > > > > On Wed, Mar 12, 2008 at 12:00:07PM -0400, J. Bruce Fields wrote: > > > In this case it looks like something in the gss context cache is bad. > > > > > > I'm not sure what's going on. > > > > I discovered what triggers this bug. If I have default export with secure > > option and I try to connect from insecure port, it produces the oops. > > If I add insecure option to the export, no oops at all and mount succeeds. > > > > Also, the bug is not triggered by the first attempt but by the second one. > > > > So I guess that from the first attempt there is something inserted into gss > > context cache - error occurs (insecure attempt with the secure option), gss > > context is removed from the cache as invalid but not completely. And the > > second attempt does oops. Sounds reasonable for me. > > > > Hope this helps to find the bug. > > That's an excellent clue, thanks. I wonder it would be explainable by a > reference count imbalance of some kind in fh_verify?
OK, yes, I think so. Could you confirm whether this fixes it?
--b.
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 1eb771d..3e6b3f4 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -232,6 +232,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) fhp->fh_dentry = dentry; fhp->fh_export = exp; nfsd_nr_verified++; + cache_get(&exp->h); } else { /* * just rechecking permissions @@ -241,6 +242,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) dprintk("nfsd: fh_verify - just checking\n"); dentry = fhp->fh_dentry; exp = fhp->fh_export; + cache_get(&exp->h); /* * Set user creds for this exportpoint; necessary even * in the "just checking" case because this may be a @@ -252,8 +254,6 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) if (error) goto out; } - cache_get(&exp->h); - error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); if (error)
| |