tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: LOCKDEBUG_BARRIER in mi_userret (was: Re: Another force unmount failure)



Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:

> `Last locked' tells you the return address of the call to rw_enter
> that last acquired the lock.  (The other addresses may be useful for
> other lockdebug panics but aren't likely to be of much use here.)

Here is the code. The function cannot exit without vp->v_interlock being
unlocked. What does that means? 

vdead_check() can go in vwait() -> cv_wait(), and while we were
sleeping, another thread exitted the kernel and triggered the debug
check? But it seems to be perfomed within a given thread.

(gdb) list *0xc018b217
0xc018b217 is in genfs_lock
(../../../../miscfs/genfs/genfs_vnops.c:385).
380                     return error;
381             }
382     
383             fstrans_start(mp, FSTRANS_SHARED);
384             rw_enter(&vp->v_lock, op);
385             mutex_enter(vp->v_interlock);
386             error = vdead_check(vp, VDEAD_NOWAIT);
387             if (error) {
388                     rw_exit(&vp->v_lock);
389                     fstrans_done(mp);
390                     error = vdead_check(vp, 0);
391                     KASSERT(error == ENOENT);
392             }
393             mutex_exit(vp->v_interlock);
394             return error;
395     }

-- 
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index