aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2013-09-05 04:00:48 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2013-09-05 04:00:48 +0000
commitd15fba2690e73c4b2d2eda3e642fcc24426f7d2c (patch)
tree05b524383f2fda5bb0d66ddd5d732ff41f5367ad
parent11720a8fdf3b4ea1106f9ecaa1e58bf8cb426b35 (diff)
downloadsrc-d15fba2690e73c4b2d2eda3e642fcc24426f7d2c.tar.gz
src-d15fba2690e73c4b2d2eda3e642fcc24426f7d2c.zip
MFS of 255104:
MFC of 253998: This bug fix is in a code path in rename taken when there is a collision between a rename and an open system call for the same target file. Here, rename releases its vnode references, waits for the open to finish, and then restarts by reacquiring its needed vnode locks. In this case, rename was unlocking but failing to release its reference to one of its held vnodes. The effect was that even after all the actual references to the vnode had gone, the vnode still showed active references. For files that had been removed, their space was not reclaimed until the filesystem was forcibly unmounted. This bug manifested itself in the Postgres server which would leak/lose hundreds of files per day amounting to many gigabytes of disk space. This bug required shutting down Postgres, forcibly unmounting its filesystem, remounting its filesystem and restarting Postgres every few days to recover the lost space. Reported by: Dan Thomas and Palle Girgensohn Bug-fix by: kib Tested by: Dan Thomas and Palle Girgensohn Approved by: re@ (Marius Strobl <marius@freebsd.org>)
Notes
Notes: svn path=/releng/9.2/; revision=255231
-rw-r--r--sys/ufs/ufs/ufs_vnops.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 487477c0c954..b70166d8c698 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -1271,7 +1271,7 @@ relock:
error = VFS_VGET(mp, ino, LK_EXCLUSIVE, &nvp);
if (error != 0)
goto releout;
- VOP_UNLOCK(nvp, 0);
+ vput(nvp);
atomic_add_int(&rename_restarts, 1);
goto relock;
}