Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Jun 2010 15:58:25 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        fs@freebsd.org
Cc:        alc@freebsd.org, pho@freebsd.org
Subject:   Tmpfs elimination of double-copy
Message-ID:  <20100621125825.GG13238@deviant.kiev.zoral.com.ua>

next in thread | raw e-mail | index | archive | help

--zd5GkkQQtETumrwc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi,
Below is the patch that eliminates second copy of the data kept by tmpfs
in case a file is mapped. Also, it removes potential deadlocks due to
tmpfs doing copyin/out while page is busy. It is possible that patch
also fixes known issue with sendfile(2) of tmpfs file, but I did not
verified this.

Patch essentially consists of three parts:
- move of vm_object' vnp_size from the type-discriminated union to the
  vm_object proper;
- making vm not choke when vm object held in the struct vnode' v_object
  is default or swap object instead of vnode object;
- use of the swap object that keeps data for tmpfs VREG file, also as
  v_object.

Peter Holm helped me with the patch, apparently we survive fsx and stress2.

diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/s=
ys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index adeabfb..0cfe0d9 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -339,7 +339,7 @@ again:
=20
 			if (vm_page_sleep_if_busy(m, FALSE, "zfsmwb"))
 				goto again;
-			fsize =3D obj->un_pager.vnp.vnp_size;
+			fsize =3D obj->vnp_size;
 			vm_page_busy(m);
 			vm_page_lock_queues();
 			vm_page_undirty(m);
diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c
index b6c5cfe..7297f5a 100644
--- a/sys/fs/tmpfs/tmpfs_subr.c
+++ b/sys/fs/tmpfs/tmpfs_subr.c
@@ -379,13 +379,17 @@ loop:
 		/* FALLTHROUGH */
 	case VLNK:
 		/* FALLTHROUGH */
-	case VREG:
-		/* FALLTHROUGH */
 	case VSOCK:
 		break;
 	case VFIFO:
 		vp->v_op =3D &tmpfs_fifoop_entries;
 		break;
+	case VREG:
+		VI_LOCK(vp);
+		KASSERT(vp->v_object =3D=3D NULL, ("Not NULL v_object in tmpfs"));
+		vp->v_object =3D node->tn_reg.tn_aobj;
+		VI_UNLOCK(vp);
+		break;
 	case VDIR:
 		MPASS(node->tn_dir.tn_parent !=3D NULL);
 		if (node->tn_dir.tn_parent =3D=3D node)
@@ -396,7 +400,6 @@ loop:
 		panic("tmpfs_alloc_vp: type %p %d", node, (int)node->tn_type);
 	}
=20
-	vnode_pager_setsize(vp, node->tn_size);
 	error =3D insmntque(vp, mp);
 	if (error)
 		vp =3D NULL;
@@ -849,11 +852,13 @@ tmpfs_dir_getdents(struct tmpfs_node *node, struct ui=
o *uio, off_t *cntp)
 int
 tmpfs_reg_resize(struct vnode *vp, off_t newsize)
 {
-	int error;
-	size_t newpages, oldpages;
 	struct tmpfs_mount *tmp;
 	struct tmpfs_node *node;
+	vm_object_t uobj;
+	vm_page_t m;
 	off_t oldsize;
+	size_t newpages, oldpages, zerolen;
+	int error;
=20
 	MPASS(vp->v_type =3D=3D VREG);
 	MPASS(newsize >=3D 0);
@@ -883,41 +888,38 @@ tmpfs_reg_resize(struct vnode *vp, off_t newsize)
 	TMPFS_UNLOCK(tmp);
=20
 	node->tn_size =3D newsize;
-	vnode_pager_setsize(vp, newsize);
+	uobj =3D node->tn_reg.tn_aobj;
+	VM_OBJECT_LOCK(uobj);
 	if (newsize < oldsize) {
-		size_t zerolen =3D round_page(newsize) - newsize;
-		vm_object_t uobj =3D node->tn_reg.tn_aobj;
-		vm_page_t m;
-
 		/*
 		 * free "backing store"
 		 */
-		VM_OBJECT_LOCK(uobj);
 		if (newpages < oldpages) {
-			swap_pager_freespace(uobj,
-						newpages, oldpages - newpages);
-			vm_object_page_remove(uobj,
-				OFF_TO_IDX(newsize + PAGE_MASK), 0, FALSE);
+			swap_pager_freespace(uobj, newpages, oldpages -
+			    newpages);
+			vm_object_page_remove(uobj, OFF_TO_IDX(newsize +
+			    PAGE_MASK), 0, FALSE);
 		}
=20
 		/*
 		 * zero out the truncated part of the last page.
 		 */
-
+		zerolen =3D round_page(newsize) - newsize;
 		if (zerolen > 0) {
 			m =3D vm_page_grab(uobj, OFF_TO_IDX(newsize),
 			    VM_ALLOC_NOBUSY | VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
 			pmap_zero_page_area(m, PAGE_SIZE - zerolen,
 				zerolen);
 		}
-		VM_OBJECT_UNLOCK(uobj);
-
 	}
+	uobj->size =3D newpages;
+	uobj->vnp_size =3D newsize;
+	VM_OBJECT_UNLOCK(uobj);
=20
 	error =3D 0;
=20
 out:
-	return error;
+	return (error);
 }
=20
 /* --------------------------------------------------------------------- */
diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index 88e0939..97d3cc7 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -433,7 +433,6 @@ tmpfs_setattr(struct vop_setattr_args *v)
 	return error;
 }
=20
-/* --------------------------------------------------------------------- */
 static int
 tmpfs_nocacheread(vm_object_t tobj, vm_pindex_t idx,
     vm_offset_t offset, size_t tlen, struct uio *uio)
@@ -449,12 +448,14 @@ tmpfs_nocacheread(vm_object_t tobj, vm_pindex_t idx,
 		if (vm_pager_has_page(tobj, idx, NULL, NULL)) {
 			error =3D vm_pager_get_pages(tobj, &m, 1, 0);
 			if (error !=3D 0) {
+				vm_page_wakeup(m);
 				printf("tmpfs get pages from pager error [read]\n");
 				goto out;
 			}
 		} else
 			vm_page_zero_invalid(m, TRUE);
 	}
+	vm_page_wakeup(m);
 	VM_OBJECT_UNLOCK(tobj);
 	error =3D uiomove_fromphys(&m, offset, tlen, uio);
 	VM_OBJECT_LOCK(tobj);
@@ -462,124 +463,26 @@ out:
 	vm_page_lock(m);
 	vm_page_unwire(m, TRUE);
 	vm_page_unlock(m);
-	vm_page_wakeup(m);
 	vm_object_pip_subtract(tobj, 1);
 	VM_OBJECT_UNLOCK(tobj);
=20
 	return (error);
 }
=20
-static __inline int
-tmpfs_nocacheread_buf(vm_object_t tobj, vm_pindex_t idx,
-    vm_offset_t offset, size_t tlen, void *buf)
-{
-	struct uio uio;
-	struct iovec iov;
-
-	uio.uio_iovcnt =3D 1;
-	uio.uio_iov =3D &iov;
-	iov.iov_base =3D buf;
-	iov.iov_len =3D tlen;
-
-	uio.uio_offset =3D 0;
-	uio.uio_resid =3D tlen;
-	uio.uio_rw =3D UIO_READ;
-	uio.uio_segflg =3D UIO_SYSSPACE;
-	uio.uio_td =3D curthread;
-
-	return (tmpfs_nocacheread(tobj, idx, offset, tlen, &uio));
-}
-
-static int
-tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct ui=
o *uio)
-{
-	struct sf_buf	*sf;
-	vm_pindex_t	idx;
-	vm_page_t	m;
-	vm_offset_t	offset;
-	off_t		addr;
-	size_t		tlen;
-	char		*ma;
-	int		error;
-
-	addr =3D uio->uio_offset;
-	idx =3D OFF_TO_IDX(addr);
-	offset =3D addr & PAGE_MASK;
-	tlen =3D MIN(PAGE_SIZE - offset, len);
-
-	if ((vobj =3D=3D NULL) ||
-	    (vobj->resident_page_count =3D=3D 0 && vobj->cache =3D=3D NULL))
-		goto nocache;
-
-	VM_OBJECT_LOCK(vobj);
-lookupvpg:
-	if (((m =3D vm_page_lookup(vobj, idx)) !=3D NULL) &&
-	    vm_page_is_valid(m, offset, tlen)) {
-		if ((m->oflags & VPO_BUSY) !=3D 0) {
-			/*
-			 * Reference the page before unlocking and sleeping so
-			 * that the page daemon is less likely to reclaim it. =20
-			 */
-			vm_page_lock_queues();
-			vm_page_flag_set(m, PG_REFERENCED);
-			vm_page_sleep(m, "tmfsmr");
-			goto lookupvpg;
-		}
-		vm_page_busy(m);
-		VM_OBJECT_UNLOCK(vobj);
-		error =3D uiomove_fromphys(&m, offset, tlen, uio);
-		VM_OBJECT_LOCK(vobj);
-		vm_page_wakeup(m);
-		VM_OBJECT_UNLOCK(vobj);
-		return	(error);
-	} else if (m !=3D NULL && uio->uio_segflg =3D=3D UIO_NOCOPY) {
-		if ((m->oflags & VPO_BUSY) !=3D 0) {
-			/*
-			 * Reference the page before unlocking and sleeping so
-			 * that the page daemon is less likely to reclaim it. =20
-			 */
-			vm_page_lock_queues();
-			vm_page_flag_set(m, PG_REFERENCED);
-			vm_page_sleep(m, "tmfsmr");
-			goto lookupvpg;
-		}
-		vm_page_busy(m);
-		VM_OBJECT_UNLOCK(vobj);
-		sched_pin();
-		sf =3D sf_buf_alloc(m, SFB_CPUPRIVATE);
-		ma =3D (char *)sf_buf_kva(sf);
-		error =3D tmpfs_nocacheread_buf(tobj, idx, offset, tlen,
-		    ma + offset);
-		if (error =3D=3D 0) {
-			uio->uio_offset +=3D tlen;
-			uio->uio_resid -=3D tlen;
-		}
-		sf_buf_free(sf);
-		sched_unpin();
-		VM_OBJECT_LOCK(vobj);
-		vm_page_wakeup(m);
-		VM_OBJECT_UNLOCK(vobj);
-		return	(error);
-	}
-	VM_OBJECT_UNLOCK(vobj);
-nocache:
-	error =3D tmpfs_nocacheread(tobj, idx, offset, tlen, uio);
-
-	return	(error);
-}
-
 static int
 tmpfs_read(struct vop_read_args *v)
 {
 	struct vnode *vp =3D v->a_vp;
 	struct uio *uio =3D v->a_uio;
-
 	struct tmpfs_node *node;
 	vm_object_t uobj;
 	size_t len;
 	int resid;
-
 	int error =3D 0;
+	vm_pindex_t	idx;
+	vm_offset_t	offset;
+	off_t		addr;
+	size_t		tlen;
=20
 	node =3D VP_TO_TMPFS_NODE(vp);
=20
@@ -603,7 +506,11 @@ tmpfs_read(struct vop_read_args *v)
 		len =3D MIN(node->tn_size - uio->uio_offset, resid);
 		if (len =3D=3D 0)
 			break;
-		error =3D tmpfs_mappedread(vp->v_object, uobj, len, uio);
+		addr =3D uio->uio_offset;
+		idx =3D OFF_TO_IDX(addr);
+		offset =3D addr & PAGE_MASK;
+		tlen =3D MIN(PAGE_SIZE - offset, len);
+		error =3D tmpfs_nocacheread(uobj, idx, offset, tlen, uio);
 		if ((error !=3D 0) || (resid =3D=3D uio->uio_resid))
 			break;
 	}
@@ -616,10 +523,10 @@ out:
 /* --------------------------------------------------------------------- */
=20
 static int
-tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct u=
io *uio)
+tmpfs_mappedwrite(vm_object_t tobj, size_t len, struct uio *uio)
 {
 	vm_pindex_t	idx;
-	vm_page_t	vpg, tpg;
+	vm_page_t	tpg;
 	vm_offset_t	offset;
 	off_t		addr;
 	size_t		tlen;
@@ -632,37 +539,6 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, =
size_t len, struct uio *ui
 	offset =3D addr & PAGE_MASK;
 	tlen =3D MIN(PAGE_SIZE - offset, len);
=20
-	if ((vobj =3D=3D NULL) ||
-	    (vobj->resident_page_count =3D=3D 0 && vobj->cache =3D=3D NULL)) {
-		vpg =3D NULL;
-		goto nocache;
-	}
-
-	VM_OBJECT_LOCK(vobj);
-lookupvpg:
-	if (((vpg =3D vm_page_lookup(vobj, idx)) !=3D NULL) &&
-	    vm_page_is_valid(vpg, offset, tlen)) {
-		if ((vpg->oflags & VPO_BUSY) !=3D 0) {
-			/*
-			 * Reference the page before unlocking and sleeping so
-			 * that the page daemon is less likely to reclaim it. =20
-			 */
-			vm_page_lock_queues();
-			vm_page_flag_set(vpg, PG_REFERENCED);
-			vm_page_sleep(vpg, "tmfsmw");
-			goto lookupvpg;
-		}
-		vm_page_busy(vpg);
-		vm_page_undirty(vpg);
-		VM_OBJECT_UNLOCK(vobj);
-		error =3D uiomove_fromphys(&vpg, offset, tlen, uio);
-	} else {
-		if (__predict_false(vobj->cache !=3D NULL))
-			vm_page_cache_free(vobj, idx, idx + 1);
-		VM_OBJECT_UNLOCK(vobj);
-		vpg =3D NULL;
-	}
-nocache:
 	VM_OBJECT_LOCK(tobj);
 	vm_object_pip_add(tobj, 1);
 	tpg =3D vm_page_grab(tobj, idx, VM_ALLOC_WIRED |
@@ -671,23 +547,18 @@ nocache:
 		if (vm_pager_has_page(tobj, idx, NULL, NULL)) {
 			error =3D vm_pager_get_pages(tobj, &tpg, 1, 0);
 			if (error !=3D 0) {
+				vm_page_wakeup(tpg);
 				printf("tmpfs get pages from pager error [write]\n");
 				goto out;
 			}
 		} else
 			vm_page_zero_invalid(tpg, TRUE);
 	}
+	vm_page_wakeup(tpg);
 	VM_OBJECT_UNLOCK(tobj);
-	if (vpg =3D=3D NULL)
-		error =3D uiomove_fromphys(&tpg, offset, tlen, uio);
-	else {
-		KASSERT(vpg->valid =3D=3D VM_PAGE_BITS_ALL, ("parts of vpg invalid"));
-		pmap_copy_page(vpg, tpg);
-	}
+	error =3D uiomove_fromphys(&tpg, offset, tlen, uio);
 	VM_OBJECT_LOCK(tobj);
 out:
-	if (vobj !=3D NULL)
-		VM_OBJECT_LOCK(vobj);
 	if (error =3D=3D 0) {
 		KASSERT(tpg->valid =3D=3D VM_PAGE_BITS_ALL,
 		    ("parts of tpg invalid"));
@@ -696,11 +567,6 @@ out:
 	vm_page_lock(tpg);
 	vm_page_unwire(tpg, TRUE);
 	vm_page_unlock(tpg);
-	vm_page_wakeup(tpg);
-	if (vpg !=3D NULL)
-		vm_page_wakeup(vpg);
-	if (vobj !=3D NULL)
-		VM_OBJECT_UNLOCK(vobj);
 	vm_object_pip_subtract(tobj, 1);
 	VM_OBJECT_UNLOCK(tobj);
=20
@@ -759,7 +625,7 @@ tmpfs_write(struct vop_write_args *v)
 		len =3D MIN(node->tn_size - uio->uio_offset, resid);
 		if (len =3D=3D 0)
 			break;
-		error =3D tmpfs_mappedwrite(vp->v_object, uobj, len, uio);
+		error =3D tmpfs_mappedwrite(uobj, len, uio);
 		if ((error !=3D 0) || (resid =3D=3D uio->uio_resid))
 			break;
 	}
@@ -1425,7 +1291,7 @@ tmpfs_reclaim(struct vop_reclaim_args *v)
 	node =3D VP_TO_TMPFS_NODE(vp);
 	tmp =3D VFS_TO_TMPFS(vp->v_mount);
=20
-	vnode_destroy_vobject(vp);
+	vp->v_object =3D NULL;
 	cache_purge(vp);
=20
 	TMPFS_NODE_LOCK(node);
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index c48e0f5..754092f 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -447,7 +447,7 @@ __elfN(load_section)(struct vmspace *vmspace,
 	 * While I'm here, might as well check for something else that
 	 * is invalid: filsz cannot be greater than memsz.
 	 */
-	if ((off_t)filsz + offset > object->un_pager.vnp.vnp_size ||
+	if ((off_t)filsz + offset > object->vnp_size ||
 	    filsz > memsz) {
 		uprintf("elf_load_section: truncated ELF file\n");
 		return (ENOEXEC);
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index adcb852..ee80b3e 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -2033,12 +2033,12 @@ retry_space:
 			 */
 			pgoff =3D (vm_offset_t)(off & PAGE_MASK);
 			xfsize =3D omin(PAGE_SIZE - pgoff,
-			    obj->un_pager.vnp.vnp_size - uap->offset -
+			    obj->vnp_size - uap->offset -
 			    fsbytes - loopbytes);
 			if (uap->nbytes)
 				rem =3D (uap->nbytes - fsbytes - loopbytes);
 			else
-				rem =3D obj->un_pager.vnp.vnp_size -
+				rem =3D obj->vnp_size -
 				    uap->offset - fsbytes - loopbytes;
 			xfsize =3D omin(rem, xfsize);
 			xfsize =3D omin(space - loopbytes, xfsize);
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 3d72123..ff06892 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1222,7 +1222,7 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize,
 			error =3D EINVAL;
 			goto done;
 		}
-		if (obj->handle !=3D vp) {
+		if (obj->type =3D=3D OBJT_VNODE && obj->handle !=3D vp) {
 			vput(vp);
 			vp =3D (struct vnode*)obj->handle;
 			vget(vp, LK_SHARED, td);
@@ -1261,7 +1261,14 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize,
 	objsize =3D round_page(va.va_size);
 	if (va.va_nlink =3D=3D 0)
 		flags |=3D MAP_NOSYNC;
-	obj =3D vm_pager_allocate(OBJT_VNODE, vp, objsize, prot, foff, td->td_ucr=
ed);
+	if (obj->type =3D=3D OBJT_VNODE)
+		obj =3D vm_pager_allocate(OBJT_VNODE, vp, objsize, prot, foff,
+		    td->td_ucred);
+	else {
+		KASSERT(obj->type =3D=3D OBJT_DEFAULT || obj->type =3D=3D OBJT_SWAP,
+		    ("wrong object type"));
+		vm_object_reference(obj);
+	}
 	if (obj =3D=3D NULL) {
 		error =3D ENOMEM;
 		goto done;
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
index 6a9f129..0120d32 100644
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -106,15 +106,6 @@ struct vm_object {
 	void *handle;
 	union {
 		/*
-		 * VNode pager
-		 *
-		 *	vnp_size - current size of file
-		 */
-		struct {
-			off_t vnp_size;
-		} vnp;
-
-		/*
 		 * Device pager
 		 *
 		 *	devp_pglist - list of allocated pages
@@ -145,6 +136,7 @@ struct vm_object {
 	} un_pager;
 	struct uidinfo *uip;
 	vm_ooffset_t charge;
+	off_t vnp_size; /* current size of file for vnode pager */
 };
=20
 /*
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index f497d41..a1cfc01 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -212,8 +212,7 @@ retry:
 		msleep(object, VM_OBJECT_MTX(object), PDROP | PVM, "vadead", 0);
 	}
=20
-	if (vp->v_usecount =3D=3D 0)
-		panic("vnode_pager_alloc: no vnode reference");
+	KASSERT(vp->v_usecount !=3D 0, ("vnode_pager_alloc: no vnode reference"));
=20
 	if (object =3D=3D NULL) {
 		/*
@@ -221,7 +220,7 @@ retry:
 		 */
 		object =3D vm_object_allocate(OBJT_VNODE, OFF_TO_IDX(round_page(size)));
=20
-		object->un_pager.vnp.vnp_size =3D size;
+		object->vnp_size =3D size;
=20
 		object->handle =3D handle;
 		VI_LOCK(vp);
@@ -301,7 +300,7 @@ vnode_pager_haspage(object, pindex, before, after)
 	 * If the offset is beyond end of file we do
 	 * not have the page.
 	 */
-	if (IDX_TO_OFF(pindex) >=3D object->un_pager.vnp.vnp_size)
+	if (IDX_TO_OFF(pindex) >=3D object->vnp_size)
 		return FALSE;
=20
 	bsize =3D vp->v_mount->mnt_stat.f_iosize;
@@ -333,9 +332,8 @@ vnode_pager_haspage(object, pindex, before, after)
 			*after *=3D pagesperblock;
 			numafter =3D pagesperblock - (poff + 1);
 			if (IDX_TO_OFF(pindex + numafter) >
-			    object->un_pager.vnp.vnp_size) {
-				numafter =3D
-		    		    OFF_TO_IDX(object->un_pager.vnp.vnp_size) -
+			    object->vnp_size) {
+				numafter =3D OFF_TO_IDX(object->vnp_size) -
 				    pindex;
 			}
 			*after +=3D numafter;
@@ -369,11 +367,11 @@ vnode_pager_setsize(vp, nsize)
 	vm_page_t m;
 	vm_pindex_t nobjsize;
=20
-	if ((object =3D vp->v_object) =3D=3D NULL)
+	if ((object =3D vp->v_object) =3D=3D NULL || object->type !=3D OBJT_VNODE)
 		return;
 /* 	ASSERT_VOP_ELOCKED(vp, "vnode_pager_setsize and not locked vnode"); */
 	VM_OBJECT_LOCK(object);
-	if (nsize =3D=3D object->un_pager.vnp.vnp_size) {
+	if (nsize =3D=3D object->vnp_size) {
 		/*
 		 * Hasn't changed size
 		 */
@@ -381,7 +379,7 @@ vnode_pager_setsize(vp, nsize)
 		return;
 	}
 	nobjsize =3D OFF_TO_IDX(nsize + PAGE_MASK);
-	if (nsize < object->un_pager.vnp.vnp_size) {
+	if (nsize < object->vnp_size) {
 		/*
 		 * File has shrunk. Toss any cached pages beyond the new EOF.
 		 */
@@ -436,7 +434,7 @@ vnode_pager_setsize(vp, nsize)
 			    nobjsize);
 		}
 	}
-	object->un_pager.vnp.vnp_size =3D nsize;
+	object->vnp_size =3D nsize;
 	object->size =3D nobjsize;
 	VM_OBJECT_UNLOCK(object);
 }
@@ -513,7 +511,7 @@ vnode_pager_input_smlfs(object, m)
 			continue;
=20
 		address =3D IDX_TO_OFF(m->pindex) + i * bsize;
-		if (address >=3D object->un_pager.vnp.vnp_size) {
+		if (address >=3D object->vnp_size) {
 			fileaddr =3D -1;
 		} else {
 			error =3D vnode_pager_addr(vp, address, &fileaddr, NULL);
@@ -590,12 +588,12 @@ vnode_pager_input_old(object, m)
 	/*
 	 * Return failure if beyond current EOF
 	 */
-	if (IDX_TO_OFF(m->pindex) >=3D object->un_pager.vnp.vnp_size) {
+	if (IDX_TO_OFF(m->pindex) >=3D object->vnp_size) {
 		return VM_PAGER_BAD;
 	} else {
 		size =3D PAGE_SIZE;
-		if (IDX_TO_OFF(m->pindex) + size > object->un_pager.vnp.vnp_size)
-			size =3D object->un_pager.vnp.vnp_size - IDX_TO_OFF(m->pindex);
+		if (IDX_TO_OFF(m->pindex) + size > object->vnp_size)
+			size =3D object->vnp_size - IDX_TO_OFF(m->pindex);
 		vp =3D object->handle;
 		VM_OBJECT_UNLOCK(object);
=20
@@ -815,13 +813,13 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpag=
e)
 		}
 		if (firstaddr =3D=3D -1) {
 			VM_OBJECT_LOCK(object);
-			if (i =3D=3D reqpage && foff < object->un_pager.vnp.vnp_size) {
+			if (i =3D=3D reqpage && foff < object->vnp_size) {
 				panic("vnode_pager_getpages: unexpected missing page: firstaddr: %jd, =
foff: 0x%jx%08jx, vnp_size: 0x%jx%08jx",
 				    (intmax_t)firstaddr, (uintmax_t)(foff >> 32),
 				    (uintmax_t)foff,
 				    (uintmax_t)
-				    (object->un_pager.vnp.vnp_size >> 32),
-				    (uintmax_t)object->un_pager.vnp.vnp_size);
+				    (object->vnp_size >> 32),
+				    (uintmax_t)object->vnp_size);
 			}
 			vm_page_lock(m[i]);
 			vm_page_free(m[i]);
@@ -876,8 +874,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
 	 */
 	size =3D count * PAGE_SIZE;
 	KASSERT(count > 0, ("zero count"));
-	if ((foff + size) > object->un_pager.vnp.vnp_size)
-		size =3D object->un_pager.vnp.vnp_size - foff;
+	if ((foff + size) > object->vnp_size)
+		size =3D object->vnp_size - foff;
 	KASSERT(size > 0, ("zero size"));
=20
 	/*
@@ -944,7 +942,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
 		nextoff =3D tfoff + PAGE_SIZE;
 		mt =3D m[i];
=20
-		if (nextoff <=3D object->un_pager.vnp.vnp_size) {
+		if (nextoff <=3D object->vnp_size) {
 			/*
 			 * Read filled up entire page.
 			 */
@@ -964,9 +962,9 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
 			 * read.
 			 */
 			vm_page_set_valid(mt, 0,
-			    object->un_pager.vnp.vnp_size - tfoff);
+			    object->vnp_size - tfoff);
 			KASSERT((mt->dirty & vm_page_bits(0,
-			    object->un_pager.vnp.vnp_size - tfoff)) =3D=3D 0,
+			    object->vnp_size - tfoff)) =3D=3D 0,
 			    ("vnode_pager_generic_getpages: page %p is dirty",
 			    mt));
 		}
@@ -1116,11 +1114,11 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_p=
age_t *ma, int bytecount,
 	 * this will screw up bogus page replacement.
 	 */
 	VM_OBJECT_LOCK(object);
-	if (maxsize + poffset > object->un_pager.vnp.vnp_size) {
-		if (object->un_pager.vnp.vnp_size > poffset) {
+	if (maxsize + poffset > object->vnp_size) {
+		if (object->vnp_size > poffset) {
 			int pgoff;
=20
-			maxsize =3D object->un_pager.vnp.vnp_size - poffset;
+			maxsize =3D object->vnp_size - poffset;
 			ncount =3D btoc(maxsize);
 			if ((pgoff =3D (int)maxsize & PAGE_MASK) !=3D 0) {
 				/*

--zd5GkkQQtETumrwc
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)

iEYEARECAAYFAkwfYfEACgkQC3+MBN1Mb4hOPACg3aznl4eTBeO3QOCKEFZsRsSO
5kwAniuYlwXBbxmU8wHXsLsweO8LTGwV
=8WDX
-----END PGP SIGNATURE-----

--zd5GkkQQtETumrwc--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100621125825.GG13238>