Date: Sat, 01 Jun 1996 03:39:03 +0900 From: KATO Takenori <kato@eclogite.eps.nagoya-u.ac.jp> To: current@freebsd.org Subject: panic: vwakup: neg numoutput Message-ID: <199605311839.DAA01782@marble.eps.nagoya-u.ac.jp>
next in thread | raw e-mail | index | archive | help
I am having panic by SCSI CD-ROM access. I mount 4.4BSD-Lite2 CD-ROM, and do: cd /cdrom/4.4BSD-Lite/usr/src/lib/libc egrep DTF */* After disk access, kernel show the following message: panic: vwakeup: neg numoutput I changed into the kernel which was built before VM mega-commit, I got same panic. The version 2.1.0 kernel doesn't panic, and egrep works. The stack frame trace with kgdb show: kato@marble[84]% kgdb #0 boot (howto=256) (...) #1 0xf0119207 in panic (...) #2 0xf0130de3 in vwakeup (...) #3 0xf012da6a in biodone (...) #4 0xf01861eb in cd:cd_strategy (...) #5 0xf018bd94 in scsi_strategy (...) #6 0xf0185dc8 in cd:cdstrategy (...) #7 0xf0138f1a in spec_strategy (...) #8 0xf0108030 in cd9660_vnops:cd9660_strategy (...) #9 0xf012eed3 in cluster_read (...) #10 0xf0107665 in cd9660_vnops:cd9660_read (...) #11 0xf0135b32 in vfs_vnops:vn_read (...) #12 0xf011a84f in read (...) #13 0xf01b823d in syscall (...) Reading in symbols for ../../kern/vfs_bio.c...done. #3 0xf012da6a in biodone (bp=(struct buf *) 0xf2c9ed14) (../../kern/vfs_bio.c line 1377) 1377 vwakeup(bp); (kgdb) list 1372 return; 1373 } 1374 bp->b_flags |= B_DONE; 1375 1376 if ((bp->b_flags & B_READ) == 0) { 1377 vwakeup(bp); 1378 } 1379 #ifdef BOUNCE_BUFFERS 1380 if (bp->b_flags & B_BOUNCE) 1381 vm_bounce_free(bp); (kgdb) x bp 0xf2c9ed14 <end+44643220>: 0xf2c8d52c (kgdb) print bp->b_flags $4 = 68112 #4 0xf01861eb in cd_strategy (bp=(struct buf *) 0xf2c9ed14, sc_link=(struct scsi_link *) 0xf0938700) (../../scsi/cd.c line 484) li484 biodone(bp); (kgdb) list 479 480 /* 481 * Correctly set the buf to indicate a completed xfer 482 */ 483 bp->b_resid = bp->b_bcount; 484 biodone(bp); 485 return; 486 } 487 488 /* #9 0xf012eed3 in cluster_read (vp=(struct vnode *) 0xf0d92400, filesize=0x1800, lblkno=0, size=2048, cred=(struct ucred *) 0x0, bpp=(struct buf **) 0xefbffecc) (./vnode_if.h line 1116) 1116 return (VCALL((bp)->b_vp, VOFFSET(vop_strategy), &a)); (kgdb) list 1111 { 1112 struct vop_strategy_args a; 1113 1114 a.a_desc = VDESC(vop_strategy); 1115 a.a_bp = bp; 1116 return (VCALL((bp)->b_vp, VOFFSET(vop_strategy), &a)); 1117 } 1118 1119 struct vop_bwrite_args { 1120 struct vnodeop_desc *a_desc; (kgdb) i line * 0xf012eed3 Line 1116 of "./vnode_if.h" starts at pc 0xf012ee06 and ends at 0xf012ee23. (kgdb) disassemble 0xf012eed3 0xf012ee4c Dump of assembler code from 0xf012eed3 to 0xf012ee4c: End of assembler dump. (kgdb) disassemble 0xf012eed3 0xf012ef40 Dump of assembler code from 0xf012eed3 to 0xf012ef1c: 0xf012eed3 <cluster_read+795>: addl $0x4,%esp 0xf012eed6 <cluster_read+798>: incl -266339692 0xf012eedc <cluster_read+804>: movl 52(%ebx),%eax 0xf012eedf <cluster_read+807>: cltd 0xf012eee0 <cluster_read+808>: idivl 24(%ebp),%eax 0xf012eee3 <cluster_read+811>: addl %eax,-266339688 0xf012eee9 <cluster_read+817>: movl -266415424,%edx 0xf012eeef <cluster_read+823>: movl 24(%edx),%edx 0xf012eef2 <cluster_read+826>: incl 44(%edx) 0xf012eef5 <cluster_read+829>: cmpl $0x0,-40(%ebp) 0xf012eef9 <cluster_read+833>: je 0xf012ef0c 0xf012eefb <cluster_read+835>: movl -40(%ebp),%edx 0xf012eefe <cluster_read+838>: testb $0x4,36(%edx) 0xf012ef02 <cluster_read+842>: jne 0xf012ef0c 0xf012ef04 <cluster_read+844>: pushl %edx 0xf012ef05 <cluster_read+845>: call 0xf012d830 0xf012ef0a <cluster_read+850>: jmp 0xf012ef0f 0xf012ef0c <cluster_read+852>: movl -48(%ebp),%eax 0xf012ef0f <cluster_read+855>: leal -76(%ebp),%esp 0xf012ef12 <cluster_read+858>: popl %ebx 0xf012ef13 <cluster_read+859>: popl %esi 0xf012ef14 <cluster_read+860>: popl %edi 0xf012ef15 <cluster_read+861>: leave 0xf012ef16 <cluster_read+862>: ret 0xf012ef17 <cluster_read+863>: addb %dl,-119(%ebp) 0xf012ef1a <vfs_cluster:cluster_rbuild+2>: inl $0x83,%eax 0xf012ef1c <vfs_cluster:cluster_rbuild+4>: inb (%dx),%al End of assembler dump. The bp->b_flags is set as: B_MALLOC | B_DONE | B_ERROR | B_BUSY B_DONE might be set in biodone(), and B_ERROR might be set in cd_strategy(). The disassemble list show VOP_STRATEGY (vnode_if.h line 1116) is second VOP_STRATEGY in cluster_read(). So, the buffer may be the return value of cluster_rbuild(). The value of b_flags suggests following process. 1) first getblk() in cluster_rbuild() returns buffer with B_MALLOC | B_BUSY. 2) VOP_STRATEGY in cluster_read() calls cd9660_strategy(), spec_strategy(), ..., cd_strategy(). 3) cd_strategy() set B_ERROR and jump to bad label, then it calls biodone. (Now b_flags is B_MALLOC | B_BUSY | B_ERROR) 4) Because B_READ is not set, biodone call vwakeup(). 5) Panic! I compared vfs_cluster.c between 2.1.0-RELEASE version and revision 1.35 in current, and I found the change which could cause above process. In change of vfs_cluster.c from 1.34 to 1.35, in cluster_rbuild(): tbp = getblk(vp, lbn, size, 0, 0); if (tbp->b_flags & B_CACHE) return tbp; was changed into tbp = getblk(vp, lbn, size, 0, 0); if (tbp->b_flags & (B_CACHE|B_MALLOC)) return tbp; If getblk of both 2.1.0 and current returns the buffer with B_MALLOC, B_ASYNC and B_READ are set in 2.1.0 but they aren't set in current. Comment please. ---- KATO Takenori <kato@eclogite.eps.nagoya-u.ac.jp> Dept. Earth Planet. Sci., Nagoya Univ., Nagoya, 464-01, Japan Voice: +81-52-789-2529 Fax: +81-52-789-3033
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199605311839.DAA01782>