NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/42205: kernel panic at activated userquota



On Sat, Nov 21, 2009 at 06:58:17PM +0100, Manuel Bouyer wrote:
> On Thu, Nov 05, 2009 at 07:55:41AM +0100, 
> 6bone%6bone.informatik.uni-leipzig.de@localhost wrote:
> > qsync vp wihout ip: vnode @ 0xffff8000974df5f0, flags (10<MPSAFE>)
> >         tag VT_UFS(1), type VLNK(5), usecount 1, writecount 0, holdcount 
> > 0
> >         freelisthd 0x0, mount 0xffff800072988000, data 
> > 0xffff8000974e0dc0 lock 0xffff8000974df6f8 recursecnt 0
> >         tag VT_UFS, ino 55338475, on dev 19, 4 flags 0x0, effnlink 1, 
> > nlink 1
> >         mode 0120775, owner 1007, group 100, size 31
> 
> Wow, not that's strange. we get there because VTOI(vp) == NULL.
> VTOI is ((struct inode *)(vp)->v_data), and v_data is obviously not NULL
> in this vnode. How could this happen ?

I have an idea on how this can happen; the vnode is put on the mnt list before
initialisation is completed. But then its type should be VNON and so it should
be skipped.

Anyway, ffs_sync() checks for both v_type == VNON and VTOI(vp) == NULL, so
we could do the same in qsync. While there also check for VCLEAN, like
ffs_sync() although this should also not be needed.
Can you see if the attached patch prevents the vprint from firing ?

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--
Index: ufs/ufs_quota.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ufs/ufs_quota.c,v
retrieving revision 1.60.10.1
diff -u -r1.60.10.1 ufs_quota.c
--- ufs/ufs_quota.c     2 Feb 2009 18:24:17 -0000       1.60.10.1
+++ ufs/ufs_quota.c     6 Jan 2010 18:22:55 -0000
@@ -728,8 +728,9 @@
        for (vp = TAILQ_FIRST(&mp->mnt_vnodelist); vp; vp = vunmark(mvp)) {
                vmark(mvp, vp);
                mutex_enter(&vp->v_interlock);
-               if (vp->v_mount != mp || vismarker(vp) || vp->v_type == VNON ||
-                   (vp->v_iflag & VI_CLEAN) != 0) {
+               if (VTOI(vp) == NULL || vp->v_mount != mp || vismarker(vp) ||
+                   vp->v_type == VNON ||
+                   (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) != 0) {
                        mutex_exit(&vp->v_interlock);
                        continue;
                }


Home | Main Index | Thread Index | Old Index