From e7736557d66d5aaecfb1672618f1e06349ff4ec2 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Thu, 29 Dec 2005 22:52:09 +0000 Subject: [PATCH] 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 --- sys/kern/vfs_subr.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 6f5f375b12d..a57b2ba80b3 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -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)