summaryrefslogtreecommitdiffstats
path: root/sys/gnu/fs/ext2fs/ext2_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/gnu/fs/ext2fs/ext2_vnops.c')
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vnops.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/sys/gnu/fs/ext2fs/ext2_vnops.c b/sys/gnu/fs/ext2fs/ext2_vnops.c
index f533012..21068e4 100644
--- a/sys/gnu/fs/ext2fs/ext2_vnops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vnops.c
@@ -301,11 +301,6 @@ ext2_remove(ap)
ip->i_flag |= IN_CHANGE;
}
out:
- if (dvp == vp)
- vrele(vp);
- else
- vput(vp);
- vput(dvp);
return (error);
}
@@ -367,7 +362,6 @@ out1:
if (tdvp != vp)
VOP_UNLOCK(vp, 0, p);
out2:
- vput(tdvp);
return (error);
}
@@ -480,7 +474,15 @@ abortit:
#endif
return (ENOENT);
}
- return (VOP_REMOVE(fdvp, fvp, fcnp));
+ error = VOP_REMOVE(fdvp, fvp, fcnp);
+ /* XXX - temporarily preserve previous behavior */
+ if (fdvp == fvp)
+ vrele(fdvp);
+ else
+ vput(fdvp);
+ if (fvp != NULLVP)
+ vput(fvp);
+ return (error);
}
if (error = vn_lock(fvp, LK_EXCLUSIVE, p))
goto abortit;
@@ -873,7 +875,6 @@ ext2_mkdir(ap)
zfree(namei_zone, cnp->cn_pnbuf);
UFS_VFREE(tvp, ip->i_number, dmode);
vput(tvp);
- vput(dvp);
return (error);
}
#endif
@@ -886,7 +887,6 @@ ext2_mkdir(ap)
zfree(namei_zone, cnp->cn_pnbuf);
UFS_VFREE(tvp, ip->i_number, dmode);
vput(tvp);
- vput(dvp);
return (error);
}
#endif
@@ -957,7 +957,6 @@ bad:
*ap->a_vpp = tvp;
out:
zfree(namei_zone, cnp->cn_pnbuf);
- vput(dvp);
return (error);
#undef DIRBLKSIZ
#define DIRBLKSIZ DEV_BSIZE
@@ -977,6 +976,7 @@ ext2_rmdir(ap)
struct vnode *vp = ap->a_vp;
struct vnode *dvp = ap->a_dvp;
struct componentname *cnp = ap->a_cnp;
+ struct proc *p = cnp->cn_proc;
struct inode *ip, *dp;
int error;
@@ -1011,8 +1011,7 @@ ext2_rmdir(ap)
dp->i_nlink--;
dp->i_flag |= IN_CHANGE;
cache_purge(dvp);
- vput(dvp);
- dvp = NULL;
+ VOP_UNLOCK(dvp, 0, p);
/*
* Truncate inode. The only stuff left
* in the directory is "." and "..". The
@@ -1025,13 +1024,10 @@ ext2_rmdir(ap)
* worry about them later.
*/
ip->i_nlink -= 2;
- error = UFS_TRUNCATE(vp, (off_t)0, IO_SYNC, cnp->cn_cred,
- cnp->cn_proc);
+ error = UFS_TRUNCATE(vp, (off_t)0, IO_SYNC, cnp->cn_cred, p);
cache_purge(ITOV(ip));
+ vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p);
out:
- if (dvp)
- vput(dvp);
- vput(vp);
return (error);
}
@@ -1098,7 +1094,6 @@ ext2_makeinode(mode, dvp, vpp, cnp)
error = UFS_VALLOC(dvp, mode, cnp->cn_cred, &tvp);
if (error) {
zfree(namei_zone, cnp->cn_pnbuf);
- vput(dvp);
return (error);
}
ip = VTOI(tvp);
@@ -1146,7 +1141,6 @@ ext2_makeinode(mode, dvp, vpp, cnp)
zfree(namei_zone, cnp->cn_pnbuf);
UFS_VFREE(tvp, ip->i_number, mode);
vput(tvp);
- vput(dvp);
return (error);
}
#endif
@@ -1159,7 +1153,6 @@ ext2_makeinode(mode, dvp, vpp, cnp)
zfree(namei_zone, cnp->cn_pnbuf);
UFS_VFREE(tvp, ip->i_number, mode);
vput(tvp);
- vput(dvp);
return (error);
}
#endif
@@ -1188,7 +1181,6 @@ ext2_makeinode(mode, dvp, vpp, cnp)
if ((cnp->cn_flags & SAVESTART) == 0)
zfree(namei_zone, cnp->cn_pnbuf);
- vput(dvp);
*vpp = tvp;
return (0);
@@ -1198,7 +1190,6 @@ bad:
* or the directory so must deallocate the inode.
*/
zfree(namei_zone, cnp->cn_pnbuf);
- vput(dvp);
ip->i_nlink = 0;
ip->i_flag |= IN_CHANGE;
vput(tvp);
OpenPOWER on IntegriCloud