Print a warning when we miss vinactive() call, because of race in vget().

The race is very real, but conditions needed for triggering it are rather
hard to meet now.
When gjournal will be committed (where it is quite easy to trigger) we need
to fix it.

For now, verify if it is really hard to trigger.

Discussed with:	kan
This commit is contained in:
Pawel Jakub Dawidek 2005-12-29 22:52:09 +00:00
parent 0265cf8906
commit e7736557d6

View file

@ -1928,6 +1928,7 @@ vget(vp, flags, td)
{
int oweinact;
int oldflags;
int usecount;
int error;
error = 0;
@ -1949,6 +1950,7 @@ vget(vp, flags, td)
flags |= LK_EXCLUSIVE;
oweinact = 1;
}
usecount = vp->v_usecount;
v_incr_usecount(vp);
if ((error = vn_lock(vp, flags | LK_INTERLOCK, td)) != 0) {
VI_LOCK(vp);
@ -1959,6 +1961,24 @@ vget(vp, flags, td)
* active.
*/
v_decr_usecount(vp);
/*
* Print warning when race below occur:
*
* thread1 thread2
* ------- -------
* v_usecount=0
* vref(vp) v_usecount=1
* vget(vp)
* v_incr_usecount(vp) v_usecount=2
* vn_lock(vp)
* vrele(vp) v_usecount=1
* v_decr_usecount(vp) v_usecount=0
*
* In such situation VOP_INACTIVE() will not be called for
* the vnode vp.
*/
if (usecount > 0 && vp->v_usecount == 0)
printf("vinactive() won't be called for vp=%p\n", vp);
return (error);
}
if (vp->v_iflag & VI_DOOMED && (flags & LK_RETRY) == 0)