Date: Wed, 24 Sep 1997 12:58:32 +0900 From: KATO Takenori <kato@migmatite.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. Message-ID: <199709240358.MAA04770@gneiss.eps.nagoya-u.ac.jp> In-Reply-To: Your message of "Wed, 24 Sep 1997 09:59:17 %2B0900" References: <199709240059.JAA02534@gneiss.eps.nagoya-u.ac.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
> 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 <kato@ganko.eps.nagoya-u.ac.jp> 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) -------------------
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199709240358.MAA04770>