Skip site navigation (1)Skip section navigation (2)
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>