svn commit: r255231 - releng/9.2/sys/ufs/ufs

Kirk McKusick mckusick at FreeBSD.org
Thu Sep 5 04:00:48 UTC 2013


Author: mckusick
Date: Thu Sep  5 04:00:48 2013
New Revision: 255231
URL: http://svnweb.freebsd.org/changeset/base/255231

Log:
  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 at freebsd.org>)

Modified:
  releng/9.2/sys/ufs/ufs/ufs_vnops.c
Directory Properties:
  releng/9.2/sys/   (props changed)

Modified: releng/9.2/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- releng/9.2/sys/ufs/ufs/ufs_vnops.c	Thu Sep  5 03:46:44 2013	(r255230)
+++ releng/9.2/sys/ufs/ufs/ufs_vnops.c	Thu Sep  5 04:00:48 2013	(r255231)
@@ -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;
 		}


More information about the svn-src-all mailing list