From 822ff01c1983ec2fd642ed7e59b9a0822f85ceed Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Fri, 11 Apr 2014 18:42:59 +0000 Subject: [PATCH 07/14] Omit needless lock/unlock in msdosfs deget. --- sys/fs/msdosfs/msdosfs_denode.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index 5f39de3..93b938a 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -138,7 +138,7 @@ static const struct genfs_ops msdosfs_genfsops = { .gop_markupdate = msdosfs_gop_markupdate, }; -static struct denode *msdosfs_hashget(dev_t, u_long, u_long, int); +static struct denode *msdosfs_hashget(dev_t, u_long, u_long, int, bool); static void msdosfs_hashins(struct denode *); static void msdosfs_hashrem(struct denode *); @@ -208,7 +208,8 @@ msdosfs_done(void) } static struct denode * -msdosfs_hashget(dev_t dev, u_long dirclust, u_long diroff, int flags) +msdosfs_hashget(dev_t dev, u_long dirclust, u_long diroff, int flags, + bool do_vget) { struct denode *dep; struct vnode *vp; @@ -221,7 +222,7 @@ loop: dev == dep->de_dev && dep->de_refcnt != 0) { vp = DETOV(dep); - if (flags == 0) { + if (!do_vget) { mutex_exit(&msdosfs_ihash_lock); } else { mutex_enter(vp->v_interlock); @@ -311,9 +312,8 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset, * deleted file is still open. */ retry: - ldep = msdosfs_hashget(pmp->pm_dev, dirclust, diroffset, LK_EXCLUSIVE); + ldep = msdosfs_hashget(pmp->pm_dev, dirclust, diroffset, 0, true); if (ldep) { - VOP_UNLOCK(DETOV(ldep)); *depp = ldep; return (0); } @@ -335,7 +335,7 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset, * vnode/inode pair and retry. */ mutex_enter(&msdosfs_hashlock); - if (msdosfs_hashget(pmp->pm_dev, dirclust, diroffset, 0)) { + if (msdosfs_hashget(pmp->pm_dev, dirclust, diroffset, 0, false)) { mutex_exit(&msdosfs_hashlock); ungetnewvnode(nvp); pool_put(&msdosfs_denode_pool, ldep); @@ -357,7 +357,6 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset, * can't be accessed until we've read it in and have done what we * need to it. */ - vn_lock(nvp, LK_EXCLUSIVE | LK_RETRY); genfs_node_init(nvp, &msdosfs_genfsops); msdosfs_hashins(ldep); mutex_exit(&msdosfs_hashlock); @@ -408,7 +407,7 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset, ldep->de_devvp = NULL; ldep->de_Name[0] = SLOT_DELETED; vready_fail(nvp); - vput(nvp); + vrele(nvp); return (error); } DE_INTERNALIZE(ldep, direntptr); @@ -442,7 +441,6 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset, vref(ldep->de_devvp); *depp = ldep; uvm_vnp_setsize(nvp, ldep->de_FileSize); - VOP_UNLOCK(nvp); vready(nvp); return (0); } -- 1.8.3.1