svn commit: r225326 - in stable/8/sys:
cddl/contrib/opensolaris/uts/common/fs/zfs kern sys ufs/ffs
Martin Matuska
mm at FreeBSD.org
Fri Sep 2 08:19:20 UTC 2011
Author: mm
Date: Fri Sep 2 08:19:19 2011
New Revision: 225326
URL: http://svn.freebsd.org/changeset/base/225326
Log:
MFC r226155:
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
Modified:
stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
stable/8/sys/kern/vfs_vnops.c
stable/8/sys/sys/vnode.h
stable/8/sys/ufs/ffs/ffs_inode.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Fri Sep 2 08:15:48 2011 (r225325)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Fri Sep 2 08:19:19 2011 (r225326)
@@ -1259,6 +1259,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];
@@ -1334,8 +1335,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);
@@ -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 (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);
Modified: stable/8/sys/kern/vfs_vnops.c
==============================================================================
--- stable/8/sys/kern/vfs_vnops.c Fri Sep 2 08:15:48 2011 (r225325)
+++ stable/8/sys/kern/vfs_vnops.c Fri Sep 2 08:19:19 2011 (r225326)
@@ -63,6 +63,9 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
+#include <vm/vm.h>
+#include <vm/vm_object.h>
+
static fo_rdwr_t vn_read;
static fo_rdwr_t vn_write;
static fo_truncate_t vn_truncate;
@@ -1353,3 +1356,15 @@ vn_rlimit_fsize(const struct vnode *vp,
return (0);
}
+
+void
+vn_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, 0);
+ VM_OBJECT_UNLOCK(object);
+}
Modified: stable/8/sys/sys/vnode.h
==============================================================================
--- stable/8/sys/sys/vnode.h Fri Sep 2 08:15:48 2011 (r225325)
+++ stable/8/sys/sys/vnode.h Fri Sep 2 08:19:19 2011 (r225326)
@@ -644,6 +644,7 @@ int _vn_lock(struct vnode *vp, int flags
int vn_open(struct nameidata *ndp, int *flagp, int cmode, struct file *fp);
int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode,
u_int vn_open_flags, struct ucred *cred, struct file *fp);
+void vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end);
int vn_pollrecord(struct vnode *vp, struct thread *p, int events);
int vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base,
int len, off_t offset, enum uio_seg segflg, int ioflg,
Modified: stable/8/sys/ufs/ffs/ffs_inode.c
==============================================================================
--- stable/8/sys/ufs/ffs/ffs_inode.c Fri Sep 2 08:15:48 2011 (r225325)
+++ stable/8/sys/ufs/ffs/ffs_inode.c Fri Sep 2 08:19:19 2011 (r225326)
@@ -129,18 +129,6 @@ 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 */
@@ -218,7 +206,7 @@ ffs_truncate(vp, length, flags, cred, td
(void) chkdq(ip, -extblocks, NOCRED, 0);
#endif
vinvalbuf(vp, V_ALT, 0, 0);
- ffs_pages_remove(vp,
+ vn_pages_remove(vp,
OFF_TO_IDX(lblktosize(fs, -extblocks)), 0);
ip->i_din2->di_extsize = 0;
for (i = 0; i < NXADDR; i++) {
@@ -297,7 +285,7 @@ ffs_truncate(vp, length, flags, cred, td
ASSERT_VOP_LOCKED(vp, "ffs_truncate1");
vinvalbuf(vp, needextclean ? 0 : V_NORMAL, 0, 0);
if (!needextclean)
- ffs_pages_remove(vp, 0,
+ vn_pages_remove(vp, 0,
OFF_TO_IDX(lblktosize(fs, -extblocks)));
vnode_pager_setsize(vp, 0);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
More information about the svn-src-stable-8
mailing list