svn commit: r196692 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Mon Aug 31 10:20:52 UTC 2009


Author: kib
Date: Mon Aug 31 10:20:52 2009
New Revision: 196692
URL: http://svn.freebsd.org/changeset/base/196692

Log:
  Make the mnt_writeopcount and mnt_secondary_writes counters,
  used by the suspension code, not greater then mnt_ref reference
  counter value. Increment mnt_ref together with write counter
  in vn_start_write()/ vn_start_secondary_write(), releasing in
  vn_finished_write/vn_finished_secondary_write().
  
  Since r186197, unmount code requires that no writers occured after all
  references are expired. We still could get write counter incremented
  for freed or reused struct mount, but it seems to be innocent, since
  corresponding vnode should be referenced and reclaimed then.
  
  Reported by:	pho (last half a year), erwin
  Reviewed by:	attilio
  Tested by:	pho, erwin
  MFC after:	1 week

Modified:
  head/sys/kern/vfs_vnops.c

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c	Mon Aug 31 09:46:09 2009	(r196691)
+++ head/sys/kern/vfs_vnops.c	Mon Aug 31 10:20:52 2009	(r196692)
@@ -999,7 +999,8 @@ vn_start_write(vp, mpp, flags)
 		goto unlock;
 	mp->mnt_writeopcount++;
 unlock:
-	MNT_REL(mp);
+	if (error != 0)
+		MNT_REL(mp);
 	MNT_IUNLOCK(mp);
 	return (error);
 }
@@ -1049,7 +1050,6 @@ vn_start_secondary_write(vp, mpp, flags)
 	if ((mp->mnt_kern_flag & (MNTK_SUSPENDED | MNTK_SUSPEND2)) == 0) {
 		mp->mnt_secondary_writes++;
 		mp->mnt_secondary_accwrites++;
-		MNT_REL(mp);
 		MNT_IUNLOCK(mp);
 		return (0);
 	}
@@ -1081,6 +1081,7 @@ vn_finished_write(mp)
 	if (mp == NULL)
 		return;
 	MNT_ILOCK(mp);
+	MNT_REL(mp);
 	mp->mnt_writeopcount--;
 	if (mp->mnt_writeopcount < 0)
 		panic("vn_finished_write: neg cnt");
@@ -1103,6 +1104,7 @@ vn_finished_secondary_write(mp)
 	if (mp == NULL)
 		return;
 	MNT_ILOCK(mp);
+	MNT_REL(mp);
 	mp->mnt_secondary_writes--;
 	if (mp->mnt_secondary_writes < 0)
 		panic("vn_finished_secondary_write: neg cnt");


More information about the svn-src-all mailing list