tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Vnode API change: VOP_LOOKUP
On Feb 6, 2014, at 4:23 PM, Taylor R Campbell
<campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> 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.
Where possible I prefer the variant without LK_RETRY for new code as the
next vnode operation would return an error anyway when run on a dead vnode.
> @@ -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.
OK.
> @@ -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
OK.
> @@ -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.
OK.
--
J. Hannken-Illjes - hannken%eis.cs.tu-bs.de@localhost - TU Braunschweig
(Germany)
Home |
Main Index |
Thread Index |
Old Index