From owner-freebsd-current Tue Sep 23 21:05:53 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id VAA27867 for current-outgoing; Tue, 23 Sep 1997 21:05:53 -0700 (PDT) Received: from gneiss.eps.nagoya-u.ac.jp (gneiss.eps.nagoya-u.ac.jp [133.6.57.99]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id VAA27853 for ; Tue, 23 Sep 1997 21:05:45 -0700 (PDT) Received: from marble.eps.nagoya-u.ac.jp (localhost [127.0.0.1]) by gneiss.eps.nagoya-u.ac.jp (8.8.7/3.5Wpl3) with ESMTP id MAA04770; Wed, 24 Sep 1997 12:58:32 +0900 (JST) Message-Id: <199709240358.MAA04770@gneiss.eps.nagoya-u.ac.jp> To: jkh@time.cdrom.com Cc: current@freebsd.org Subject: Re: Daily SNAPshots at current.freebsd.org shut down for now. From: KATO Takenori In-Reply-To: Your message of "Wed, 24 Sep 1997 09:59:17 +0900" References: <199709240059.JAA02534@gneiss.eps.nagoya-u.ac.jp> X-Mailer: Mew version 1.70 on Emacs 19.28.1 / Mule 2.3 X-PGP-Fingerprint: 03 72 85 36 62 46 23 03 52 B1 10 22 44 10 0D 9E Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Date: Wed, 24 Sep 1997 12:58:32 +0900 Sender: owner-freebsd-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk > To undo the change in 1.49/1.41.2.1 of /sys/dev/vn/vn.c may hide the > panic. But, I think this is NOT real fix. I made patches for current and 2.2. They are better than undoing. Should they be committed? ---------- PATCH FOR 2.2 ---------- *** vn.c.ORIG Wed Sep 24 10:33:10 1997 --- vn.c Wed Sep 24 11:39:25 1997 *************** *** 234,239 **** --- 234,240 ---- long sz; struct uio auio; struct iovec aiov; + int vnodelocked = 0; IFOPT(vn, VN_DEBUG) printf("vnstrategy(%p): unit %d\n", bp, unit); *************** *** 279,290 **** auio.uio_rw = UIO_WRITE; auio.uio_resid = bp->b_bcount; auio.uio_procp = curproc; ! VOP_LOCK(vn->sc_vp); if( bp->b_flags & B_READ) error = VOP_READ(vn->sc_vp, &auio, 0, vn->sc_cred); else error = VOP_WRITE(vn->sc_vp, &auio, 0, vn->sc_cred); ! VOP_UNLOCK(vn->sc_vp); bp->b_resid = auio.uio_resid; --- 280,297 ---- auio.uio_rw = UIO_WRITE; auio.uio_resid = bp->b_bcount; auio.uio_procp = curproc; ! if (!VOP_ISLOCKED(vn->sc_vp)) { ! vnodelocked = 1; ! VOP_LOCK(vn->sc_vp); ! } if( bp->b_flags & B_READ) error = VOP_READ(vn->sc_vp, &auio, 0, vn->sc_cred); else error = VOP_WRITE(vn->sc_vp, &auio, 0, vn->sc_cred); ! if (vnodelocked) { ! VOP_UNLOCK(vn->sc_vp); ! vnodelocked = 0; /* vnodelocked will be reused bellow. */ ! } bp->b_resid = auio.uio_resid; *************** *** 309,318 **** int off, s, nra; nra = 0; ! VOP_LOCK(vn->sc_vp); error = VOP_BMAP(vn->sc_vp, (daddr_t)(byten / bsize), &vp, &nbn, &nra, NULL); ! VOP_UNLOCK(vn->sc_vp); if (error == 0 && nbn == -1) error = EIO; --- 316,329 ---- int off, s, nra; nra = 0; ! if (!VOP_ISLOCKED(vn->sc_vp)) { ! vnodelocked = 1; ! VOP_LOCK(vn->sc_vp); ! } error = VOP_BMAP(vn->sc_vp, (daddr_t)(byten / bsize), &vp, &nbn, &nra, NULL); ! if (vnodelocked) ! VOP_UNLOCK(vn->sc_vp); if (error == 0 && nbn == -1) error = EIO; ---------- END ---------- ---------- PATCH FOR CURRENT ---------- *** vn.c.ORIG Wed Sep 24 12:49:09 1997 --- vn.c Wed Sep 24 12:52:13 1997 *************** *** 231,236 **** --- 231,237 ---- long sz; struct uio auio; struct iovec aiov; + int vnodelocked = 0; IFOPT(vn, VN_DEBUG) printf("vnstrategy(%p): unit %d\n", bp, unit); *************** *** 276,287 **** auio.uio_rw = UIO_WRITE; auio.uio_resid = bp->b_bcount; auio.uio_procp = curproc; ! vn_lock(vn->sc_vp, LK_EXCLUSIVE | LK_RETRY, curproc); if( bp->b_flags & B_READ) error = VOP_READ(vn->sc_vp, &auio, 0, vn->sc_cred); else error = VOP_WRITE(vn->sc_vp, &auio, 0, vn->sc_cred); ! VOP_UNLOCK(vn->sc_vp, 0, curproc); bp->b_resid = auio.uio_resid; if( error ) --- 277,294 ---- auio.uio_rw = UIO_WRITE; auio.uio_resid = bp->b_bcount; auio.uio_procp = curproc; ! if (!VOP_ISLOCKED(vn->sc_vp)) { ! vnodelocked = 1; ! vn_lock(vn->sc_vp, LK_EXCLUSIVE | LK_RETRY, curproc); ! } if( bp->b_flags & B_READ) error = VOP_READ(vn->sc_vp, &auio, 0, vn->sc_cred); else error = VOP_WRITE(vn->sc_vp, &auio, 0, vn->sc_cred); ! if (vnodelocked) { ! VOP_UNLOCK(vn->sc_vp, 0, curproc); ! vnodelocked = 0; /* vnodelocked will be reused bellow. */ ! } bp->b_resid = auio.uio_resid; if( error ) *************** *** 305,314 **** int off, s, nra; nra = 0; ! vn_lock(vn->sc_vp, LK_EXCLUSIVE | LK_RETRY, curproc); error = VOP_BMAP(vn->sc_vp, (daddr_t)(byten / bsize), &vp, &nbn, &nra, NULL); ! VOP_UNLOCK(vn->sc_vp, 0, curproc); if (error == 0 && nbn == -1) error = EIO; --- 312,327 ---- int off, s, nra; nra = 0; ! if (!VOP_ISLOCKED(vn->sc_vp)) { ! vnodelocked = 1; ! vn_lock(vn->sc_vp, LK_EXCLUSIVE | LK_RETRY, curproc); ! } error = VOP_BMAP(vn->sc_vp, (daddr_t)(byten / bsize), &vp, &nbn, &nra, NULL); ! if (vnodelocked) { ! VOP_UNLOCK(vn->sc_vp, 0, curproc); ! vnodelocked = 0; ! } if (error == 0 && nbn == -1) error = EIO; ---------- END ---------- ---- KATO Takenori Dept. Earth Planet. Sci., Nagoya Univ., Nagoya, 464-01, Japan PGP public key: finger kato@eclogite.eps.nagoya-u.ac.jp ------------------- Powered by FreeBSD(98) -------------------