tech-kern archive

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

Re: Vnode API change: VOP_LOOKUP



   Date: Mon, 3 Feb 2014 12:04:27 +0100
   From: J. Hannken-Illjes <hannken%eis.cs.tu-bs.de@localhost>

   As announced some weeks ago here comes the API change to VOP_LOOKUP:

     Change vnode operation lookup to return the resulting vnode *vpp locked.
     Change cache_lookup() to return an unlocked vnode.

Sounds like the right thing to me.  I skimmed through the patch, and I
have one question and a few little nits.

   @@ -571,8 +571,14 @@ zfs_replay_remove(zfsvfs_t *zfsvfs, lr_r
           if (error != 0) {
                   VOP_UNLOCK(ZTOV(dzp));
                   goto fail;
           }
   +       error = vn_lock(vp, LK_EXCLUSIVE);

Why LK_EXCLUSIVE and not (LK_EXCLUSIVE | LK_RETRY)?  There are a few
other cases of this too.  Are you mixing this up with a change to
allow vn_lock to fail everywhere so we can use that for transactions
and forced unmount?  While I think that will eventually be the right
thing, that should be in a separate patch so it can be systematically
done for all vn_locks.

   @@ -464,29 +464,9 @@ cache_lookup(struct vnode *dvp, const ch
            */
   [...]
   -       }
   +       KASSERT(error == 0);
 
This kassert is superfluous -- the `if (error) ... return' branch is
right above it.
 
   @@ -380,12 +380,12 @@ layer_lookup(void *v)
                   vref(dvp);
                   *ap->a_vpp = dvp;
                   vrele(lvp);
           } else if (lvp != NULL) {
   -               /* Note: dvp, ldvp and lvp are all locked. */
   +               /* Note: dvp and ldvp are all locked. */

s/all/both/1

   @@ -519,8 +519,10 @@ kernfs_lookup(void *v)
                   break;

           found:
                   error = kernfs_allocvp(dvp->v_mount, vpp, kt->kt_tag, kt, 0);
   +               if (error == 0)
   +                       VOP_UNLOCK(*vpp);
                   return (error);

I would rather write this (and a few other cases like it in the patch)
as

error = kernfs_allocvp(...);
if (error)
        return error;
VOP_UNLOCK(*vpp);
return 0;
 
in order to consistently set error branches apart and make the success
case the main flow of the code.


Home | Main Index | Thread Index | Old Index