Patch review reguest: zfs_znode.c

Martin Matuska mm at FreeBSD.org
Wed Aug 24 19:14:15 UTC 2011


On 24. 8. 2011 19:51, Kostik Belousov wrote:
> I recommend you to create a local variable of the type vm_object_t
> and use it, instead of dereferencing the long chain of pointers.
>
> Also, consider moving ffs_pages_remove out from ffs_inode() into vfs_vnops.c,
> calling it e.g. vn_pages_remove(), and use it instead.
Thank you very much for your comments.
A new version with function moved to zfs_vnops.c and considering pjd's
remark is attached.
The function is thematically placed after static update_pages() and
before static mappedread_sf().

-- 
Martin Matuska
FreeBSD committer
http://blog.vx.sk

-------------- next part --------------
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	(revision 225140)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	(working copy)
@@ -1253,6 +1253,8 @@ again:
 	return (err);
 }
 
+extern void zfs_remove_pages(vnode_t *vp);
+
 int
 zfs_rezget(znode_t *zp)
 {
@@ -1343,8 +1345,11 @@ zfs_rezget(znode_t *zp)
 
 	zp->z_unlinked = (zp->z_links == 0);
 	zp->z_blksz = doi.doi_data_block_size;
-	if (zp->z_size != size && ZTOV(zp) != NULL)
-		vnode_pager_setsize(ZTOV(zp), zp->z_size);
+	if (ZTOV(zp) != NULL) {
+		zfs_remove_pages(ZTOV(zp));
+		if (zp->z_size != size)
+			vnode_pager_setsize(ZTOV(zp), zp->z_size);
+	}
 
 	ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
 
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(revision 225140)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(working copy)
@@ -420,6 +420,21 @@ update_pages(vnode_t *vp, int64_t start, int len,
 }
 
 /*
+ * Remove all mapped pages from a vnode
+ */
+void
+zfs_remove_pages(vnode_t *vp)
+{
+	vm_object_t obj = vp->v_object;
+
+	if (obj != NULL) {
+		VM_OBJECT_LOCK(obj);
+		vm_object_page_remove(obj, 0, 0, 0);
+		VM_OBJECT_UNLOCK(obj);
+	}
+}
+
+/*
  * Read with UIO_NOCOPY flag means that sendfile(2) requests
  * ZFS to populate a range of page cache pages with data.
  *


More information about the zfs-devel mailing list