tech-kern archive

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

Re: Vnode API cleanup pass 2a



   Date: Mon, 20 Jan 2014 16:01:07 +0100
   From: J. Hannken-Illjes <hannken%eis.cs.tu-bs.de@localhost>

   Back to vnode creation operations returning unlocked vnodes I put a new
   diff to http://www.netbsd.org/~hannken/vnode-pass2a-4.diff

   Any more objections or OK to commit?

On further consideration, this looks to me like the right approach
now.  I gave it a quick skim, but not a thorough review.  It looks
pretty good, modulo a few little nits below.  I assume all the atf
tests and your other stress tests still pass?

   @@ -517,8 +517,10 @@ zfs_replay_create(zfsvfs_t *zfsvfs, lr_c
                   error = VOP_MKDIR(ZTOV(dzp), &vp, &cn, &xva.xva_vattr 
/*,vflg*/);
                   break;
           case TX_MKXATTR:
                   error = zfs_make_xattrdir(dzp, &xva.xva_vattr, &vp, kcred);
   +               if (error == 0 && vp != NULL)
   +                       VOP_UNLOCK(vp);

This looks suspicious -- does zfs_make_xattrdir return a locked vnode?
I don't immediately see evidence that it does.  (Also, if it turns out
this branch is appropriate, shouldn't ((error == 0) == (vp != NULL))
be guaranteed?)

   @@ -1563,10 +1553,11 @@ coda_symlink(void *v)
           saved_cn_flags = cnp->cn_flags;
           cnp->cn_flags &= ~(MODMASK | OPMASK);
           cnp->cn_flags |= LOOKUP;
           error = VOP_LOOKUP(dvp, ap->a_vpp, cnp);
   +       if (error == 0)
   +               VOP_UNLOCK(*ap->a_vpp);

Can you leave an XXX comment here marking it as a provisional kludge
until VOP_LOOKUP becomes sane (i.e., returns the vnode unlocked)?

   @@ -601,8 +601,10 @@ smbfs_create(void *v)
           error = smbfs_smb_lookup(dnp, name, nmlen, &fattr, &scred);
           if (error)
                   goto out;
           error = smbfs_nget(VTOVFS(dvp), dvp, name, nmlen, &fattr, ap->a_vpp);
   +       if (error == 0)
   +               VOP_UNLOCK(*ap->a_vpp);
           if (error)
                   goto out;

Can you do the VOP_UNLOCK unconditionally after the `if (error)'
branch?  Generally I find it much easier to read `branch on error'
than `branch on success' and I try to adhere to that in new code.
There are a few other cases of this in your patch, although some match
the surrounding style of doing `if (error == 0)' or would require new
labels so I wouldn't change those.

   --- sys/rump/librump/rumpvfs/rumpfs.c        17 Jan 2014 10:55:03 -0000      
1.122
   +++ sys/rump/librump/rumpvfs/rumpfs.c        20 Jan 2014 09:10:53 -0000
   @@ -564,9 +564,10 @@ makeprivate(enum vtype vt, mode_t mode, 
           return rn;
    }

    static int
   -makevnode(struct mount *mp, struct rumpfs_node *rn, struct vnode **vpp)
   +makevnode(struct mount *mp, struct rumpfs_node *rn, struct vnode **vpp,
   +    bool lock_result)

There are only a couple cases of makevnode(..., true) in your patch,
in rump_vop_lookup and rumpfs_mountfs.  Instead of adding an argument
to makevnode, why not just call vn_lock after makevnode in those
cases?

   @@ -183,16 +184,17 @@ ext2fs_mknod(void *v)
            * Remove inode so that it will be reloaded by VFS_VGET and
            * checked to see if it is an alias of an existing entry in
            * the inode cache.
            */
   -       VOP_UNLOCK(*vpp);
           (*vpp)->v_type = VNON;
   +       VOP_UNLOCK(*vpp);

Can you do this one in a separate tiny commit?  It looks like an
unrelated bug fix.


Home | Main Index | Thread Index | Old Index