aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-01-28 13:34:56 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-02-12 01:02:21 +0000
commit038fe6e089f03ca864c1dd5ac0c76404a13bbe79 (patch)
treecb3248e35acdeea52a6097d96ec778c72e85eced /sys
parent74a3652f832f4ed0f1ad9f7eb60d70013b478e1a (diff)
downloadsrc-038fe6e089f03ca864c1dd5ac0c76404a13bbe79.tar.gz
src-038fe6e089f03ca864c1dd5ac0c76404a13bbe79.zip
ufs_rename: use VOP_VPUT_PAIR and rely on directory sync/truncation there
Suggested by: mckusick Reviewed by: chs, mckusick Tested by: pho MFC after: 2 weeks Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys')
-rw-r--r--sys/ufs/ufs/ufs_vnops.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 70b5a44ca21d..c101e699bad6 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -1676,38 +1676,16 @@ unlockout:
vput(fdvp);
vput(fvp);
- if (tvp)
- vput(tvp);
+
/*
- * If compaction or fsync was requested do it now that other locks
- * are no longer needed.
+ * If compaction or fsync was requested do it in
+ * ffs_vput_pair() now that other locks are no longer needed.
*/
if (error == 0 && endoff != 0) {
- do {
- error = UFS_TRUNCATE(tdvp, endoff, IO_NORMAL |
- (DOINGASYNC(tdvp) ? 0 : IO_SYNC), tcnp->cn_cred);
- } while (error == ERELOOKUP);
- if (error != 0 && !ffs_fsfail_cleanup(VFSTOUFS(mp), error))
- vn_printf(tdvp,
- "ufs_rename: failed to truncate, error %d\n",
- error);
-#ifdef UFS_DIRHASH
- if (error != 0)
- ufsdirhash_free(tdp);
-#endif
- /*
- * Even if the directory compaction failed, rename was
- * succesful. Do not propagate a UFS_TRUNCATE() error
- * to the caller.
- */
- error = 0;
- }
- if (error == 0 && tdp->i_flag & IN_NEEDSYNC) {
- do {
- error = VOP_FSYNC(tdvp, MNT_WAIT, td);
- } while (error == ERELOOKUP);
+ UFS_INODE_SET_FLAG(tdp, IN_ENDOFF);
+ SET_I_ENDOFF(tdp, endoff);
}
- vput(tdvp);
+ VOP_VPUT_PAIR(tdvp, &tvp, true);
return (error);
bad: