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
This commit is contained in:
Konstantin Belousov 2009-08-31 10:20:52 +00:00
parent 34f83c86f6
commit a505c2c72c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196692

View File

@ -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");