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>
