Permalink
Browse files

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>)
  • Loading branch information...
1 parent 741776f commit 0ec41e16d207054dcca387f6ab2afa32f6d100c2 mckusick committed Sep 5, 2013
Showing with 1 addition and 1 deletion.
  1. +1 −1 sys/ufs/ufs/ufs_vnops.c
@@ -1271,7 +1271,7 @@ ufs_rename(ap)
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;
}

0 comments on commit 0ec41e1

Please sign in to comment.