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:
parent
34f83c86f6
commit
a505c2c72c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196692
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user