svn commit: r187468 - head/sys/ufs/ffs

Konstantin Belousov kib at FreeBSD.org
Tue Jan 20 03:30:23 PST 2009


Author: kib
Date: Tue Jan 20 11:30:22 2009
New Revision: 187468
URL: http://svn.freebsd.org/changeset/base/187468

Log:
  When extending inode size, we call vnode_pager_setsize(), to have a
  address space where to put vnode pages, and then call UFS_BALLOC(),
  to actually allocate new block and map it. When UFS_BALLOC() returns
  error, sometimes we forget to revert the vm object size increase,
  allowing for the pages that are not backed by the logical disk blocks.
  
  Revert vnode_pager_setsize() back when UFS_BALLOC() failed, for
  ffs_truncate() and ffs_write().
  
  PR:	129956
  Reviewed by:	ups
  MFC after:	3 weeks

Modified:
  head/sys/ufs/ffs/ffs_inode.c
  head/sys/ufs/ffs/ffs_vnops.c

Modified: head/sys/ufs/ffs/ffs_inode.c
==============================================================================
--- head/sys/ufs/ffs/ffs_inode.c	Tue Jan 20 11:27:45 2009	(r187467)
+++ head/sys/ufs/ffs/ffs_inode.c	Tue Jan 20 11:30:22 2009	(r187468)
@@ -305,8 +305,10 @@ ffs_truncate(vp, length, flags, cred, td
 		vnode_pager_setsize(vp, length);
 		flags |= BA_CLRBUF;
 		error = UFS_BALLOC(vp, length - 1, 1, cred, flags, &bp);
-		if (error)
+		if (error) {
+			vnode_pager_setsize(vp, osize);
 			return (error);
+		}
 		ip->i_size = length;
 		DIP_SET(ip, i_size, length);
 		if (bp->b_bufsize == fs->fs_bsize)

Modified: head/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vnops.c	Tue Jan 20 11:27:45 2009	(r187467)
+++ head/sys/ufs/ffs/ffs_vnops.c	Tue Jan 20 11:30:22 2009	(r187468)
@@ -723,8 +723,10 @@ ffs_write(ap)
 /* XXX is uio->uio_offset the right thing here? */
 		error = UFS_BALLOC(vp, uio->uio_offset, xfersize,
 		    ap->a_cred, flags, &bp);
-		if (error != 0)
+		if (error != 0) {
+			vnode_pager_setsize(vp, ip->i_size);
 			break;
+		}
 		/*
 		 * If the buffer is not valid we have to clear out any
 		 * garbage data from the pages instantiated for the buffer.


More information about the svn-src-head mailing list