> On 20 Jun 2016, at 06:04, Brett Lymn <bl...@internode.on.net> wrote:
> 
> On Fri, Jun 17, 2016 at 10:51:44AM +0200, J. Hannken-Illjes wrote:
>> 
>> This assertion is from 2015/03/27, last change to coda was 2015/09/06.
>> 
> 
> What can I say? $REALLIFE has been interfering for quite some time
> (clearly) ;)
> 
>> Looks like coda nearly never locks vnodes before it calls vnode
>> operations using c_ovp.  This is a bug.
>> 
> 
> OK, so, any hints on where those locks should happen?  Last thing I want
> to do is create deadlocks.  I should be able to fix this but it would be
> good if I can get some guidance to speed the process up a bit.

From a quick grep and look:

1) coda_rw()
        remove the VOP_UNLOCK()

        check the VOP_OPEN in "cfvp == NULL && cp->c_inode == 0" case,
        it opens the coda node, why?
        Make sure cfvp is locked.

        on exit (after VOP_READ/VOP_WRITE) call VOP_UNLOCK(cfvp)

2) coda_fsync()
        if (convp) {
                vn_lock(convp, LK_EXCLUSIVE | LK_RETRY);
                VOP_FSYNC(convp, cred, MNT_WAIT, 0, 0);
                VOP_UNLOCK(convp);
        }

3) coda_readdir()
        analogous to 1)

4) coda_getpages()
        looks wrong in many aspects.  see XXX comments


If I get it right, after VOP_OPENing a coda node we always have
"cp->c_ovp != NULL" so at least for read, write, readdir it should
be ok to "KASSERT(cp->c_ovp != NULL)".

These changes should not add deadlocks as we always lock "coda -> ffs". 

--
J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig (Germany)

Reply via email to