On Tue, Apr 25, 2006 at 07:06:11PM +0400, Dmitry Morozovsky wrote: > On Tue, 25 Apr 2006, Chris Dillon wrote: > > CD> > Please, also add DDB to the kernel and show the result of the > CD> > show lockedvnodes > CD> > alltrace > CD> > ps > CD> > in the DDB after the deadlock, as asked by Kris Kennaway earlier > CD> > in this thread ! > CD> > > CD> > CD> OK, I've added DDB, but all of the information I might gather I'll have to > CD> write down by hand since I have no serial console access. :-( > > I just made lab machine with serial console, compile minimal kernel with > quotas > and KDB+WITNESS, and immediately after ``quotacheck /var && quotaon /var'' got > > kdb_backtrace(d663aba0,c051f402,c05f7da3,c05fe731,c32cb414) at > kdb_backtrace+0x29 > vfs_badlock(c05f7da3,c05fe731,c32cb414) at vfs_badlock+0x11 > assert_vop_locked(c32cb414,c05fe731,c30ed400,c04eac2c,c05f6cf4) at > assert_vop_locked+0x4a > quotaon(c30c5300,c3069c00,0,804a3e0,0) at quotaon+0x166 > ufs_quotactl(c3069c00,10000,0,804a3e0,c30c5300) at ufs_quotactl+0xb9 > quotactl(c30c5300,d663ad04,4,1,206) at quotactl+0xf8 > syscall(3b,3b,3b,8048fa8,2813cccc) at syscall+0x22f > Xint0x80_syscall() at Xint0x80_syscall+0x1f > --- syscall (148, FreeBSD ELF32, quotactl), eip = 0x280b694b, esp = > 0xbfbfebcc, > ebp = 0xbfbfebf8 --- > quotaon: 0xc32cb414 is not locked but should be > KDB: enter: lock violation > > full console log after dropping to ddb is available (40k) at > > http://woozle.net/FreeBSD/debug/kdb-quota-20060425.txt > Obviously, revisions 1.78, 1.79 of the sys/ufs/ufs/ufs_quota.c shall be MFCed. Try this patch (note, I does not tested it):
Index: sys/ufs/ufs/ufs_quota.c
===================================================================
RCS file: /usr/local/arch/ncvs/src/sys/ufs/ufs/ufs_quota.c,v
retrieving revision 1.77
retrieving revision 1.79
diff -u -r1.77 -r1.79
--- sys/ufs/ufs/ufs_quota.c 9 Jan 2006 20:42:19 -0000 1.77
+++ sys/ufs/ufs/ufs_quota.c 12 Feb 2006 13:20:06 -0000 1.79
@@ -429,8 +429,9 @@
quotaoff(td, mp, type);
ump->um_qflags[type] |= QTF_OPENING;
mp->mnt_flag |= MNT_QUOTA;
- ASSERT_VOP_LOCKED(vp, "quotaon");
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
vp->v_vflag |= VV_SYSTEM;
+ VOP_UNLOCK(vp, 0, td);
*vpp = vp;
/*
* Save the credential of the process that turned on quotas.
@@ -535,8 +536,9 @@
}
MNT_IUNLOCK(mp);
dqflush(qvp);
- ASSERT_VOP_LOCKED(qvp, "quotaoff");
+ vn_lock(qvp, LK_EXCLUSIVE | LK_RETRY, td);
qvp->v_vflag &= ~VV_SYSTEM;
+ VOP_UNLOCK(qvp, 0, td);
error = vn_close(qvp, FREAD|FWRITE, td->td_ucred, td);
ump->um_quotas[type] = NULLVP;
crfree(ump->um_cred[type]);
pgpIwryYC1ivk.pgp
Description: PGP signature
