summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2011-08-25 08:17:39 +0000
committermm <mm@FreeBSD.org>2011-08-25 08:17:39 +0000
commite104c96f018139a8d2a85057c37ae2e5999cbd41 (patch)
treef8958cd0b60a86012d8905a34cb8bdc7e640171f /sys/cddl
parent631a8abdff140aaa997d795f570b6c5e78f34991 (diff)
downloadFreeBSD-src-e104c96f018139a8d2a85057c37ae2e5999cbd41.zip
FreeBSD-src-e104c96f018139a8d2a85057c37ae2e5999cbd41.tar.gz
Generalize ffs_pages_remove() into vn_pages_remove().
Remove mapped pages for all dataset vnodes in zfs_rezget() using new vn_pages_remove() to fix mmapped files changed by zfs rollback or zfs receive -F. PR: kern/160035, kern/156933 Reviewed by: kib, pjd Approved by: re (kib) MFC after: 1 week
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
index 0fcc850..2858812 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
@@ -1273,6 +1273,7 @@ zfs_rezget(znode_t *zp)
zfsvfs_t *zfsvfs = zp->z_zfsvfs;
dmu_object_info_t doi;
dmu_buf_t *db;
+ vnode_t *vp;
uint64_t obj_num = zp->z_id;
uint64_t mode, size;
sa_bulk_attr_t bulk[8];
@@ -1348,8 +1349,9 @@ zfs_rezget(znode_t *zp)
* that for example regular file was replaced with directory
* which has the same object number.
*/
- if (ZTOV(zp) != NULL &&
- ZTOV(zp)->v_type != IFTOVT((mode_t)zp->z_mode)) {
+ vp = ZTOV(zp);
+ if (vp != NULL &&
+ vp->v_type != IFTOVT((mode_t)zp->z_mode)) {
zfs_znode_dmu_fini(zp);
ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
return (EIO);
@@ -1357,8 +1359,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 (vp != NULL) {
+ vn_pages_remove(vp, 0, 0);
+ if (zp->z_size != size)
+ vnode_pager_setsize(vp, zp->z_size);
+ }
ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
OpenPOWER on IntegriCloud