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

Konstantin Belousov kib at FreeBSD.org
Tue Jan 20 14:00:20 PST 2009


Author: kib
Date: Tue Jan 20 22:00:19 2009
New Revision: 187490
URL: http://svn.freebsd.org/changeset/base/187490

Log:
  The r187467 should remove all pages for V_NORMAL case too, because
  indirect block pages are not removed by the mentioned invocation of
  the vnode_pager_setsize().
  
  Put a common code into the helper function ffs_pages_remove().
  
  Reported and tested by:	dchagin
  Reviewed by:	ups
  MFC after:	3 weeks

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

Modified: head/sys/ufs/ffs/ffs_inode.c
==============================================================================
--- head/sys/ufs/ffs/ffs_inode.c	Tue Jan 20 21:57:07 2009	(r187489)
+++ head/sys/ufs/ffs/ffs_inode.c	Tue Jan 20 22:00:19 2009	(r187490)
@@ -129,6 +129,18 @@ ffs_update(vp, waitfor)
 	}
 }
 
+static void
+ffs_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
+{
+	vm_object_t object;
+
+	if ((object = vp->v_object) == NULL)
+		return;
+	VM_OBJECT_LOCK(object);
+	vm_object_page_remove(object, start, end, FALSE);
+	VM_OBJECT_UNLOCK(object);
+}
+
 #define	SINGLE	0	/* index of single indirect block */
 #define	DOUBLE	1	/* index of double indirect block */
 #define	TRIPLE	2	/* index of triple indirect block */
@@ -152,7 +164,6 @@ ffs_truncate(vp, length, flags, cred, td
 	struct fs *fs;
 	struct buf *bp;
 	struct ufsmount *ump;
-	vm_object_t object;
 	int needextclean, softdepslowdown, extblocks;
 	int offset, size, level, nblocks;
 	int i, error, allerror;
@@ -207,13 +218,8 @@ ffs_truncate(vp, length, flags, cred, td
 			(void) chkdq(ip, -extblocks, NOCRED, 0);
 #endif
 			vinvalbuf(vp, V_ALT, 0, 0);
-			if ((object = vp->v_object) != NULL) {
-				VM_OBJECT_LOCK(object);
-				vm_object_page_remove(object,
-				    OFF_TO_IDX(lblktosize(fs, -extblocks)), 0,
-				    FALSE);
-				VM_OBJECT_UNLOCK(object);
-			}
+			ffs_pages_remove(vp,
+			    OFF_TO_IDX(lblktosize(fs, -extblocks)), 0);
 			ip->i_din2->di_extsize = 0;
 			for (i = 0; i < NXADDR; i++) {
 				oldblks[i] = ip->i_din2->di_extb[i];
@@ -290,6 +296,9 @@ ffs_truncate(vp, length, flags, cred, td
 			    IO_EXT | IO_NORMAL : IO_NORMAL);
 			ASSERT_VOP_LOCKED(vp, "ffs_truncate1");
 			vinvalbuf(vp, needextclean ? 0 : V_NORMAL, 0, 0);
+			if (!needextclean)
+				ffs_pages_remove(vp, 0,
+				    OFF_TO_IDX(lblktosize(fs, -extblocks)));
 			vnode_pager_setsize(vp, 0);
 			ip->i_flag |= IN_CHANGE | IN_UPDATE;
 			return (ffs_update(vp, 0));


More information about the svn-src-all mailing list