From 57f7b636ec451b2063cb3c4c10d3c25db6430fa2 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 27 Mar 2006 01:54:18 +0000 Subject: [PATCH] Change *_pager_allocate() to take off_t instead of vm_ooffset_t. The actual underlying type (a 64 bit signed integer) is the same. Recent and upcoming work is standardizing on off_t. Move object->un_pager.vnp.vnp_size to vnode->v_filesize. As before, the field is still only valid when a VM object is associated with the vnode. --- sys/dev/disk/vn/vn.c | 7 +-- sys/kern/imgact_elf.c | 9 ++-- sys/kern/sysv_shm.c | 5 +-- sys/kern/uipc_syscalls.c | 4 +- sys/kern/vfs_lock.c | 3 +- sys/sys/vnode.h | 6 ++- sys/vfs/isofs/cd9660/cd9660_vfsops.c | 8 ++-- sys/vfs/nfs/nfs_node.c | 5 ++- sys/vfs/portal/portal_vnops.c | 3 +- sys/vfs/ufs/ufs_readwrite.c | 9 ++-- sys/vfs/ufs/ufs_vnops.c | 4 +- sys/vm/default_pager.c | 8 ++-- sys/vm/device_pager.c | 7 ++- sys/vm/phys_pager.c | 5 +-- sys/vm/swap_pager.c | 9 ++-- sys/vm/vm_map.c | 6 +-- sys/vm/vm_mmap.c | 9 ++-- sys/vm/vm_object.h | 11 +---- sys/vm/vm_pager.c | 12 +++--- sys/vm/vm_pager.h | 4 +- sys/vm/vnode_pager.c | 64 ++++++++++++++-------------- sys/vm/vnode_pager.h | 4 +- 22 files changed, 97 insertions(+), 105 deletions(-) diff --git a/sys/dev/disk/vn/vn.c b/sys/dev/disk/vn/vn.c index cee04a77dc..5f75df40e1 100644 --- a/sys/dev/disk/vn/vn.c +++ b/sys/dev/disk/vn/vn.c @@ -39,7 +39,7 @@ * * from: @(#)vn.c 8.6 (Berkeley) 4/1/94 * $FreeBSD: src/sys/dev/vn/vn.c,v 1.105.2.4 2001/11/18 07:11:00 dillon Exp $ - * $DragonFly: src/sys/dev/disk/vn/vn.c,v 1.17 2006/03/24 18:35:32 dillon Exp $ + * $DragonFly: src/sys/dev/disk/vn/vn.c,v 1.18 2006/03/27 01:54:14 dillon Exp $ */ /* @@ -647,8 +647,9 @@ vniocattach_swap(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, vn->sc_secsize = PAGE_SIZE; vn->sc_size = vio->vn_size; - vn->sc_object = - vm_pager_allocate(OBJT_SWAP, NULL, vn->sc_secsize * (vm_ooffset_t)vio->vn_size, VM_PROT_DEFAULT, 0); + vn->sc_object = vm_pager_allocate(OBJT_SWAP, NULL, + vn->sc_secsize * (off_t)vio->vn_size, + VM_PROT_DEFAULT, 0); IFOPT(vn, VN_RESERVE) { if (swap_pager_reserve(vn->sc_object, 0, vn->sc_size) < 0) { vm_pager_deallocate(vn->sc_object); diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index b142701d3c..6d99125cb0 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -27,7 +27,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/kern/imgact_elf.c,v 1.73.2.13 2002/12/28 19:49:41 dillon Exp $ - * $DragonFly: src/sys/kern/imgact_elf.c,v 1.33 2005/10/27 03:15:47 sephe Exp $ + * $DragonFly: src/sys/kern/imgact_elf.c,v 1.34 2006/03/27 01:54:15 dillon Exp $ */ #include @@ -229,8 +229,8 @@ elf_check_header(const Elf_Ehdr *hdr) static int elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, - vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, - vm_prot_t prot) + vm_offset_t offset, caddr_t vmaddr, size_t memsz, + size_t filsz, vm_prot_t prot) { size_t map_len; vm_offset_t map_addr; @@ -253,8 +253,7 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, * 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 || - filsz > memsz) { + if ((off_t)filsz + offset > vp->v_filesize || filsz > memsz) { uprintf("elf_load_section: truncated ELF file\n"); return (ENOEXEC); } diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index 5498ad0e46..dbcbb80523 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/kern/sysv_shm.c,v 1.45.2.6 2002/10/22 20:45:03 fjoe Exp $ */ -/* $DragonFly: src/sys/kern/sysv_shm.c,v 1.15 2004/07/23 14:07:46 joerg Exp $ */ +/* $DragonFly: src/sys/kern/sysv_shm.c,v 1.16 2006/03/27 01:54:15 dillon Exp $ */ /* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */ /* @@ -508,8 +508,7 @@ shmget_allocate_segment(p, uap, mode) shmseg->shm_perm.mode = SHMSEG_ALLOCATED | SHMSEG_REMOVED; shmseg->shm_perm.key = uap->key; shmseg->shm_perm.seq = (shmseg->shm_perm.seq + 1) & 0x7fff; - shm_handle = (struct shm_handle *) - malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK); + shm_handle = malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK); shmid = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm); /* diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index caad11be74..f023687efc 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -35,7 +35,7 @@ * * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 * $FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.65.2.17 2003/04/04 17:11:16 tegge Exp $ - * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.59 2005/12/01 18:40:56 dillon Exp $ + * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.60 2006/03/27 01:54:15 dillon Exp $ */ #include "opt_ktrace.h" @@ -1490,7 +1490,7 @@ retry_lookup: * Calculate the amount to transfer. Not to exceed a page, * the EOF, or the passed in nbytes. */ - xfsize = obj->un_pager.vnp.vnp_size - off; + xfsize = vp->v_filesize - off; if (xfsize > PAGE_SIZE) xfsize = PAGE_SIZE; pgoff = (vm_offset_t)(off & PAGE_MASK); diff --git a/sys/kern/vfs_lock.c b/sys/kern/vfs_lock.c index d319bd7466..09cfe176f1 100644 --- a/sys/kern/vfs_lock.c +++ b/sys/kern/vfs_lock.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/vfs_lock.c,v 1.10 2006/03/05 18:38:34 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_lock.c,v 1.11 2006/03/27 01:54:15 dillon Exp $ */ /* @@ -495,6 +495,7 @@ allocvnode(int lktimeout, int lkflags) RB_INIT(&vp->v_rbclean_tree); RB_INIT(&vp->v_rbdirty_tree); RB_INIT(&vp->v_rbhash_tree); + vp->v_filesize = NOOFFSET; vp->v_type = VNON; vp->v_tag = 0; vp->v_ops = NULL; diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 49ce96be36..6e8bb7d4cf 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -32,7 +32,7 @@ * * @(#)vnode.h 8.7 (Berkeley) 2/4/94 * $FreeBSD: src/sys/sys/vnode.h,v 1.111.2.19 2002/12/29 18:19:53 dillon Exp $ - * $DragonFly: src/sys/sys/vnode.h,v 1.42 2006/03/24 18:35:33 dillon Exp $ + * $DragonFly: src/sys/sys/vnode.h,v 1.43 2006/03/27 01:54:16 dillon Exp $ */ #ifndef _SYS_VNODE_H_ @@ -153,6 +153,9 @@ vrange_lock_excl(struct vnode *vp, struct vrangelock *vr, * typically points to &v_mount->mnt_vn_use_ops. We use a double * pointer because mnt_vn_use_ops may change dynamically when e.g. * journaling is turned on or off. + * + * NOTE: v_filesize is currently only applicable when a VM object is + * associated with the vnode. Otherwise it will be set to NOOFFSET. */ RB_HEAD(buf_rb_tree, buf); RB_HEAD(buf_rb_hash, buf); @@ -186,6 +189,7 @@ struct vnode { struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */ } v_un; struct nqlease *v_lease; /* Soft reference to lease */ + off_t v_filesize; /* file EOF or NOOFFSET */ off_t v_lazyw; /* lazy write iterator */ off_t v_lastw; /* last write (write cluster) */ off_t v_cstart; /* start block of cluster */ diff --git a/sys/vfs/isofs/cd9660/cd9660_vfsops.c b/sys/vfs/isofs/cd9660/cd9660_vfsops.c index 4e2dde7f23..0abb39e887 100644 --- a/sys/vfs/isofs/cd9660/cd9660_vfsops.c +++ b/sys/vfs/isofs/cd9660/cd9660_vfsops.c @@ -37,7 +37,7 @@ * * @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95 * $FreeBSD: src/sys/isofs/cd9660/cd9660_vfsops.c,v 1.74.2.7 2002/04/08 09:39:29 bde Exp $ - * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.30 2006/03/24 18:35:33 dillon Exp $ + * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.31 2006/03/27 01:54:17 dillon Exp $ */ #include @@ -809,7 +809,7 @@ again: ip->iso_extent = isonum_733(isodir->extent); ip->i_size = isonum_733(isodir->size); ip->iso_start = isonum_711(isodir->ext_attr_length) + ip->iso_extent; - + /* * Setup time stamp, attribute */ @@ -842,7 +842,9 @@ again: /* * Initialize the associated vnode */ - switch (vp->v_type = IFTOVT(ip->inode.iso_mode)) { + vp->v_type = IFTOVT(ip->inode.iso_mode); + + switch (vp->v_type) { case VFIFO: vp->v_ops = &mp->mnt_vn_fifo_ops; break; diff --git a/sys/vfs/nfs/nfs_node.c b/sys/vfs/nfs/nfs_node.c index 7ab29eddb7..091680ed7f 100644 --- a/sys/vfs/nfs/nfs_node.c +++ b/sys/vfs/nfs/nfs_node.c @@ -35,7 +35,7 @@ * * @(#)nfs_node.c 8.6 (Berkeley) 5/22/95 * $FreeBSD: src/sys/nfs/nfs_node.c,v 1.36.2.3 2002/01/05 22:25:04 dillon Exp $ - * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.20 2006/03/02 19:08:00 dillon Exp $ + * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.21 2006/03/27 01:54:17 dillon Exp $ */ @@ -161,8 +161,9 @@ loop: } vp = nvp; bzero((caddr_t)np, sizeof *np); - vp->v_data = np; np->n_vnode = vp; + vp->v_data = np; + /* * Insert the nfsnode in the hash queue for its new file handle */ diff --git a/sys/vfs/portal/portal_vnops.c b/sys/vfs/portal/portal_vnops.c index 505b8a2d23..ff1204c782 100644 --- a/sys/vfs/portal/portal_vnops.c +++ b/sys/vfs/portal/portal_vnops.c @@ -36,7 +36,7 @@ * @(#)portal_vnops.c 8.14 (Berkeley) 5/21/95 * * $FreeBSD: src/sys/miscfs/portal/portal_vnops.c,v 1.38 1999/12/21 06:29:00 chris Exp $ - * $DragonFly: src/sys/vfs/portal/portal_vnops.c,v 1.24 2005/10/09 18:07:55 corecode Exp $ + * $DragonFly: src/sys/vfs/portal/portal_vnops.c,v 1.25 2006/03/27 01:54:17 dillon Exp $ */ /* @@ -144,6 +144,7 @@ portal_lookup(struct vop_old_lookup_args *ap) } fvp->v_type = VREG; fvp->v_data = pt; + /* * Save all of the remaining pathname and * advance the namei next pointer to the end diff --git a/sys/vfs/ufs/ufs_readwrite.c b/sys/vfs/ufs/ufs_readwrite.c index 3b746050a2..7df8eba78d 100644 --- a/sys/vfs/ufs/ufs_readwrite.c +++ b/sys/vfs/ufs/ufs_readwrite.c @@ -32,7 +32,7 @@ * * @(#)ufs_readwrite.c 8.11 (Berkeley) 5/8/95 * $FreeBSD: src/sys/ufs/ufs/ufs_readwrite.c,v 1.65.2.14 2003/04/04 22:21:29 tegge Exp $ - * $DragonFly: src/sys/vfs/ufs/ufs_readwrite.c,v 1.14 2006/03/24 18:35:34 dillon Exp $ + * $DragonFly: src/sys/vfs/ufs/ufs_readwrite.c,v 1.15 2006/03/27 01:54:17 dillon Exp $ */ #define BLKSIZE(a, b, c) blksize(a, b, c) @@ -637,13 +637,10 @@ ffs_getpages(struct vop_getpages_args *ap) /* * calculate the size of the transfer */ - size = pcount * PAGE_SIZE; - if ((IDX_TO_OFF(ap->a_m[firstpage]->pindex) + size) > - obj->un_pager.vnp.vnp_size) { - size = obj->un_pager.vnp.vnp_size - - IDX_TO_OFF(ap->a_m[firstpage]->pindex); + if ((IDX_TO_OFF(ap->a_m[firstpage]->pindex) + size) > vp->v_filesize) { + size = vp->v_filesize - IDX_TO_OFF(ap->a_m[firstpage]->pindex); } physoffset -= foff; diff --git a/sys/vfs/ufs/ufs_vnops.c b/sys/vfs/ufs/ufs_vnops.c index ead96461e5..15fac14c09 100644 --- a/sys/vfs/ufs/ufs_vnops.c +++ b/sys/vfs/ufs/ufs_vnops.c @@ -37,7 +37,7 @@ * * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 * $FreeBSD: src/sys/ufs/ufs/ufs_vnops.c,v 1.131.2.8 2003/01/02 17:26:19 bde Exp $ - * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.34 2006/03/24 18:35:34 dillon Exp $ + * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.35 2006/03/27 01:54:17 dillon Exp $ */ #include "opt_quota.h" @@ -2032,6 +2032,7 @@ ufs_vinit(struct mount *mntp, struct vnode **vpp) vp = *vpp; ip = VTOI(vp); + switch(vp->v_type = IFTOVT(ip->i_mode)) { case VCHR: case VBLK: @@ -2045,6 +2046,7 @@ ufs_vinit(struct mount *mntp, struct vnode **vpp) break; } + if (ip->i_number == ROOTINO) vp->v_flag |= VROOT; /* diff --git a/sys/vm/default_pager.c b/sys/vm/default_pager.c index 449141b0f5..3b42272900 100644 --- a/sys/vm/default_pager.c +++ b/sys/vm/default_pager.c @@ -37,7 +37,7 @@ * is maintained whenever a resident page also has swap backing store. * * $FreeBSD: src/sys/vm/default_pager.c,v 1.23 1999/11/07 20:03:53 alc Exp $ - * $DragonFly: src/sys/vm/default_pager.c,v 1.4 2004/03/23 22:54:32 dillon Exp $ + * $DragonFly: src/sys/vm/default_pager.c,v 1.5 2006/03/27 01:54:18 dillon Exp $ */ #include @@ -49,8 +49,7 @@ #include #include -static vm_object_t default_pager_alloc (void *, vm_ooffset_t, vm_prot_t, - vm_ooffset_t); +static vm_object_t default_pager_alloc (void *, off_t, vm_prot_t, off_t); static void default_pager_dealloc (vm_object_t); static int default_pager_getpages (vm_object_t, vm_page_t *, int, int); static void default_pager_putpages (vm_object_t, vm_page_t *, int, @@ -74,8 +73,7 @@ struct pagerops defaultpagerops = { * no_pager_alloc just returns an initialized object. */ static vm_object_t -default_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t offset) +default_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t offset) { if (handle != NULL) panic("default_pager_alloc: handle specified"); diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index a3b3750c09..61115373b4 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -37,7 +37,7 @@ * * @(#)device_pager.c 8.1 (Berkeley) 6/11/93 * $FreeBSD: src/sys/vm/device_pager.c,v 1.46.2.1 2000/08/02 21:54:37 peter Exp $ - * $DragonFly: src/sys/vm/device_pager.c,v 1.9 2004/11/12 00:09:56 dillon Exp $ + * $DragonFly: src/sys/vm/device_pager.c,v 1.10 2006/03/27 01:54:18 dillon Exp $ */ #include @@ -54,8 +54,7 @@ #include static void dev_pager_init (void); -static vm_object_t dev_pager_alloc (void *, vm_ooffset_t, vm_prot_t, - vm_ooffset_t); +static vm_object_t dev_pager_alloc (void *, off_t, vm_prot_t, off_t); static void dev_pager_dealloc (vm_object_t); static int dev_pager_getpages (vm_object_t, vm_page_t *, int, int); static void dev_pager_putpages (vm_object_t, vm_page_t *, int, @@ -93,7 +92,7 @@ dev_pager_init(void) } static vm_object_t -dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t foff) +dev_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t foff) { dev_t dev; vm_object_t object; diff --git a/sys/vm/phys_pager.c b/sys/vm/phys_pager.c index 01c476a72b..f878ff4571 100644 --- a/sys/vm/phys_pager.c +++ b/sys/vm/phys_pager.c @@ -23,7 +23,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/vm/phys_pager.c,v 1.3.2.3 2000/12/17 02:05:41 alfred Exp $ - * $DragonFly: src/sys/vm/phys_pager.c,v 1.4 2004/10/12 19:29:34 dillon Exp $ + * $DragonFly: src/sys/vm/phys_pager.c,v 1.5 2006/03/27 01:54:18 dillon Exp $ */ #include @@ -54,8 +54,7 @@ phys_pager_init(void) } static vm_object_t -phys_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t foff) +phys_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t foff) { vm_object_t object; diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 0f3930bee4..bd42f884e6 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -96,7 +96,7 @@ * @(#)swap_pager.c 8.9 (Berkeley) 3/21/94 * * $FreeBSD: src/sys/vm/swap_pager.c,v 1.130.2.12 2002/08/31 21:15:55 dillon Exp $ - * $DragonFly: src/sys/vm/swap_pager.c,v 1.19 2006/03/24 18:35:34 dillon Exp $ + * $DragonFly: src/sys/vm/swap_pager.c,v 1.20 2006/03/27 01:54:18 dillon Exp $ */ #include @@ -182,8 +182,8 @@ vm_zone_t swap_zone; */ static vm_object_t - swap_pager_alloc (void *handle, vm_ooffset_t size, - vm_prot_t prot, vm_ooffset_t offset); + swap_pager_alloc (void *handle, off_t size, + vm_prot_t prot, off_t offset); static void swap_pager_dealloc (vm_object_t object); static int swap_pager_getpages (vm_object_t, vm_page_t *, int, int); static void swap_pager_init (void); @@ -402,8 +402,7 @@ swap_pager_swap_init(void) */ static vm_object_t -swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t offset) +swap_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t offset) { vm_object_t object; diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index df698ee488..d3c9e3243d 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -62,7 +62,7 @@ * rights to redistribute these changes. * * $FreeBSD: src/sys/vm/vm_map.c,v 1.187.2.19 2003/05/27 00:47:02 alc Exp $ - * $DragonFly: src/sys/vm/vm_map.c,v 1.41 2006/03/02 19:08:00 dillon Exp $ + * $DragonFly: src/sys/vm/vm_map.c,v 1.42 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -2491,8 +2491,8 @@ vm_map_split(vm_map_entry_t entry) offidxend = offidxstart + OFF_TO_IDX(e - s); size = offidxend - offidxstart; - new_object = vm_pager_allocate(orig_object->type, - NULL, IDX_TO_OFF(size), VM_PROT_ALL, 0LL); + new_object = vm_pager_allocate(orig_object->type, NULL, + IDX_TO_OFF(size), VM_PROT_ALL, 0); if (new_object == NULL) return; diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 1048275e37..09d69ef84a 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -39,7 +39,7 @@ * * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 * $FreeBSD: src/sys/vm/vm_mmap.c,v 1.108.2.6 2002/07/02 20:06:19 dillon Exp $ - * $DragonFly: src/sys/vm/vm_mmap.c,v 1.23 2006/01/13 20:45:30 swildner Exp $ + * $DragonFly: src/sys/vm/vm_mmap.c,v 1.24 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -921,7 +921,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, struct vnode *vp = NULL; objtype_t type; int rv = KERN_SUCCESS; - vm_ooffset_t objsize; + off_t objsize; int docow; struct thread *td = curthread; /* XXX */ struct proc *p = td->td_proc; @@ -981,7 +981,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, error = VOP_GETATTR(vp, &vat, td); if (error) return (error); - objsize = round_page(vat.va_size); + objsize = vat.va_size; type = OBJT_VNODE; /* * if it is a regular file without any references @@ -997,8 +997,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, object = NULL; docow = 0; } else { - object = vm_pager_allocate(type, - handle, objsize, prot, foff); + object = vm_pager_allocate(type, handle, objsize, prot, foff); if (object == NULL) return (type == OBJT_DEVICE ? EINVAL : ENOMEM); docow = MAP_PREFAULT_PARTIAL; diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index a29ccc611a..a11517d021 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -62,7 +62,7 @@ * rights to redistribute these changes. * * $FreeBSD: src/sys/vm/vm_object.h,v 1.63.2.3 2003/05/26 19:17:56 alc Exp $ - * $DragonFly: src/sys/vm/vm_object.h,v 1.7 2005/07/07 16:54:02 hmp Exp $ + * $DragonFly: src/sys/vm/vm_object.h,v 1.8 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -128,15 +128,6 @@ struct vm_object { void *handle; vm_object_lock_t range_locks; union { - /* - * VNode pager - * - * vnp_size - current size of file - */ - struct { - off_t vnp_size; - } vnp; - /* * Device pager * diff --git a/sys/vm/vm_pager.c b/sys/vm/vm_pager.c index 20d23eae82..c0c3fe4407 100644 --- a/sys/vm/vm_pager.c +++ b/sys/vm/vm_pager.c @@ -62,7 +62,7 @@ * rights to redistribute these changes. * * $FreeBSD: src/sys/vm/vm_pager.c,v 1.54.2.2 2001/11/18 07:11:00 dillon Exp $ - * $DragonFly: src/sys/vm/vm_pager.c,v 1.16 2006/02/17 19:18:08 dillon Exp $ + * $DragonFly: src/sys/vm/vm_pager.c,v 1.17 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -100,8 +100,7 @@ extern struct pagerops physpagerops; int cluster_pbuf_freecnt = -1; /* unlimited to begin with */ static int dead_pager_getpages (vm_object_t, vm_page_t *, int, int); -static vm_object_t dead_pager_alloc (void *, vm_ooffset_t, vm_prot_t, - vm_ooffset_t); +static vm_object_t dead_pager_alloc (void *, off_t, vm_prot_t, off_t); static void dead_pager_putpages (vm_object_t, vm_page_t *, int, int, int *); static boolean_t dead_pager_haspage (vm_object_t, vm_pindex_t, int *, int *); static void dead_pager_dealloc (vm_object_t); @@ -113,8 +112,7 @@ dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int req) } static vm_object_t -dead_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t off) +dead_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t off) { return NULL; } @@ -231,8 +229,8 @@ vm_pager_bufferinit(void) * need to perform page-level validation (e.g. the device pager). */ vm_object_t -vm_pager_allocate(objtype_t type, void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t off) +vm_pager_allocate(objtype_t type, void *handle, vm_ooffset_t size, + vm_prot_t prot, off_t off) { struct pagerops *ops; diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h index 12e1e2c50f..6d9a548f36 100644 --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -37,7 +37,7 @@ * * @(#)vm_pager.h 8.4 (Berkeley) 1/12/94 * $FreeBSD: src/sys/vm/vm_pager.h,v 1.24.2.2 2002/12/31 09:34:51 dillon Exp $ - * $DragonFly: src/sys/vm/vm_pager.h,v 1.6 2006/02/17 19:18:08 dillon Exp $ + * $DragonFly: src/sys/vm/vm_pager.h,v 1.7 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -98,7 +98,7 @@ extern vm_map_t pager_map; extern int pager_map_size; extern struct pagerops *pagertab[]; -vm_object_t vm_pager_allocate (objtype_t, void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t); +vm_object_t vm_pager_allocate (objtype_t, void *, off_t, vm_prot_t, off_t); void vm_pager_bufferinit (void); void vm_pager_deallocate (vm_object_t); static __inline int vm_pager_get_pages (vm_object_t, vm_page_t *, int, int); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index fba0f433aa..65fdb9e029 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -39,7 +39,7 @@ * * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 * $FreeBSD: src/sys/vm/vnode_pager.c,v 1.116.2.7 2002/12/31 09:34:51 dillon Exp $ - * $DragonFly: src/sys/vm/vnode_pager.c,v 1.22 2006/03/24 18:35:34 dillon Exp $ + * $DragonFly: src/sys/vm/vnode_pager.c,v 1.23 2006/03/27 01:54:18 dillon Exp $ */ /* @@ -98,8 +98,7 @@ int vnode_pbuf_freecnt = -1; /* start out unlimited */ * Handle is a vnode pointer. */ vm_object_t -vnode_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, - vm_ooffset_t offset) +vnode_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t offset) { vm_object_t object; struct vnode *vp; @@ -147,16 +146,15 @@ vnode_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, */ object = vm_object_allocate(OBJT_VNODE, OFF_TO_IDX(round_page(size))); object->flags = 0; - - object->un_pager.vnp.vnp_size = size; - object->handle = handle; vp->v_object = object; - vp->v_usecount++; + vp->v_filesize = size; } else { object->ref_count++; - vp->v_usecount++; + if (vp->v_filesize != size) + printf("vnode_pager_alloc: Warning, filesize mismatch %lld/%lld\n", vp->v_filesize, size); } + vp->v_usecount++; vp->v_flag &= ~VOLOCK; if (vp->v_flag & VOWANT) { @@ -179,6 +177,7 @@ vnode_pager_dealloc(vm_object_t object) object->handle = NULL; object->type = OBJT_DEAD; vp->v_object = NULL; + vp->v_filesize = NOOFFSET; vp->v_flag &= ~(VTEXT | VOBJBUF); } @@ -211,7 +210,7 @@ vnode_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, */ loffset = IDX_TO_OFF(pindex); - if (vp->v_mount == NULL || loffset >= object->un_pager.vnp.vnp_size) + if (vp->v_mount == NULL || loffset >= vp->v_filesize) return FALSE; bsize = vp->v_mount->mnt_stat.f_iosize; @@ -228,8 +227,8 @@ vnode_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, } if (after) { *after -= voff; - if (loffset + *after > object->un_pager.vnp.vnp_size) - *after = object->un_pager.vnp.vnp_size - loffset; + if (loffset + *after > vp->v_filesize) + *after = vp->v_filesize - loffset; *after >>= PAGE_SHIFT; if (*after < 0) *after = 0; @@ -242,8 +241,11 @@ vnode_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, * We adjust our own internal size and flush any cached pages in * the associated object that are affected by the size change. * - * Note: this routine may be invoked as a result of a pager put + * NOTE: This routine may be invoked as a result of a pager put * operation (possibly at object termination time), so we must be careful. + * + * NOTE: vp->v_filesize is initialized to NOOFFSET (-1), be sure that + * we do not blow up on the case. nsize will always be >= 0, however. */ void vnode_pager_setsize(struct vnode *vp, vm_ooffset_t nsize) @@ -257,7 +259,7 @@ vnode_pager_setsize(struct vnode *vp, vm_ooffset_t nsize) /* * Hasn't changed size */ - if (nsize == object->un_pager.vnp.vnp_size) + if (nsize == vp->v_filesize) return; nobjsize = OFF_TO_IDX(nsize + PAGE_MASK); @@ -265,7 +267,7 @@ vnode_pager_setsize(struct vnode *vp, vm_ooffset_t nsize) /* * File has shrunk. Toss any cached pages beyond the new EOF. */ - if (nsize < object->un_pager.vnp.vnp_size) { + if (nsize < vp->v_filesize) { vm_freeze_copyopts(object, OFF_TO_IDX(nsize), object->size); if (nobjsize < object->size) { vm_object_page_remove(object, nobjsize, object->size, @@ -331,7 +333,7 @@ vnode_pager_setsize(struct vnode *vp, vm_ooffset_t nsize) } } } - object->un_pager.vnp.vnp_size = nsize; + vp->v_filesize = nsize; object->size = nobjsize; } @@ -440,7 +442,7 @@ vnode_pager_input_smlfs(vm_object_t object, vm_page_t m) continue; loffset = IDX_TO_OFF(m->pindex) + i * bsize; - if (loffset >= object->un_pager.vnp.vnp_size) { + if (loffset >= vp->v_filesize) { doffset = NOOFFSET; } else { doffset = vnode_pager_addr(vp, loffset, NULL); @@ -508,18 +510,20 @@ vnode_pager_input_old(vm_object_t object, vm_page_t m) int size; vm_offset_t kva; struct sf_buf *sf; + struct vnode *vp; error = 0; + vp = object->handle; /* * Return failure if beyond current EOF */ - if (IDX_TO_OFF(m->pindex) >= object->un_pager.vnp.vnp_size) { + if (IDX_TO_OFF(m->pindex) >= vp->v_filesize) { return VM_PAGER_BAD; } else { size = PAGE_SIZE; - if (IDX_TO_OFF(m->pindex) + size > object->un_pager.vnp.vnp_size) - size = object->un_pager.vnp.vnp_size - IDX_TO_OFF(m->pindex); + if (IDX_TO_OFF(m->pindex) + size > vp->v_filesize) + size = vp->v_filesize - IDX_TO_OFF(m->pindex); /* * Allocate a kernel virtual address and initialize so that @@ -690,11 +694,10 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount, firstaddr = vnode_pager_addr(vp, IDX_TO_OFF(m[i]->pindex), &runpg); if (firstaddr == -1) { - if (i == reqpage && foff < object->un_pager.vnp.vnp_size) { + if (i == reqpage && foff < vp->v_filesize) { /* XXX no %qd in kernel. */ - panic("vnode_pager_getpages: unexpected missing page: firstaddr: %012llx, foff: 0x%012llx, vnp_size: 0x%012llx", - firstaddr, foff, - object->un_pager.vnp.vnp_size); + panic("vnode_pager_getpages: unexpected missing page: firstaddr: %012llx, foff: 0x%012llx, v_filesize: 0x%012llx", + firstaddr, foff, vp->v_filesize); } vnode_pager_freepage(m[i]); runend = i + 1; @@ -739,8 +742,8 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount, * calculate the size of the transfer */ size = count * PAGE_SIZE; - if ((foff + size) > object->un_pager.vnp.vnp_size) - size = object->un_pager.vnp.vnp_size - foff; + if ((foff + size) > vp->v_filesize) + size = vp->v_filesize - foff; /* * round up physical size for real devices. @@ -802,7 +805,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount, nextoff = tfoff + PAGE_SIZE; mt = m[i]; - if (nextoff <= object->un_pager.vnp.vnp_size) { + if (nextoff <= vp->v_filesize) { /* * Read filled up entire page. */ @@ -820,8 +823,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount, * we just try to clear the piece that we couldn't * read. */ - vm_page_set_validclean(mt, 0, - object->un_pager.vnp.vnp_size - tfoff); + vm_page_set_validclean(mt, 0, vp->v_filesize - tfoff); /* handled by vm_fault now */ /* vm_page_zero_invalid(mt, FALSE); */ } @@ -956,11 +958,11 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *m, int bytecount, * We do not under any circumstances truncate the valid bits, as * this will screw up bogus page replacement. */ - if (maxsize + poffset > object->un_pager.vnp.vnp_size) { - if (object->un_pager.vnp.vnp_size > poffset) { + if (maxsize + poffset > vp->v_filesize) { + if (vp->v_filesize > poffset) { int pgoff; - maxsize = object->un_pager.vnp.vnp_size - poffset; + maxsize = vp->v_filesize - poffset; ncount = btoc(maxsize); if ((pgoff = (int)maxsize & PAGE_MASK) != 0) { vm_page_clear_dirty(m[ncount - 1], pgoff, diff --git a/sys/vm/vnode_pager.h b/sys/vm/vnode_pager.h index d4886f054d..723445c58d 100644 --- a/sys/vm/vnode_pager.h +++ b/sys/vm/vnode_pager.h @@ -37,14 +37,14 @@ * * @(#)vnode_pager.h 8.1 (Berkeley) 6/11/93 * $FreeBSD: src/sys/vm/vnode_pager.h,v 1.14 1999/12/29 04:55:12 peter Exp $ - * $DragonFly: src/sys/vm/vnode_pager.h,v 1.4 2004/05/08 04:11:45 dillon Exp $ + * $DragonFly: src/sys/vm/vnode_pager.h,v 1.5 2006/03/27 01:54:18 dillon Exp $ */ #ifndef _VNODE_PAGER_ #define _VNODE_PAGER_ 1 #ifdef _KERNEL -vm_object_t vnode_pager_alloc (void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t); +vm_object_t vnode_pager_alloc (void *, off_t, vm_prot_t, off_t); void vnode_pager_freepage (vm_page_t); struct vnode *vnode_pager_lock (vm_object_t); -- 2.41.0