Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Oct 1998 10:20:00 -0700 (PDT)
From:      Chris Timmons <skynyrd@opus.cts.cwu.edu>
To:        freebsd-bugs@FreeBSD.ORG
Subject:   Re: kern/8309
Message-ID:  <199810141720.KAA12516@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/8309; it has been noted by GNATS.

From: Chris Timmons <skynyrd@opus.cts.cwu.edu>
To: freebsd-gnats-submit@freebsd.org
Cc:  Subject: Re: kern/8309
Date: Wed, 14 Oct 1998 10:17:08 -0700 (PDT)

 Added to the record with the permission of the author...
 
 ---------- Forwarded message ----------
 Date: Wed, 14 Oct 1998 04:17:57 +0200
 From: Tor.Egge@fast.no
 To: skynyrd@opus.cts.cwu.edu
 Cc: dt@FreeBSD.ORG, bde@FreeBSD.ORG, jhk@FreeBSD.ORG, dg@FreeBSD.ORG
 Subject: Re: kern/8309
 
 
 > #9  0xf013742b in panic (fmt=0xf01ffbb9 "rslock: cpu: %d, addr: 0x%08x,
 > lock: 0x%08x") at ../../kern/kern_shutdown.c:428
 > #10 0xf01ffbb9 in bsl1 ()
 
 simple_lock (i.e. s_lock) is frameless.
 
 The caller is vinvalbuf.
 
 
 > #11 0xf01e1e2c in vm_object_terminate (object=0xf024b014) at
 > ../../vm/vm_object.c:444
 
 vfs_subr.c has changed recently
 
 dt          1998/10/12 13:14:09 PDT
 
   Modified files:
     sys/kern             vfs_subr.c 
   Log:
   UnVMIO vnodes of block devices when they are no longer in use. (Some
   things, like msdosfs, do not work (panic) on devices with VMIO enabled.
   FFS enable VMIO on mounted devices, and nothing previously disabled it, so,
   after you mounted FFS floppy, you could not mount msdosfs floppy anymore...)
   
   This is mostly a quick before-release fix.
   
   Reviewed by:	bde
   
   Revision  Changes    Path
   1.164     +13 -2     src/sys/kern/vfs_subr.c
 
 That change is broken with regard to locking.
 
 vm_object_terminate might block.  Thus, the vnode interlock should not
 be held.  Instead, a full lock should be held.
 
 Moving the calls to vfs_object_destroy to right before the calls to
 VOP_INACTIVE looks like an easy fix, but that would introduce a
 potential vnode leak, since resident page count might be nonzero
 before vfs_object_destroy is called.  By adding some code to
 vfs_object_destroy, this leak might be plugged.
 
 There is very little time left before 3.0 is released.  I'll leave
 this task to the Release Engineer, expecting him to delegate this to
 somebody else on the CC list.
 
 Index: vfs_subr.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/kern/vfs_subr.c,v
 retrieving revision 1.165
 diff -u -r1.165 vfs_subr.c
 --- vfs_subr.c	1998/10/13 08:24:41	1.165
 +++ vfs_subr.c	1998/10/14 01:15:57
 @@ -1306,8 +1316,13 @@
  	struct vnode* vp;
  {
  	if (vp->v_type == VBLK && vp->v_object != NULL &&
 -	    vp->v_object->ref_count == 0)
 +	    vp->v_object->ref_count == 0) {
  		vm_object_terminate(vp->v_object);
 +		simple_lock(&vp->v_interlock);
 +		if (VSHOULDFREE(vp))
 +			vfree(vp);
 +		simple_unlock(&vp->v_interlock);
 +	}
  }
  
  /*
 @@ -1336,7 +1351,6 @@
  
  	if (vp->v_usecount == 1) {
  
 -		vfs_object_destroy(vp);
  		vp->v_usecount--;
  		if (VSHOULDFREE(vp))
  			vfree(vp);
 @@ -1346,6 +1360,7 @@
  	 * vrele, we explicitly lock the vnode before calling VOP_INACTIVE.
  	 */
  		if (vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK, p) == 0) {
 +			vfs_object_destroy(vp);
  			VOP_INACTIVE(vp, p);
  		}
  
 @@ -1381,7 +1396,6 @@
  
  	if (vp->v_usecount == 1) {
  
 -		vfs_object_destroy(vp);
  		vp->v_usecount--;
  		if (VSHOULDFREE(vp))
  			vfree(vp);
 @@ -1391,6 +1405,7 @@
  	 * vrele, we explicitly lock the vnode before calling VOP_INACTIVE.
  	 */
  		simple_unlock(&vp->v_interlock);
 +		vfs_object_destroy(vp);
  		VOP_INACTIVE(vp, p);
  
  	} else {
 
 - Tor Egge
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810141720.KAA12516>