GENERIC from Thu Jun 17 15:36:19 2010 +0300, tmpfs 9c930f4, vmcore.449 KDB: debugger backends: ddb KDB: current backend: ddb 524288K of memory above 4GB ignored Copyright (c) 1992-2010 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 9.0-CURRENT #0 r209252+9c930f4: Thu Jun 17 16:49:11 CEST 2010 pho@x4.osted.lan:/var/tmp/deviant2/sys/i386/compile/PHO i386 WARNING: WITNESS option enabled, expect reduced performance. WARNING: DIAGNOSTIC option enabled, expect reduced performance. Timecounter "i8254" frequency 1193182 Hz quality 0 CPU: AMD Phenom(tm) 9150e Quad-Core Processor (1799.99-MHz 686-class CPU) Origin = "AuthenticAMD" Id = 0x100f23 Family = 10 Model = 2 Stepping = 3 Features=0x178bfbff Features2=0x802009 AMD Features=0xee500800 AMD Features2=0x7ff TSC: P-state invariant real memory = 4294967296 (4096 MB) avail memory = 3536089088 (3372 MB) : Trying to mount root from ufs:/dev/ad4s1a Enter full pathname of shell or RETURN for /bin/sh: Cannot read termcap database; using dumb terminal settings. # mount -t ufs -a # swapon -a swapon: adding /dev/ad4s1b as swap device swapon: adding /dev/ad4s2b as swap device # dumpon /dev/ad4s1b # cd /home/pho/stress2/misc # ./tmpfs6.sh lock order reversal: 1st 0xe6cf5ca0 bufwait (bufwait) @ kern/vfs_bio.c:2608 2nd 0xc7c74a00 dirhash (dirhash) @ ufs/ufs/ufs_dirhash.c:283 KDB: stack backtrace: db_trace_self_wrapper(c0cd664a,f617978c,c08f19d5,c08e15ab,c0cd9740,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c08e15ab,c0cd9740,c6d3e098,c6d41ab0,f61797e8,...) at kdb_backtrace+0x29 _witness_debugger(c0cd9740,c7c74a00,c0cfdd33,c6d41ab0,c0cfd9c5,...) at _witness_debugger+0x25 witness_checkorder(c7c74a00,9,c0cfd9bc,11b,0,...) at witness_checkorder+0x839 _sx_xlock(c7c74a00,0,c0cfd9bc,11b,c7c39910,...) at _sx_xlock+0x85 ufsdirhash_acquire(e6cf5c40,f6179914,2c,e71b91d4,f61798b8,...) at ufsdirhash_acquire+0x48 ufsdirhash_add(c7c39910,f6179914,11d4,f61798a4,f61798a8,...) at ufsdirhash_add+0x13 ufs_direnter(c7c81828,c7dba2b8,f6179914,f6179ba4,0,...) at ufs_direnter+0x749 ufs_makeinode(f6179ba4,c0de6540,f6179b00,f6179a5c,c0c11515,...) at ufs_makeinode+0x5c5 ufs_create(f6179b00,c0d13f36,0,0,f6179b78,...) at ufs_create+0x30 VOP_CREATE_APV(c0de6000,f6179b00,f6179ba4,f6179a98,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(f6179b78,f6179c2c,1a4,0,c6d90480,...) at vn_open_cred+0x205 vn_open(f6179b78,f6179c2c,1a4,c7c50850,c0ccd979,...) at vn_open+0x3b kern_openat(c7bd8a00,ffffff9c,284072fc,0,602,...) at kern_openat+0x125 kern_open(c7bd8a00,284072fc,0,601,1b6,...) at kern_open+0x35 open(c7bd8a00,f6179cec,f6179d28,c0cd7f99,0,...) at open+0x30 syscallenter(c7bd8a00,f6179ce4,f6179ce4,0,0,...) at syscallenter+0x246 syscall(f6179d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x281e15e3, esp = 0xbfbfeb6c, ebp = 0xbfbfec28 --- WARNING: TMPFS is considered to be a highly experimental feature in FreeBSD. /tmp umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy umount: unmount of /mnt failed: Device busy ^C# fstat /mnt USER CMD PID FD MOUNT INUM MODE SZ|DV R/W NAME # ~KDB: enter: Line break on console [ thread pid 11 tid 100005 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db> show mount 0xc7bf1b50 /dev/ad4s1a on / (ufs) 0xc7bf2000 devfs on /dev (devfs) 0xc7c825a8 /dev/ad4s1e on /tmp (ufs) 0xc7c822d4 /dev/ad4s1f on /usr (ufs) 0xc7c82000 /dev/ad4s1d on /var (ufs) 0xc7bf2b50 tmpfs on /mnt (tmpfs) More info: show mount db> show mount 0xc7bf2b50 0xc7bf2b50 tmpfs on /mnt (tmpfs) mnt_flag = LOCAL mnt_kern_flag = MPSAFE mnt_opt = fstype, fspath, from, errmsg mnt_stat = { version=537068824 type=7 flags=0x0000000000001000 bsize=4096 iosize=4096 blocks=2945240 bfree=2945239 bavail=2945239 files=25542385 ffree=25542384 syncwrites=0 asyncwrites=0 syncreads=0 asyncreads=0 namemax=255 owner=0 fsid=[117505793, 7] } mnt_cred = { uid=0 ruid=0 } mnt_ref = 3 mnt_gen = 1 mnt_nvnodelistsize = 3 mnt_writeopcount = 0 mnt_noasync = 0 mnt_maxsymlinklen = 0 mnt_iosize_max = 65536 mnt_hashseed = 2982163109 mnt_secondary_writes = 0 mnt_secondary_accwrites = 0 mnt_gjprovider = NULL vnode 0xc7dbb570: tag tmpfs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc7dc83f0 ref 1 pages 8 lock type tmpfs: UNLOCKED #0 0xc089370e at __lockmgr_args+0xbfe #1 0xc0930575 at vop_stdlock+0x65 #2 0xc0c10545 at VOP_LOCK1_APV+0xb5 #3 0xc094e128 at _vn_lock+0x78 #4 0xc094430c at vflush+0x13c #5 0xc7e3187d at tmpfs_unmount+0x3d #6 0xc0938b5d at dounmount+0x46d #7 0xc09390ef at unmount+0x2ff #8 0xc08ea4b6 at syscallenter+0x246 #9 0xc0bedb9f at syscall+0x4f #10 0xc0bd4c70 at Xint0x80_syscall+0x20 tag VT_TMPFS, tmpfs_node 0xc7ebfee0, flags 0x0, links 0 mode 0700, owner 0, group 0, size 32768, status 0x0 vnode 0xc7e07ae0: tag syncer, type VNON usecount 1, writecount 0, refcount 1 mountedhere 0 flags () lock type syncer: UNLOCKED #0 0xc089370e at __lockmgr_args+0xbfe #1 0xc0930575 at vop_stdlock+0x65 #2 0xc0c10545 at VOP_LOCK1_APV+0xb5 #3 0xc094e128 at _vn_lock+0x78 #4 0xc094371f at vfs_allocate_syncvnode+0x6f #5 0xc0938c42 at dounmount+0x552 #6 0xc09390ef at unmount+0x2ff #7 0xc08ea4b6 at syscallenter+0x246 #8 0xc0bedb9f at syscall+0x4f #9 0xc0bd4c70 at Xint0x80_syscall+0x20 vnode 0xc7dba2b8: tag tmpfs, type VDIR usecount 0, writecount 0, refcount 0 mountedhere 0 flags (VV_ROOT|VI_FREE) lock type tmpfs: UNLOCKED #0 0xc089370e at __lockmgr_args+0xbfe #1 0xc0930575 at vop_stdlock+0x65 #2 0xc0c10545 at VOP_LOCK1_APV+0xb5 #3 0xc094e128 at _vn_lock+0x78 #4 0xc7e32718 at tmpfs_alloc_vp+0x3a8 #5 0xc7e317f5 at tmpfs_root+0x35 #6 0xc09354b1 at lookup+0x9a1 #7 0xc0935fcf at namei+0x57f #8 0xc0945812 at kern_statat_vnhook+0x72 #9 0xc094596c at kern_statat+0x3c #10 0xc0945ab6 at kern_stat+0x36 #11 0xc0945b5f at stat+0x2f #12 0xc08ea4b6 at syscallenter+0x246 #13 0xc0bedb9f at syscall+0x4f #14 0xc0bd4c70 at Xint0x80_syscall+0x20 tag VT_TMPFS, tmpfs_node 0xc7ec0000, flags 0x0, links 2 mode 0755, owner 0, group 0, size 0, status 0x0 db> show alllocks db> show lockedvnods Locked vnodes db> ps pid ppid pgrp uid state wmesg wchan cmd 22 1 22 0 Ss+ ttyin 0xc70fe670 sh 21 0 0 0 DL flowclea 0xc0fa2ba8 [flowcleaner] 20 0 0 0 DL sdflush 0xc0fae320 [softdepflush] 19 0 0 0 DL vlruwt 0xc7bd7550 [vnlru] 18 0 0 0 DL syncer 0xc0fa29b8 [syncer] 17 0 0 0 DL psleep 0xc0fa26e8 [bufdaemon] 16 0 0 0 DL pgzero 0xc0fb0194 [pagezero] 15 0 0 0 DL psleep 0xc0fafdd0 [vmdaemon] 9 0 0 0 DL psleep 0xc0fafd98 [pagedaemon] 8 0 0 0 DL ccb_scan 0xc0e020d4 [xpt_thrd] 7 0 0 0 DL waiting_ 0xc0fa43b8 [sctp_iterator] 6 0 0 0 DL - 0xc70fec3c [fdc0] 5 0 0 0 SL - 0xc700b000 [fw0_probe] 14 0 0 0 DL (threaded) [usb] 100057 D - 0xc6fe8d0c [usbus5] 100056 D - 0xc6fe8cdc [usbus5] 100055 D - 0xc6fe8cac [usbus5] 100054 D - 0xc6fe8c7c [usbus5] 100052 D - 0xc6fdfb5c [usbus4] 100051 D - 0xc6fdfb2c [usbus4] 100050 D - 0xc6fdfafc [usbus4] 100049 D - 0xc6fdfacc [usbus4] 100048 D - 0xc6fd8b5c [usbus3] 100047 D - 0xc6fd8b2c [usbus3] 100046 D - 0xc6fd8afc [usbus3] 100045 D - 0xc6fd8acc [usbus3] 100044 D - 0xc6fd1b5c [usbus2] 100043 D - 0xc6fd1b2c [usbus2] 100042 D - 0xc6fd1afc [usbus2] 100041 D - 0xc6fd1acc [usbus2] 100039 D - 0xc6fc8b5c [usbus1] 100038 D - 0xc6fc8b2c [usbus1] 100037 D - 0xc6fc8afc [usbus1] 100036 D - 0xc6fc8acc [usbus1] 100034 D - 0xc6fc3b5c [usbus0] 100033 D - 0xc6fc3b2c [usbus0] 100032 D - 0xc6fc3afc [usbus0] 100031 D - 0xc6fc3acc [usbus0] 13 0 0 0 DL - 0xc0e361a4 [yarrow] 4 0 0 0 DL - 0xc0e33ec4 [g_down] 3 0 0 0 DL - 0xc0e33ec0 [g_up] 2 0 0 0 DL - 0xc0e33eb8 [g_event] 12 0 0 0 WL (threaded) [intr] 100065 I [irq12: psm0] 100064 I [irq1: atkbd0] 100062 I [swi0: uart] 100059 I [irq20: fwohci0] 100058 I [irq14: ata0] 100053 I [irq19: ehci0] 100040 I [irq18: ohci2 ohci4] 100035 I [irq17: ohci1 ohci3] 100030 I [irq16: hdac1 ohci0] 100029 I [irq22: atapci0] 100028 I [irq256: hdac0] 100027 I [irq9: acpi0] 100026 I [swi6: task queue] 100025 I [swi6: Giant taskq] 100023 I [swi5: +] 100022 I [swi2: cambio] 100012 I [swi1: netisr 0] 100011 I [swi4: clock] 100010 I [swi4: clock] 100009 I [swi4: clock] 100008 I [swi4: clock] 100007 I [swi3: vm] 11 0 0 0 RL (threaded) [idle] 100006 Run CPU 0 [idle: cpu0] 100005 Run CPU 1 [idle: cpu1] 100004 Run CPU 2 [idle: cpu2] 100003 Run CPU 3 [idle: cpu3] 1 0 1 0 SLs wait 0xc6d87d48 [init] 10 0 0 0 DL audit_wo 0xc0fadb40 [audit] 0 0 0 0 DLs (threaded) [kernel] 100066 D deadlkre 0xc0e361a4 [deadlkres] 100060 D - 0xc7009d40 [fw0_taskq] 100024 D - 0xc6f3cc40 [thread taskq] 100021 D - 0xc6f3ce00 [kqueue taskq] 100020 D - 0xc6f3ce40 [acpi_task_2] 100019 D - 0xc6f3ce40 [acpi_task_1] 100018 D - 0xc6f3ce40 [acpi_task_0] 100013 D - 0xc6d69a80 [firmware taskq] 100000 D sched 0xc0e33fa0 [swapper] db> call doadump Physical memory: 3439 MB Dumping 112 MB: 97 81 65 49 33 17 1 Dump complete = 0xf db> reset cpu_reset: Restarting BSP cpu_reset_proxy: Stopped CPU 1 git diff master diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/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: if (vm_page_sleep_if_busy(m, FALSE, "zfsmwb")) goto again; - fsize = obj->un_pager.vnp.vnp_size; + fsize = 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..bc74f0a 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 = &tmpfs_fifoop_entries; break; + case VREG: + VI_LOCK(vp); + KASSERT(vp->v_object == NULL, ("Not NULL v_object in tmpfs")); + vp->v_object = node->tn_reg.tn_aobj; + VI_UNLOCK(vp); + break; case VDIR: MPASS(node->tn_dir.tn_parent != NULL); if (node->tn_dir.tn_parent == node) @@ -396,7 +400,6 @@ loop: panic("tmpfs_alloc_vp: type %p %d", node, (int)node->tn_type); } - vnode_pager_setsize(vp, node->tn_size); error = insmntque(vp, mp); if (error) vp = NULL; @@ -883,7 +886,7 @@ tmpfs_reg_resize(struct vnode *vp, off_t newsize) TMPFS_UNLOCK(tmp); node->tn_size = newsize; - vnode_pager_setsize(vp, newsize); + node->tn_reg.tn_aobj->vnp_size = newsize; if (newsize < oldsize) { size_t zerolen = round_page(newsize) - newsize; vm_object_t uobj = node->tn_reg.tn_aobj; 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; } -/* --------------------------------------------------------------------- */ 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 = vm_pager_get_pages(tobj, &m, 1, 0); if (error != 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 = 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); return (error); } -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 = 1; - uio.uio_iov = &iov; - iov.iov_base = buf; - iov.iov_len = tlen; - - uio.uio_offset = 0; - uio.uio_resid = tlen; - uio.uio_rw = UIO_READ; - uio.uio_segflg = UIO_SYSSPACE; - uio.uio_td = 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 uio *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 = uio->uio_offset; - idx = OFF_TO_IDX(addr); - offset = addr & PAGE_MASK; - tlen = MIN(PAGE_SIZE - offset, len); - - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) - goto nocache; - - VM_OBJECT_LOCK(vobj); -lookupvpg: - if (((m = vm_page_lookup(vobj, idx)) != NULL) && - vm_page_is_valid(m, offset, tlen)) { - if ((m->oflags & VPO_BUSY) != 0) { - /* - * Reference the page before unlocking and sleeping so - * that the page daemon is less likely to reclaim it. - */ - 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 = uiomove_fromphys(&m, offset, tlen, uio); - VM_OBJECT_LOCK(vobj); - vm_page_wakeup(m); - VM_OBJECT_UNLOCK(vobj); - return (error); - } else if (m != NULL && uio->uio_segflg == UIO_NOCOPY) { - if ((m->oflags & VPO_BUSY) != 0) { - /* - * Reference the page before unlocking and sleeping so - * that the page daemon is less likely to reclaim it. - */ - 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 = sf_buf_alloc(m, SFB_CPUPRIVATE); - ma = (char *)sf_buf_kva(sf); - error = tmpfs_nocacheread_buf(tobj, idx, offset, tlen, - ma + offset); - if (error == 0) { - uio->uio_offset += tlen; - uio->uio_resid -= 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 = tmpfs_nocacheread(tobj, idx, offset, tlen, uio); - - return (error); -} - static int tmpfs_read(struct vop_read_args *v) { struct vnode *vp = v->a_vp; struct uio *uio = v->a_uio; - struct tmpfs_node *node; vm_object_t uobj; size_t len; int resid; - int error = 0; + vm_pindex_t idx; + vm_offset_t offset; + off_t addr; + size_t tlen; node = VP_TO_TMPFS_NODE(vp); @@ -603,7 +506,11 @@ tmpfs_read(struct vop_read_args *v) len = MIN(node->tn_size - uio->uio_offset, resid); if (len == 0) break; - error = tmpfs_mappedread(vp->v_object, uobj, len, uio); + addr = uio->uio_offset; + idx = OFF_TO_IDX(addr); + offset = addr & PAGE_MASK; + tlen = MIN(PAGE_SIZE - offset, len); + error = tmpfs_nocacheread(uobj, idx, offset, tlen, uio); if ((error != 0) || (resid == uio->uio_resid)) break; } @@ -616,10 +523,10 @@ out: /* --------------------------------------------------------------------- */ static int -tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *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 = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) { - vpg = NULL; - goto nocache; - } - - VM_OBJECT_LOCK(vobj); -lookupvpg: - if (((vpg = vm_page_lookup(vobj, idx)) != NULL) && - vm_page_is_valid(vpg, offset, tlen)) { - if ((vpg->oflags & VPO_BUSY) != 0) { - /* - * Reference the page before unlocking and sleeping so - * that the page daemon is less likely to reclaim it. - */ - 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 = uiomove_fromphys(&vpg, offset, tlen, uio); - } else { - if (__predict_false(vobj->cache != NULL)) - vm_page_cache_free(vobj, idx, idx + 1); - VM_OBJECT_UNLOCK(vobj); - vpg = NULL; - } -nocache: VM_OBJECT_LOCK(tobj); vm_object_pip_add(tobj, 1); tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | @@ -671,23 +547,18 @@ nocache: if (vm_pager_has_page(tobj, idx, NULL, NULL)) { error = vm_pager_get_pages(tobj, &tpg, 1, 0); if (error != 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 == NULL) - error = uiomove_fromphys(&tpg, offset, tlen, uio); - else { - KASSERT(vpg->valid == VM_PAGE_BITS_ALL, ("parts of vpg invalid")); - pmap_copy_page(vpg, tpg); - } + error = uiomove_fromphys(&tpg, offset, tlen, uio); VM_OBJECT_LOCK(tobj); out: - if (vobj != NULL) - VM_OBJECT_LOCK(vobj); if (error == 0) { KASSERT(tpg->valid == 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 != NULL) - vm_page_wakeup(vpg); - if (vobj != NULL) - VM_OBJECT_UNLOCK(vobj); vm_object_pip_subtract(tobj, 1); VM_OBJECT_UNLOCK(tobj); @@ -759,7 +625,7 @@ tmpfs_write(struct vop_write_args *v) len = MIN(node->tn_size - uio->uio_offset, resid); if (len == 0) break; - error = tmpfs_mappedwrite(vp->v_object, uobj, len, uio); + error = tmpfs_mappedwrite(uobj, len, uio); if ((error != 0) || (resid == uio->uio_resid)) break; } @@ -1425,7 +1291,7 @@ tmpfs_reclaim(struct vop_reclaim_args *v) node = VP_TO_TMPFS_NODE(vp); tmp = VFS_TO_TMPFS(vp->v_mount); - vnode_destroy_vobject(vp); + vp->v_object = NULL; cache_purge(vp); 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 = (vm_offset_t)(off & PAGE_MASK); xfsize = omin(PAGE_SIZE - pgoff, - obj->un_pager.vnp.vnp_size - uap->offset - + obj->vnp_size - uap->offset - fsbytes - loopbytes); if (uap->nbytes) rem = (uap->nbytes - fsbytes - loopbytes); else - rem = obj->un_pager.vnp.vnp_size - + rem = obj->vnp_size - uap->offset - fsbytes - loopbytes; xfsize = omin(rem, xfsize); xfsize = omin(space - loopbytes, xfsize); diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 3d72123..1662fd6 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 = EINVAL; goto done; } - if (obj->handle != vp) { + if (obj->type == OBJT_VNODE && obj->handle != vp) { vput(vp); vp = (struct vnode*)obj->handle; vget(vp, LK_SHARED, td); 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 */ }; /* diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index f497d41..7362e95 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -221,7 +221,7 @@ retry: */ object = vm_object_allocate(OBJT_VNODE, OFF_TO_IDX(round_page(size))); - object->un_pager.vnp.vnp_size = size; + object->vnp_size = size; object->handle = handle; VI_LOCK(vp); @@ -301,7 +301,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) >= object->un_pager.vnp.vnp_size) + if (IDX_TO_OFF(pindex) >= object->vnp_size) return FALSE; bsize = vp->v_mount->mnt_stat.f_iosize; @@ -333,9 +333,9 @@ vnode_pager_haspage(object, pindex, before, after) *after *= pagesperblock; numafter = pagesperblock - (poff + 1); if (IDX_TO_OFF(pindex + numafter) > - object->un_pager.vnp.vnp_size) { + object->vnp_size) { numafter = - OFF_TO_IDX(object->un_pager.vnp.vnp_size) - + OFF_TO_IDX(object->vnp_size) - pindex; } *after += numafter; @@ -369,11 +369,11 @@ vnode_pager_setsize(vp, nsize) vm_page_t m; vm_pindex_t nobjsize; - if ((object = vp->v_object) == NULL) + if ((object = vp->v_object) == NULL || object->type != OBJT_VNODE) return; /* ASSERT_VOP_ELOCKED(vp, "vnode_pager_setsize and not locked vnode"); */ VM_OBJECT_LOCK(object); - if (nsize == object->un_pager.vnp.vnp_size) { + if (nsize == object->vnp_size) { /* * Hasn't changed size */ @@ -381,7 +381,7 @@ vnode_pager_setsize(vp, nsize) return; } nobjsize = 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 +436,7 @@ vnode_pager_setsize(vp, nsize) nobjsize); } } - object->un_pager.vnp.vnp_size = nsize; + object->vnp_size = nsize; object->size = nobjsize; VM_OBJECT_UNLOCK(object); } @@ -513,7 +513,7 @@ vnode_pager_input_smlfs(object, m) continue; address = IDX_TO_OFF(m->pindex) + i * bsize; - if (address >= object->un_pager.vnp.vnp_size) { + if (address >= object->vnp_size) { fileaddr = -1; } else { error = vnode_pager_addr(vp, address, &fileaddr, NULL); @@ -590,12 +590,12 @@ vnode_pager_input_old(object, m) /* * Return failure if beyond current EOF */ - if (IDX_TO_OFF(m->pindex) >= object->un_pager.vnp.vnp_size) { + if (IDX_TO_OFF(m->pindex) >= object->vnp_size) { 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 > object->vnp_size) + size = object->vnp_size - IDX_TO_OFF(m->pindex); vp = object->handle; VM_OBJECT_UNLOCK(object); @@ -815,13 +815,13 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage) } if (firstaddr == -1) { VM_OBJECT_LOCK(object); - if (i == reqpage && foff < object->un_pager.vnp.vnp_size) { + if (i == 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 +876,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage) */ size = count * PAGE_SIZE; KASSERT(count > 0, ("zero count")); - if ((foff + size) > object->un_pager.vnp.vnp_size) - size = object->un_pager.vnp.vnp_size - foff; + if ((foff + size) > object->vnp_size) + size = object->vnp_size - foff; KASSERT(size > 0, ("zero size")); /* @@ -944,7 +944,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage) nextoff = tfoff + PAGE_SIZE; mt = m[i]; - if (nextoff <= object->un_pager.vnp.vnp_size) { + if (nextoff <= object->vnp_size) { /* * Read filled up entire page. */ @@ -964,9 +964,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)) == 0, + object->vnp_size - tfoff)) == 0, ("vnode_pager_generic_getpages: page %p is dirty", mt)); } @@ -1116,11 +1116,11 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page_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; - maxsize = object->un_pager.vnp.vnp_size - poffset; + maxsize = object->vnp_size - poffset; ncount = btoc(maxsize); if ((pgoff = (int)maxsize & PAGE_MASK) != 0) { /* -- Test scenario: tmpfs6.sh