Giant not owned in gbincore()

From: Dag-Erling Smørgrav <des_at_des.no>
Date: Sat, 20 Mar 2004 23:57:43 +0100
running America's Army 2.0.0a under ktrace results in the following
panic:

% cat panic
panic: mutex Giant not owned at /usr/src/sys/kern/vfs_subr.c:1369
at line 719 in file /usr/src/sys/kern/kern_mutex.c
cpuid = 0;
Debugger("panic")
Stopped at      Debugger+0x48:  xchgl   %ebx,in_Debugger.0
db> trace
Debugger(c05bbb8d,100,c671c150,c0606060,559) at Debugger+0x48
__panic(c05baf84,2cf,c05bb120,c05bb207,c05c1fe2) at __panic+0x157
_mtx_assert(c0606060,1,c05c1fe2,559,c05c08b2) at _mtx_assert+0x89
gbincore(c609e514,a79d6c0,0,c609e514,0,c05c08b2,98b) at gbincore+0x25
getblk(c609e514,a79d6c0,0,4000,0) at getblk+0x9c
breadn(c609e514,a79d6c0,0,4000,0) at breadn+0x34
bread(c609e514,a79d6c0,0,4000,0,ebbd1c2c) at bread+0x20
ffs_update(c9bd2104,0,c9bd2104,c5fa0800,1) at ffs_update+0x13c
ufs_inactive(ebbd1c94,ebbd1cac,c04ebd04,ebbd1c94,c05fc6a0) at ufs_inactive+0x10b
ufs_vnoperate(ebbd1c94,c05fc6a0,c9bd2104,c671c150,c05b947b) at ufs_vnoperate+0x13
vrele(c9bd2104,c6a2606c,c6a26000,c671c150,c6a26000) at vrele+0x104
exit1(c671c150,100,ebbd1d40,c058eff9,c671c150) at exit1+0x47a
exit1(c671c150,ebbd1d14,1,3,246) at exit1
syscall(2f,2f,2f,1,288f3980) at syscall+0x129
Xint0x80_syscall() at Xint0x80_syscall+0x1d
--- syscall (1, Linux ELF, sys_exit), eip = 0x288787dd, esp = 0xbfbfe56c, ebp = 0xbfbfe598 ---
% perl -n -e '/ at (\w+\+0x\w+)/ && print "print $1\nlist *($1)\n"' panic | gdb -k -batch -x /dev/stdin /usr/obj/usr/src/sys/dwp_smp/kernel.debug
Debugger+0x48
0xc057d21c is in Debugger (machine/atomic.h:263).
258	machine/atomic.h: No such file or directory.
	in machine/atomic.h
__panic+0x157
0xc04a4d6b is in __panic (/usr/src/sys/kern/kern_shutdown.c:536).
531	
532	#if defined(DDB)
533		if (newpanic && trace_on_panic)
534			backtrace();
535		if (debugger_on_panic)
536			Debugger ("panic");
537	#ifdef RESTARTABLE_PANICS
538		/* See if the user aborted the panic, in which case we continue. */
539		if (panicstr == NULL) {
540	#ifdef SMP
_mtx_assert+0x89
0xc049d509 is in _mtx_assert (/usr/src/sys/kern/kern_mutex.c:722).
717			if (!mtx_owned(m))
718				panic("mutex %s not owned at %s:%d",
719				    m->mtx_object.lo_name, file, line);
720			if (mtx_recursed(m)) {
721				if ((what & MA_NOTRECURSED) != 0)
722					panic("mutex %s recursed at %s:%d",
723					    m->mtx_object.lo_name, file, line);
724			} else if ((what & MA_RECURSED) != 0) {
725				panic("mutex %s unrecursed at %s:%d",
726				    m->mtx_object.lo_name, file, line);
gbincore+0x25
0xc04ead71 is in gbincore (/usr/src/sys/kern/vfs_subr.c:1372).
1367		struct buf *bp;
1368	
1369		GIANT_REQUIRED;
1370	
1371		ASSERT_VI_LOCKED(vp, "gbincore");
1372		if ((bp = vp->v_cleanblkroot) != NULL &&
1373		    bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
1374			return (bp);
1375		if ((bp = vp->v_dirtyblkroot) != NULL &&
1376		    bp->b_lblkno == lblkno && !(bp->b_xflags & BX_BKGRDMARKER))
getblk+0x9c
0xc04def3c is in getblk (/usr/src/sys/kern/vfs_bio.c:2444).
2439			needsbuffer |= VFS_BIO_NEED_ANY;
2440			mtx_unlock(&nblock);
2441		}
2442	
2443		VI_LOCK(vp);
2444		if ((bp = gbincore(vp, blkno))) {
2445			int lockflags;
2446			/*
2447			 * Buffer is in-core.  If the buffer is not busy, it must
2448			 * be on a queue.
breadn+0x34
0xc04dbe04 is in breadn (/usr/src/sys/kern/vfs_bio.c:702).
697	{
698		struct buf *bp, *rabp;
699		int i;
700		int rv = 0, readwait = 0;
701	
702		*bpp = bp = getblk(vp, blkno, size, 0, 0, 0);
703	
704		/* if not found in cache, do some I/O */
705		if ((bp->b_flags & B_CACHE) == 0) {
706			if (curthread != PCPU_GET(idlethread))
bread+0x20
0xc04dbdcc is in bread (/usr/src/sys/kern/vfs_bio.c:685).
680	bread(struct vnode * vp, daddr_t blkno, int size, struct ucred * cred,
681	    struct buf ** bpp)
682	{
683	
684		return (breadn(vp, blkno, size, 0, 0, 0, cred, bpp));
685	}
686	
687	/*
688	 * Operates like bread, but also starts asynchronous I/O on
689	 * read-ahead blocks.  We must clear BIO_ERROR and B_INVAL prior
ffs_update+0x13c
0xc0528a6c is in ffs_update (/usr/src/sys/ufs/ffs/ffs_inode.c:110).
105			ip->i_din1->di_ouid = ip->i_uid;	/* XXX */
106			ip->i_din1->di_ogid = ip->i_gid;	/* XXX */
107		}						/* XXX */
108		error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)),
109			(int)fs->fs_bsize, NOCRED, &bp);
110		if (error) {
111			brelse(bp);
112			return (error);
113		}
114		if (DOINGSOFTDEP(vp))
ufs_inactive+0x10b
0xc0541103 is in ufs_inactive (/usr/src/sys/ufs/ufs/ufs_inode.c:125).
120			if ((ip->i_flag & (IN_CHANGE | IN_UPDATE | IN_MODIFIED)) == 0 &&
121			    vn_write_suspend_wait(vp, NULL, V_NOWAIT)) {
122				ip->i_flag &= ~IN_ACCESS;
123			} else {
124				(void) vn_write_suspend_wait(vp, NULL, V_WAIT);
125				UFS_UPDATE(vp, 0);
126			}
127		}
128	out:
129		VOP_UNLOCK(vp, 0, td);
ufs_vnoperate+0x13
0xc054818f is in ufs_vnoperate (/usr/src/sys/ufs/ufs/ufs_vnops.c:2824).
2819		struct vop_generic_args /* {
2820			struct vnodeop_desc *a_desc;
2821		} */ *ap;
2822	{
2823		return (VOCALL(ufs_vnodeop_p, ap->a_desc->vdesc_offset, ap));
2824	}
2825	
2826	int
2827	ufs_vnoperatefifo(ap)
2828		struct vop_generic_args /* {
vrele+0x104
0xc04ebd04 is in vrele (/usr/src/sys/kern/vfs_subr.c:1998).
1993			if (vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK, td) == 0) {
1994				VI_LOCK(vp);
1995				vp->v_iflag |= VI_DOINGINACT;
1996				VI_UNLOCK(vp);
1997				VOP_INACTIVE(vp, td);
1998				VI_LOCK(vp);
1999				KASSERT(vp->v_iflag & VI_DOINGINACT,
2000				    ("vrele: lost VI_DOINGINACT"));
2001				vp->v_iflag &= ~VI_DOINGINACT;
2002			} else
exit1+0x47a
0xc04920a6 is in exit1 (/usr/src/sys/kern/kern_exit.c:371).
366		tracecred = p->p_tracecred;
367		p->p_tracecred = NULL;
368		mtx_unlock(&ktrace_mtx);
369		PROC_UNLOCK(p);
370		if (tracevp != NULL)
371			vrele(tracevp);
372		if (tracecred != NULL)
373			crfree(tracecred);
374	#endif
375		/*
syscall+0x129
0xc058eff9 is in syscall (/usr/src/sys/i386/i386/trap.c:1004).
999	
1000			STOPEVENT(p, S_SCE, narg);
1001	
1002			PTRACESTOP_SC(p, td, S_PT_SCE);
1003	
1004			error = (*callp->sy_call)(td, args);
1005		}
1006	
1007		switch (error) {
1008		case 0:
Xint0x80_syscall+0x1d
0xc057e4ed is at {standard input}:138.
133	{standard input}: No such file or directory.
	in {standard input}

DES
-- 
Dag-Erling Smørgrav - des_at_des.no
Received on Sat Mar 20 2004 - 13:57:55 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:48 UTC