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-head
mailing list