GENERIC HEAD from 2011-05-14 05:43:33 UTC, r221878M, vmcore.137 KDB: debugger backends: ddb KDB: current backend: ddb 524288K of memory above 4GB ignored Copyright (c) 1992-2011 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 r221878M: Sun May 15 04:46:47 CEST 2011 pho@x4.osted.lan:/usr/src/sys/i386/compile/PHO i386 WARNING: WITNESS option enabled, expect reduced performance. WARNING: DIAGNOSTIC option enabled, expect reduced performance. CPU: AMD Phenom(tm) 9150e Quad-Core Processor (1800.02-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 = 3536019456 (3372 MB) : Trying to mount root from ufs:/dev/ad4s1a [rw]... Setting hostuuid: 00000000-0000-0000-0000-00218515337d. Setting hostid: 0x6b64ac17. Starting ddb. Entropy harvesting: interrupts ethernet point_to_point kickstart. Starting file system checks: /dev/ad4s1a: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad4s1a: clean, 211845 free (1517 frags, 26291 blocks, 0.1% fragmentation) /dev/ad4s1f: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad4s1f: clean, 191470 free (4206 frags, 23408 blocks, 0.4% fragmentation) /dev/label/tmp: 301345 files, 26977177 used, 91336804 free (3148 frags, 11416707 blocks, 0.0% fragmentation) /dev/ad4s1d: 764621 files, 7658578 used, 2495621 free (229653 frags, 283246 blocks, 2.3% fragmentation) /dev/ad4s1e: 552967 files, 13717631 used, 11670886 free (56598 frags, 1451786 blocks, 0.2% fragmentation) Mounting local file systems:. Setting hostname: x4.osted.lan. re0: link state changed to DOWN Starting Network: lo0 re0 fwe0 fwip0. lo0: flags=8049 metric 0 mtu 16384 options=3 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0xa nd6 options=21 re0: flags=8843 metric 0 mtu 1500 options=389b ether 00:21:85:15:33:7d inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255 inet6 fe80::221:85ff:fe15:337d%re0 prefixlen 64 tentative scopeid 0x1 nd6 options=29 media: Ethernet autoselect (none) status: no carrier fwe0: flags=8802 metric 0 mtu 1500 options=8 ether 02:dc:10:62:ad:eb ch 1 dma -1 fwip0: flags=8802 metric 0 mtu 1500 lladdr 0.dc.10.0.1.62.ad.eb.a.2.ff.fe.0.0.0.0 Starting devd. Starting Network: usbus0. Starting Network: usbus1. Starting Network: usbus2. Starting Network: usbus3. Starting Network: usbus4. Starting Network: usbus5. Starting Network: fwe0. fwe0: flags=8802 metric 0 mtu 1500 options=8 ether 02:dc:10:62:ad:eb ch 1 dma -1 re0: link state changed to UP Starting Network: fwip0. fwip0: flags=8802 metric 0 mtu 1500 lladdr 0.dc.10.0.1.62.ad.eb.a.2.ff.fe.0.0.0.0 add net default: gateway 192.168.1.1 add net ::ffff:0.0.0.0: gateway ::1 add net ::0.0.0.0: gateway ::1 add net fe80::: gateway ::1 add net ff02::: gateway ::1 ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/kde4/lib /usr/local/lib /usr/local/lib/compat /usr/local/lib/compat/pkg /usr/local/lib/nss /usr/local/lib/qt4 /usr/local/lib/virtualbox /usr/local/lib/wine a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout Creating and/or trimming log files. Starting syslogd. No core dumps found. Additional ABI support: linux. Starting rpcbind. NFS access cache time=60 sysctl: unknown oid 'vfs.nfs.access_cache_timeout' /etc/rc: WARNING: failed to set access cache timeout lock order reversal: 1st 0xe071cca0 bufwait (bufwait) @ kern/vfs_bio.c:2658 2nd 0xc74fde00 dirhash (dirhash) @ ufs/ufs/ufs_dirhash.c:284 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,2e687361,38323a63,a0d34,a7a,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c09e0e4b,c0e8d273,c6d5e2a0,c6d61ec0,ef226894,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d273,c74fde00,c0ebc0ba,c6d61ec0,c0ebbd4c,...) at _witness_debugger+0x25 witness_checkorder(c74fde00,9,c0ebbd43,11c,0,...) at witness_checkorder+0x839 _sx_xlock(c74fde00,0,c0ebbd43,11c,c74abb54,...) at _sx_xlock+0x85 ufsdirhash_acquire(e071cc40,ef2269ec,188,e13b9a90,ef226964,...) at ufsdirhash_acquire+0x48 ufsdirhash_add(c74abb54,ef2269ec,1a90,ef226950,ef226954,...) at ufsdirhash_add+0x13 ufs_direnter(c7753d98,c79aeae0,ef2269ec,ef226bd0,e071d2c0,...) at ufs_direnter+0x749 ufs_mkdir(ef226bf8,c0ed9cf5,0,0,ef226b3c,...) at ufs_mkdir+0x916 VOP_MKDIR_APV(c0fbb340,ef226bf8,ef226bd0,ef226b3c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c74bd2e0,ffffff9c,28404020,0,1c0,...) at kern_mkdirat+0x225 kern_mkdir(c74bd2e0,28404020,0,1c0,ef226c7c,...) at kern_mkdir+0x2e mkdir(c74bd2e0,ef226cec,ef226d28,c0e8babe,0,...) at mkdir+0x29 syscallenter(c74bd2e0,ef226ce4,ef226ce4,0,0,...) at syscallenter+0x263 syscall(ef226d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x28172643, esp = 0xbfbfe8cc, ebp = 0xbfbfed78 --- Clearing /tmp (X related). Starting mountd. Starting nfsd. Recovering vi editor sessions:lock order reversal: 1st 0xc799cc94 ufs (ufs) @ kern/vfs_lookup.c:501 2nd 0xe0724820 bufwait (bufwait) @ ufs/ffs/ffs_softdep.c:12662 3rd 0xc7a2a058 ufs (ufs) @ kern/vfs_subr.c:2134 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,2e706564,32313a63,d323636,a,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c09e0e4b,c0e8d28c,c6d5e2a0,c6d61e58,ef1e432c,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d28c,c7a2a058,c0e7c770,c6d61e58,c0e94e9b,...) at _witness_debugger+0x25 witness_checkorder(c7a2a058,9,c0e94e92,856,0,...) at witness_checkorder+0x839 __lockmgr_args(c7a2a058,80100,c7a2a0c4,0,0,...) at __lockmgr_args+0x814 ffs_lock(ef1e4450,c09f23db,c0e941f7,80100,c7a2a000,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0fbb340,ef1e4450,c7473390,c0fd6300,c7a2a000,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c7a2a000,80100,c0e94e92,856,4,...) at _vn_lock+0x78 vget(c7a2a000,80100,c74732e0,50,0,...) at vget+0xbb vfs_hash_get(c775d87c,15ef44,80000,c74732e0,ef1e45a8,...) at vfs_hash_get+0xed ffs_vgetf(c775d87c,15ef44,80000,ef1e45a8,1,...) at ffs_vgetf+0x49 softdep_sync_metadata(c799cc3c,0,c0ebb839,144,0,...) at softdep_sync_metadata+0x10e2 ffs_syncvnode(c799cc3c,1,c799cd34,c6d5e2a0,c115b4e0,...) at ffs_syncvnode+0x3e2 ffs_truncate(c799cc3c,200,0,880,c715b500,...) at ffs_truncate+0x8bb ufs_direnter(c799cc3c,c7a2a000,ef1e4914,ef1e4ba4,0,...) at ufs_direnter+0x924 ufs_makeinode(ef1e4ba4,c0fbb840,ef1e4b00,ef1e4a5c,c0cf5c65,...) at ufs_makeinode+0x5c5 ufs_create(ef1e4b00,c0ed9ebb,0,0,ef1e4b78,...) at ufs_create+0x30 VOP_CREATE_APV(c0fbb340,ef1e4b00,ef1e4ba4,ef1e4a98,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(ef1e4b78,ef1e4c2c,1b0,0,c715b500,...) at vn_open_cred+0x205 vn_open(ef1e4b78,ef1e4c2c,1b0,c78eecb0,0,...) at vn_open+0x3b kern_openat(c74732e0,ffffff9c,28839f60,0,a03,...) at kern_openat+0x12f kern_open(c74732e0,28839f60,0,a02,1b0,...) at kern_open+0x35 open(c74732e0,ef1e4cec,ef1e4d28,c0e8babe,0,...) at open+0x30 syscallenter(c74732e0,ef1e4ce4,ef1e4ce4,0,0,...) at syscallenter+0x263 syscall(ef1e4d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (5, FreeBSD ELF32, open), eip = 0x283d1683, esp = 0xbfbfc4fc, ebp = 0xbfbfc588 --- . Updating motd:. Starting ntpd. Starting default moused. Configuring syscons: keymap blanktime. Starting sshd. Starting cron. Local package initialization: backuplock order reversal: 1st 0xc74c8310 ufs (ufs) @ kern/vfs_mount.c:1193 2nd 0xc721a1b4 devfs (devfs) @ ufs/ffs/ffs_softdep.c:1729 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,37313a63,a0d3932,ef1a9900,c09f23db,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c09e0e4b,c0e8d273,c6d61e58,c6d61d88,ef1a9a04,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d273,c721a1b4,c0e74927,c6d61d88,c0eb8525,...) at _witness_debugger+0x25 witness_checkorder(c721a1b4,9,c0eb851c,6c1,c721a220,...) at witness_checkorder+0x839 __lockmgr_args(c721a1b4,80400,c721a220,0,0,...) at __lockmgr_args+0x814 vop_stdlock(ef1a9b24,4,c0e84007,80400,c721a15c,...) at vop_stdlock+0x65 VOP_LOCK1_APV(c0f910e0,ef1a9b24,c118ef28,c0fd6300,c721a15c,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c721a15c,80400,c0eb851c,6c1,c775e000,...) at _vn_lock+0x78 softdep_flushworklist(c775e000,ef1a9bd0,c747a8a0,574,0,...) at softdep_flushworklist+0x47 ffs_sync(c775e000,1,ef1a9c14,4ee,0,...) at ffs_sync+0x2fd dounmount(c775e000,8080000,c747a8a0,473,5b85c5ea,...) at dounmount+0x447 unmount(c747a8a0,ef1a9cec,281766e5,1,0,...) at unmount+0x310 syscallenter(c747a8a0,ef1a9ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef1a9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (22, FreeBSD ELF32, unmount), eip = 0x280dcd6b, esp = 0xbfbfe64c, ebp = 0xbfbfe718 --- fsck -y /tmp watchdogd. Starting inetd. Sun May 15 05:05:40 CEST 2011 FreeBSD/i386 (x4.osted.lan) (console) login: May 15 05:29:43 x4 su: pho to root on /dev/pts/0 panic: kmem_malloc(16384): kmem_map too small: 426692608 total allocated cpuid = 2 KDB: enter: panic [ thread pid 2445 tid 100101 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db> run pho db:0:pho> bt Tracing pid 2445 tid 100101 td 0xc77fa2e0 kdb_enter(c0e85a53,c0e85a53,c0ebe1e3,ef1f9610,2,...) at kdb_enter+0x3a panic(c0ebe1e3,4000,196ed000,c0ebe1dd,7d0,...) at panic+0x134 kmem_malloc(c15b808c,4000,2,ef1f9674,c0bfa9f0,...) at kmem_malloc+0x280 page_alloc(0,4000,ef1f9667,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,0,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffff7f4,ffffffff,efd,0,17b68,...) at setup_trunc_indir+0x3a2 setup_trunc_indir(fffff7f3,ffffffff,efd,0,2eaf8,...) at setup_trunc_indir+0x48b softdep_journal_freeblocks(c7ca5828,c804e900,3bf505e,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c7da3984,3bf505e,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef1f9bf0,c0ed9e34,c7da3984,ef1f9b88,c7da3984,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef1f9bf0,c7da3984,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74c4ce8,3bf505e,0,c804e900,c77fa2e0,...) at vn_truncate+0x145 kern_ftruncate(c77fa2e0,3,3bf505e,0,ef1f9c7c,...) at kern_ftruncate+0xe7 ftruncate(c77fa2e0,ef1f9cec,ef1f9d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c77fa2e0,ef1f9ce4,ef1f9ce4,0,c101f500,...) at syscallenter+0x263 syscall(ef1f9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- db:0:bt> show allpcpu Current CPU: 2 cpuid = 0 dynamic pcpu = 0x44e600 curthread = 0xc71705c0: pid 9 "bufdaemon" curpcb = 0xecf8dd80 fpcurthread = none idlethread = 0xc6dbf000: tid 100006 "idle: cpu0" APIC ID = 0 currentldt = 0x50 spin locks held: cpuid = 1 dynamic pcpu = 0x5b43600 curthread = 0xc6dbf2e0: pid 11 "idle: cpu1" curpcb = 0xc6b30d80 fpcurthread = none idlethread = 0xc6dbf2e0: tid 100005 "idle: cpu1" APIC ID = 1 currentldt = 0x50 spin locks held: cpuid = 2 dynamic pcpu = 0x5b46600 curthread = 0xc77fa2e0: pid 2445 "suj17" curpcb = 0xef1f9d80 fpcurthread = none idlethread = 0xc6dbf5c0: tid 100004 "idle: cpu2" APIC ID = 2 currentldt = 0x50 spin locks held: cpuid = 3 dynamic pcpu = 0x5b49600 curthread = 0xc6ecc000: pid 13 "g_up" curpcb = 0xc6b4cd80 fpcurthread = none idlethread = 0xc6dbf8a0: tid 100003 "idle: cpu3" APIC ID = 3 currentldt = 0x50 spin locks held: db:0:allpcpu> show alllocks Process 2495 (sshd) thread 0xc7df72e0 (100171) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7a978ac) locked @ kern/uipc_sockbuf.c:148 Process 2451 (sshd) thread 0xc77fb5c0 (100159) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7cafbec) locked @ kern/uipc_sockbuf.c:148 Process 2450 (sshd) thread 0xc781a5c0 (100154) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc78e756c) locked @ kern/uipc_sockbuf.c:148 Process 2449 (sshd) thread 0xc747a000 (100090) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc780f3cc) locked @ kern/uipc_sockbuf.c:148 Process 2448 (suj17) thread 0xc781d000 (100135) exclusive lockmgr bufwait (bufwait) r = 0 (0xe070b380) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc8051310) locked @ kern/vfs_vnops.c:655 Process 2447 (suj17) thread 0xc781bb80 (100136) exclusive lockmgr bufwait (bufwait) r = 0 (0xe0827980) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc804d46c) locked @ kern/vfs_vnops.c:655 Process 2446 (suj17) thread 0xc781a8a0 (100149) exclusive lockmgr bufwait (bufwait) r = 0 (0xe07db1e0) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc77ffb38) locked @ kern/vfs_vnops.c:655 Process 2445 (suj17) thread 0xc77fa2e0 (100101) exclusive lockmgr bufwait (bufwait) r = 0 (0xe081b9c0) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc7da39dc) locked @ kern/vfs_vnops.c:655 Process 2444 (suj17) thread 0xc74b8b80 (100146) exclusive lockmgr bufwait (bufwait) r = 0 (0xe08b5e20) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc804d5c8) locked @ kern/vfs_vnops.c:655 Process 2443 (suj17) thread 0xc77f92e0 (100106) exclusive lockmgr bufwait (bufwait) r = 0 (0xe09871a0) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc804d724) locked @ kern/vfs_vnops.c:655 Process 2300 (sshd) thread 0xc74b85c0 (100150) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7a98d8c) locked @ kern/uipc_sockbuf.c:148 Process 9 (bufdaemon) thread 0xc71705c0 (100072) exclusive lockmgr bufwait (bufwait) r = 0 (0xe0761580) locked @ kern/vfs_bio.c:2325 exclusive sleep mutex buf queue lock (buf queue lock) r = 0 (0xc11886f4) locked @ kern/vfs_bio.c:2303 db:0:alllocks> show lockedvnods Locked vnodes 0xc804d6cc: tag ufs, type VREG usecount 1, writecount 1, refcount 611 mountedhere 0 flags () v_object 0xc7dffbb0 ref 0 pages 2436 lock type ufs: EXCL by thread 0xc77f92e0 (pid 2443) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 5, on dev md5a 0xc7da3984: tag ufs, type VREG usecount 1, writecount 1, refcount 274 mountedhere 0 flags () v_object 0xc7dcb880 ref 0 pages 1088 lock type ufs: EXCL by thread 0xc77fa2e0 (pid 2445) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 6, on dev md5a 0xc77ffae0: tag ufs, type VREG usecount 1, writecount 1, refcount 202 mountedhere 0 flags () v_object 0xc7e9c220 ref 0 pages 800 lock type ufs: EXCL by thread 0xc781a8a0 (pid 2446) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 7, on dev md5a 0xc804d570: tag ufs, type VREG usecount 1, writecount 1, refcount 233 mountedhere 0 flags () v_object 0xc74cdcc0 ref 0 pages 924 lock type ufs: EXCL by thread 0xc74b8b80 (pid 2444) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 9, on dev md5a 0xc804d414: tag ufs, type VREG usecount 1, writecount 1, refcount 390 mountedhere 0 flags () v_object 0xc7e9cbb0 ref 0 pages 1552 lock type ufs: EXCL by thread 0xc781bb80 (pid 2447) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 10, on dev md5a 0xc80512b8: tag ufs, type VREG usecount 1, writecount 1, refcount 437 mountedhere 0 flags () v_object 0xc8067c38 ref 0 pages 1740 lock type ufs: EXCL by thread 0xc781d000 (pid 2448) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d71 at ffs_lock+0xa1 #2 0xc0cf4c95 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a51172 at vn_truncate+0xd2 #5 0xc09f6247 at kern_ftruncate+0xe7 #6 0xc09f62c8 at ftruncate+0x28 #7 0xc09eada3 at syscallenter+0x263 #8 0xc0cd24ef at syscall+0x4f #9 0xc0cbb9b1 at Xint0x80_syscall+0x21 ino 11, on dev md5a db:0:lockedvnods> show mount 0xc7410b50 /dev/ad4s1a on / (ufs) 0xc7411000 devfs on /dev (devfs) 0xc77555a8 /dev/ad4s1f on /home (ufs) 0xc775db50 /dev/ad4s1d on /usr (ufs) 0xc775d87c /dev/ad4s1e on /var (ufs) 0xc775d5a8 procfs on /proc (procfs) 0xc775d2d4 linprocfs on /usr/compat/linux/proc (linprocfs) 0xc775d000 /dev/label/tmp on /tmp (ufs) 0xc7755b50 /dev/md5a on /mnt (ufs) More info: show mount db:0:mount> ps pid ppid pgrp uid state wmesg wchan cmd 5753 2461 2459 1001 S nanslp 0xc1012884 sleep 2498 2497 2498 1001 Ss+ ttyin 0xc7e3b070 bash 2497 2495 2495 1001 S select 0xc73bd264 sshd 2495 2080 2495 0 Ss sbwait 0xc7a978d8 sshd 2462 2459 2459 1001 S piperd 0xc74c27a8 awk 2461 2459 2459 1001 S wait 0xc7da9834 sh 2460 2456 2460 1001 Ds+ flswai 0xc11886dc top 2459 2455 2459 1001 Ss wait 0xc7df0af0 sh 2458 2457 2458 1001 Ss kqread 0xc7b1a500 tail 2457 2449 2449 1001 S select 0xc741d2e4 sshd 2456 2450 2450 1001 S select 0xc7df98a4 sshd 2455 2451 2451 1001 S select 0xc7df98e4 sshd 2451 2080 2451 0 Ss sbwait 0xc7cafc18 sshd 2450 2080 2450 0 Ss sbwait 0xc78e7598 sshd 2449 2080 2449 0 Ss sbwait 0xc780f3f8 sshd 2448 2442 2441 1001 D+ nokva 0xef2c86a8 suj17 2447 2442 2441 1001 D+ nokva 0xef2cb6a8 suj17 2446 2442 2441 1001 D+ nokva 0xef2f26a8 suj17 2445 2442 2441 1001 R+ CPU 2 suj17 2444 2442 2441 1001 D+ nokva 0xef2e9624 suj17 2443 2442 2441 1001 D+ nokva 0xef2126a8 suj17 2442 2441 2441 1001 S+ wait 0xc7df12bc suj17 2441 2440 2441 1001 S+ wait 0xc7df1af0 bash 2440 2416 2321 0 S+ wait 0xc77f1af0 su 2435 0 0 0 DL mdwait 0xc7348000 [md5] 2416 2321 2321 0 S+ wait 0xc77f1578 sh 2321 2315 2321 0 S+ wait 0xc77f0834 sh 2315 2311 2315 0 S+ wait 0xc7da62bc bash 2311 2310 2311 0 S+ pause 0xc74705d0 csh 2310 2303 2310 1001 S+ wait 0xc77f3578 su 2303 2302 2303 1001 Ss+ wait 0xc77f3834 bash 2302 2300 2300 1001 S select 0xc716ca24 sshd 2300 2080 2300 0 Ss sbwait 0xc7a98db8 sshd 2204 1 2204 0 Ss+ ttyin 0xc7182070 getty 2203 1 2203 0 Ss+ ttyin 0xc7182270 getty 2202 1 2202 0 Ss+ ttyin 0xc7182470 getty 2201 1 2201 0 Ss+ ttyin 0xc6f52070 getty 2200 1 2200 0 Ss+ ttyin 0xc6f52270 getty 2199 1 2199 0 Ss+ ttyin 0xc6f52470 getty 2198 1 2198 0 Ss+ ttyin 0xc6f52670 getty 2197 1 2197 0 Ss+ ttyin 0xc6f52870 getty 2196 1 2196 0 Ss+ ttyin 0xc6f52a70 getty 2152 1 2152 0 Ss select 0xc716c524 inetd 2125 1 2125 0 Ss nanslp 0xc1012884 watchdogd 2100 1 2100 0 Ss nanslp 0xc1012884 cron 2092 1 2092 25 Ss pause 0xc7472058 sendmail 2088 1 2088 0 Ss select 0xc741e1a4 sendmail 2080 1 2080 0 Ss select 0xc741e1e4 sshd 2020 1 2020 0 Ss select 0xc741e224 moused 1960 1 1960 0 Ss select 0xc7401264 ntpd 1842 1841 1841 0 S (threaded) nfsd 100125 S rpcsvc 0xc79f9810 nfsd: service 100124 S rpcsvc 0xc6f7f350 nfsd: service 100123 S rpcsvc 0xc79f9850 nfsd: service 100088 S rpcsvc 0xc6f7f490 nfsd: master 1841 1 1841 0 Ss select 0xc741e264 nfsd 1832 1 1832 0 Ss select 0xc716c6e4 mountd 1733 1 1733 0 Ss select 0xc741e2a4 rpcbind 1708 1 1708 0 Ss select 0xc741dca4 syslogd 1507 1 1507 0 Ss select 0xc741e3a4 devd 18 0 0 0 DL bufwait 0xe07db1e0 [softdepflush] 17 0 0 0 DL syncer 0xc1188a14 [syncer] 16 0 0 0 DL vlruwt 0xc73a4834 [vnlru] 9 0 0 0 RL CPU 0 [bufdaemon] 8 0 0 0 DL pgzero 0xc1190ddc [pagezero] 7 0 0 0 DL psleep 0xc11909c8 [vmdaemon] 6 0 0 0 DL psleep 0xc1190990 [pagedaemon] 5 0 0 0 DL ccb_scan 0xc0fd7754 [xpt_thrd] 4 0 0 0 DL waiting_ 0xc118a4d8 [sctp_iterator] 3 0 0 0 DL - 0xc6fe143c [fdc0] 2 0 0 0 SL - 0xc706b000 [fw0_probe] 15 0 0 0 DL (threaded) [usb] 100057 D - 0xc704bd34 [usbus5] 100056 D - 0xc704bd04 [usbus5] 100055 D - 0xc704bcd4 [usbus5] 100054 D - 0xc704bca4 [usbus5] 100052 D - 0xc7040b5c [usbus4] 100051 D - 0xc7040b2c [usbus4] 100050 D - 0xc7040afc [usbus4] 100049 D - 0xc7040acc [usbus4] 100048 D - 0xc7039b5c [usbus3] 100047 D - 0xc7039b2c [usbus3] 100046 D - 0xc7039afc [usbus3] 100045 D - 0xc7039acc [usbus3] 100044 D - 0xc702fb5c [usbus2] 100043 D - 0xc702fb2c [usbus2] 100042 D - 0xc702fafc [usbus2] 100041 D - 0xc702facc [usbus2] 100039 D - 0xc7029b5c [usbus1] 100038 D - 0xc7029b2c [usbus1] 100037 D - 0xc7029afc [usbus1] 100036 D - 0xc7029acc [usbus1] 100034 D - 0xc7019b5c [usbus0] 100033 D - 0xc7019b2c [usbus0] 100032 D - 0xc7019afc [usbus0] 100031 D - 0xc7019acc [usbus0] 14 0 0 0 DL - 0xc1011684 [yarrow] 13 0 0 0 RL (threaded) [geom] 100015 D - 0xc100f2c8 [g_down] 100014 Run CPU 3 [g_up] 100013 D - 0xc100f2bc [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: ohci0] 100029 I [irq22: ahci0] 100028 I [irq256: re0] 100027 I [swi2: cambio] 100021 I [swi6: task queue] 100020 I [swi6: Giant taskq] 100018 I [swi5: +] 100012 I [swi4: clock] 100011 I [swi4: clock] 100010 I [swi4: clock] 100009 I [swi4: clock] 100008 I [swi3: vm] 100007 I [swi1: netisr 0] 11 0 0 0 RL (threaded) [idle] 100006 CanRun [idle: cpu0] 100005 Run CPU 1 [idle: cpu1] 100004 CanRun [idle: cpu2] 100003 CanRun [idle: cpu3] 1 0 1 0 SLs wait 0xc6dbdaf0 [init] 10 0 0 0 DL audit_wo 0xc118e700 [audit] 0 0 0 0 DLs (threaded) [kernel] 100076 D - 0xc71853c0 [mca taskq] 100066 D - 0xc1011684 [deadlkres] 100060 D - 0xc7073900 [fw0_taskq] 100026 D - 0xc6d92340 [acpi_task_2] 100025 D - 0xc6d92340 [acpi_task_1] 100024 D - 0xc6d92340 [acpi_task_0] 100023 D - 0xc6d92380 [kqueue taskq] 100022 D - 0xc6d923c0 [ffs_trim taskq] 100019 D - 0xc6d92500 [thread taskq] 100016 D - 0xc6d92a80 [firmware taskq] 100000 D sched 0xc100f3a0 [swapper] db:0:ps> allt Tracing command sleep pid 5753 tid 100109 td 0xc74bd8a0 sched_switch(c74bd8a0,0,104,191,ea58b66e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c74bd8a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(2711,c09e7470,c74bd8a0,1,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c1012884,6c,c0e86f77,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c1012884,0,16c,c0e86f77,2711,...) at _sleep+0x328 kern_nanosleep(c74bd8a0,ef21ec34,ef21ec3c,a,0,...) at kern_nanosleep+0xc1 nanosleep(c74bd8a0,ef21ecec,ef21ed28,c0e8babe,0,...) at nanosleep+0x6f syscallenter(c74bd8a0,ef21ece4,ef21ece4,0,0,...) at syscallenter+0x263 syscall(ef21ed28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28165b67, esp = 0xbfbfec5c, ebp = 0xbfbfeca8 --- Tracing command bash pid 2498 tid 100144 td 0xc74b92e0 sched_switch(c74b92e0,0,104,191,6a656905,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74b92e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7e3b004,0,c0e84007,c74b92e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7e3b070,0,ef2e3ad8,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7e3b070,c7e3b004,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7e3b000,c7e3b070,ef2e3c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7e3b000,ef2e3c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c73efb00,ef2e3c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5b60,ef2e3c28,c7412300,0,c74b92e0,...) at devfs_read_f+0x7e dofileread(ef2e3c28,ffffffff,ffffffff,0,c74d5b60,...) at dofileread+0x9e kern_readv(c74b92e0,0,ef2e3c28,ef2e3c48,1,...) at kern_readv+0x58 read(c74b92e0,ef2e3cec,ef2e3d28,c0e8babe,0,...) at read+0x4f syscallenter(c74b92e0,ef2e3ce4,ef2e3ce4,0,0,...) at syscallenter+0x263 syscall(ef2e3d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28354623, esp = 0xbfbfdfcc, ebp = 0xbfbfdff8 --- Tracing command sshd pid 2497 tid 100182 td 0xc7db02e0 sched_switch(c7db02e0,0,104,191,6a66a9c9,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7db02e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73bd250,0,c0e84007,c7db02e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73bd264,0,ef364a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73bd264,c73bd250,c0e8d785,627,c744ab28,...) at _cv_wait_sig+0x243 seltdwait(c744ab28,58,c7b11c00,c7db02e0,246,...) at seltdwait+0xa2 kern_select(c7db02e0,c,288060b8,288060dc,0,0,20,c92d0af0,c92d0af0) at kern_select+0x504 select(c7db02e0,ef364cec,ef364d28,c0e8babe,0,...) at select+0x66 syscallenter(c7db02e0,ef364ce4,ef364ce4,0,0,...) at syscallenter+0x263 syscall(ef364d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2495 tid 100171 td 0xc7df72e0 sched_switch(c7df72e0,0,104,191,c417e1aa,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c7df72e0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7a978d8,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7a978d8,c7a97898,168,c0e915e1,0) at _sleep+0x35c sbwait(c7a97874,4,c0e916b9,5ec,c7a97898,...) at sbwait+0x76 soreceive_generic(c7a97820,0,ef337c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7a97820,0,ef337c28,0,0,0) at soreceive+0x38 soo_read(c744ac08,ef337c28,c7b11980,0,c7df72e0,...) at soo_read+0x4e dofileread(ef337c28,ffffffff,ffffffff,0,c744ac08,...) at dofileread+0x9e kern_readv(c7df72e0,5,ef337c28,ef337c48,1,...) at kern_readv+0x58 read(c7df72e0,ef337cec,ef337d28,c0e8babe,0,...) at read+0x4f syscallenter(c7df72e0,ef337ce4,ef337ce4,0,c101fb80,...) at syscallenter+0x263 syscall(ef337d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command awk pid 2462 tid 100174 td 0xc7df68a0 sched_switch(c7df68a0,0,104,191,e9ff10a2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c7df68a0,0,c0e8b180,1a7,5c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c74c27a8,5c,c0e8d943,100,0,...) at sleepq_wait_sig+0x17 _sleep(c74c27a8,c74c2918,15c,c0e8d943,0,...) at _sleep+0x35c pipe_read(c7913188,ef340c28,c804e400,0,c7df68a0,...) at pipe_read+0x417 dofileread(ef340c28,ffffffff,ffffffff,0,c7913188,...) at dofileread+0x9e kern_readv(c7df68a0,0,ef340c28,ef340c48,1,...) at kern_readv+0x58 read(c7df68a0,ef340cec,ef340d80,ef340c88,0,...) at read+0x4f syscallenter(c7df68a0,ef340ce4,c0cd2a06,0,0,...) at syscallenter+0x263 syscall(ef340d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x281b8623, esp = 0xbfbfe93c, ebp = 0xbfbfe958 --- Tracing command sh pid 2461 tid 100140 td 0xc74b98a0 sched_switch(c74b98a0,0,104,191,ea25b35d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c74b98a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7da9834,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7da9834,c7da98bc,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c74b98a0,ffffffff,ef2d7c44,2,0,...) at kern_wait+0xbe6 wait4(c74b98a0,ef2d7cec,ef2d7d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c74b98a0,ef2d7ce4,ef2d7ce4,0,0,...) at syscallenter+0x263 syscall(ef2d7d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfe98c, ebp = 0xbfbfe9a8 --- Tracing command top pid 2460 tid 100176 td 0xc7df62e0 sched_switch(c7df62e0,0,104,191,c05eb160,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7df62e0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c11886dc,60,c0e9263d,0,0,...) at sleepq_wait+0x63 _sleep(c11886dc,c11886e0,60,c0e9263d,0,...) at _sleep+0x372 bwillwrite(4,c7df62e0,c7df62e0,ef346c04,1,...) at bwillwrite+0xf7 dofilewrite(ef346c28,ffffffff,ffffffff,0,c74d5540,...) at dofilewrite+0x6c kern_writev(c7df62e0,1,ef346c28,ef346c48,1,...) at kern_writev+0x58 write(c7df62e0,ef346cec,ef346c7c,c09984e4,0,...) at write+0x4f syscallenter(c7df62e0,ef346ce4,c0ed50e8,ee,0,...) at syscallenter+0x263 syscall(ef346d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (4, FreeBSD ELF32, write), eip = 0x281ee603, esp = 0xbfbfeaac, ebp = 0xbfbfeac8 --- Tracing command sh pid 2459 tid 100175 td 0xc7df65c0 sched_switch(c7df65c0,0,104,191,dac24a44,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7df65c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7df0af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7df0af0,c7df0b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7df65c0,ffffffff,ef343c44,2,0,...) at kern_wait+0xbe6 wait4(c7df65c0,ef343cec,2820ed08,1,0,...) at wait4+0x3b syscallenter(c7df65c0,ef343ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef343d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfeb3c, ebp = 0xbfbfeb58 --- Tracing command tail pid 2458 tid 100161 td 0xc7db12e0 sched_switch(c7db12e0,0,104,191,782f08bb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c7db12e0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(3e9,c09e7470,c7db12e0,0,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c7b1a500,68,c0e7ff70,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c7b1a500,c7b1a500,168,c0e7ff70,3e9,...) at _sleep+0x328 kern_kevent(c7db12e0,4,0,1,ef317c28,...) at kern_kevent+0x364 kevent(c7db12e0,ef317cec,ef317d28,c0e8babe,0,...) at kevent+0x19e syscallenter(c7db12e0,ef317ce4,ef317ce4,0,0,...) at syscallenter+0x263 syscall(ef317d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (363, FreeBSD ELF32, kevent), eip = 0x28169c9b, esp = 0xbfbfeb1c, ebp = 0xbfbfebd8 --- Tracing command sshd pid 2457 tid 100145 td 0xc74b9000 sched_switch(c74b9000,0,104,191,d636670f,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74b9000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741d2d0,0,c0e84007,c74b9000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741d2e4,0,ef2e6a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741d2e4,c741d2d0,c0e8d785,627,c78ee3f0,...) at _cv_wait_sig+0x243 seltdwait(c78ee3f0,58,c715b880,c74b9000,246,...) at seltdwait+0xa2 kern_select(c74b9000,c,288060b8,288060dc,0,0,20,c7da9000,c7da9000) at kern_select+0x504 select(c74b9000,ef2e6cec,ef2e6d28,c0e8babe,0,...) at select+0x66 syscallenter(c74b9000,ef2e6ce4,ef2e6ce4,0,0,...) at syscallenter+0x263 syscall(ef2e6d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2456 tid 100118 td 0xc743bb80 sched_switch(c743bb80,0,104,191,54d23c3e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c743bb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7df9890,0,c0e84007,c743bb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7df98a4,0,ef25ba4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7df98a4,c7df9890,c0e8d785,627,c78ee7e0,...) at _cv_wait_sig+0x243 seltdwait(c78ee7e0,58,c74d3400,c743bb80,246,...) at seltdwait+0xa2 kern_select(c743bb80,a,288060b8,288060dc,0,0,20,c73a6af0,c73a6af0) at kern_select+0x504 select(c743bb80,ef25bcec,ef25bd28,c0e8babe,0,...) at select+0x66 syscallenter(c743bb80,ef25bce4,ef25bce4,0,0,...) at syscallenter+0x263 syscall(ef25bd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2455 tid 100177 td 0xc7df6000 sched_switch(c7df6000,0,104,191,25013d59,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7df6000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7df98d0,0,c0e84007,c7df6000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7df98e4,0,ef349a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7df98e4,c7df98d0,c0e8d785,627,c744aa48,...) at _cv_wait_sig+0x243 seltdwait(c744aa48,58,c7412e80,c7df6000,246,...) at seltdwait+0xa2 kern_select(c7df6000,c,288060b8,288060dc,0,0,20,c7df0578,c7df0578) at kern_select+0x504 select(c7df6000,ef349cec,ef349d28,c0e8babe,0,...) at select+0x66 syscallenter(c7df6000,ef349ce4,ef349ce4,0,0,...) at syscallenter+0x263 syscall(ef349d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2451 tid 100159 td 0xc77fb5c0 sched_switch(c77fb5c0,0,104,191,d3f99abb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c77fb5c0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7cafc18,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7cafc18,c7cafbd8,168,c0e915e1,0) at _sleep+0x35c sbwait(c7cafbb4,4,c0e916b9,5ec,c7cafbd8,...) at sbwait+0x76 soreceive_generic(c7cafb60,0,ef310c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7cafb60,0,ef310c28,0,0,0) at soreceive+0x38 soo_read(c74c4738,ef310c28,c6d9f380,0,c77fb5c0,...) at soo_read+0x4e dofileread(ef310c28,ffffffff,ffffffff,0,c74c4738,...) at dofileread+0x9e kern_readv(c77fb5c0,5,ef310c28,ef310c48,1,...) at kern_readv+0x58 read(c77fb5c0,ef310cec,ef310d28,c0e8babe,0,...) at read+0x4f syscallenter(c77fb5c0,ef310ce4,ef310ce4,0,0,...) at syscallenter+0x263 syscall(ef310d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command sshd pid 2450 tid 100154 td 0xc781a5c0 sched_switch(c781a5c0,0,104,191,d51406e6,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c781a5c0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c78e7598,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c78e7598,c78e7558,168,c0e915e1,0) at _sleep+0x35c sbwait(c78e7534,4,c0e916b9,5ec,c78e7558,...) at sbwait+0x76 soreceive_generic(c78e74e0,0,ef301c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c78e74e0,0,ef301c28,0,0,0) at soreceive+0x38 soo_read(c744ae70,ef301c28,c715b200,0,c781a5c0,...) at soo_read+0x4e dofileread(ef301c28,ffffffff,ffffffff,0,c744ae70,...) at dofileread+0x9e kern_readv(c781a5c0,5,ef301c28,ef301c48,1,...) at kern_readv+0x58 read(c781a5c0,ef301cec,288d8010,1,0,...) at read+0x4f syscallenter(c781a5c0,ef301ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef301d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command sshd pid 2449 tid 100090 td 0xc747a000 sched_switch(c747a000,0,104,191,d46313ac,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c747a000,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c780f3f8,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c780f3f8,c780f3b8,168,c0e915e1,0) at _sleep+0x35c sbwait(c780f394,4,c0e916b9,5ec,c780f3b8,...) at sbwait+0x76 soreceive_generic(c780f340,0,ef1bdc28,0,0,...) at soreceive_generic+0x3f0 soreceive(c780f340,0,ef1bdc28,0,0,0) at soreceive+0x38 soo_read(c7449310,ef1bdc28,c6d9f480,0,c747a000,...) at soo_read+0x4e dofileread(ef1bdc28,ffffffff,ffffffff,0,c7449310,...) at dofileread+0x9e kern_readv(c747a000,5,ef1bdc28,ef1bdc48,1,...) at kern_readv+0x58 read(c747a000,ef1bdcec,ef1bdd28,c0e8babe,0,...) at read+0x4f syscallenter(c747a000,ef1bdce4,ef1bdce4,0,0,...) at syscallenter+0x263 syscall(ef1bdd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command suj17 pid 2448 tid 100135 td 0xc781d000 sched_switch(c781d000,0,104,191,10ac6747,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781d000,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(ef2c86a8,0,c0ebe1dd,0,0,...) at sleepq_timedwait+0x6b _sleep(ef2c86a8,0,0,c0ebe1dd,7d0,...) at _sleep+0x342 kmem_malloc(c15b808c,4000,2,ef2c86f8,c0bfa9f0,...) at kmem_malloc+0x24b page_alloc(0,4000,ef2c86eb,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,0,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffff7f3,ffffffff,11bf,0,44ea0,...) at setup_trunc_indir+0x3a2 softdep_journal_freeblocks(c79aa32c,c804e900,46fe7ca,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c80512b8,46fe7ca,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef2c8bf0,c0ed9e34,c80512b8,ef2c8b88,c80512b8,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef2c8bf0,c80512b8,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c744ae00,46fe7ca,0,c804e900,c781d000,...) at vn_truncate+0x145 kern_ftruncate(c781d000,3,46fe7ca,0,ef2c8c7c,...) at kern_ftruncate+0xe7 ftruncate(c781d000,ef2c8cec,ef2c8d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c781d000,ef2c8ce4,ef2c8ce4,0,c1020200,...) at syscallenter+0x263 syscall(ef2c8d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2447 tid 100136 td 0xc781bb80 sched_switch(c781bb80,0,104,191,5a04541,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781bb80,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(ef2cb6a8,0,c0ebe1dd,0,0,...) at sleepq_timedwait+0x6b _sleep(ef2cb6a8,0,0,c0ebe1dd,7d0,...) at _sleep+0x342 kmem_malloc(c15b808c,4000,2,ef2cb6f8,c0bfa9f0,...) at kmem_malloc+0x24b page_alloc(0,4000,ef2cb6eb,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,c8624980,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffffff4,ffffffff,575,0,2c38,...) at setup_trunc_indir+0x3a2 softdep_journal_freeblocks(c7e299f8,c804e900,15d4571,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c804d414,15d4571,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef2cbbf0,c0ed9e34,c804d414,ef2cbb88,c804d414,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef2cbbf0,c804d414,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c7449c08,15d4571,0,c804e900,c781bb80,...) at vn_truncate+0x145 kern_ftruncate(c781bb80,3,15d4571,0,ef2cbc7c,...) at kern_ftruncate+0xe7 ftruncate(c781bb80,ef2cbcec,ef2cbd28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c781bb80,ef2cbce4,ef2cbce4,0,c1020200,...) at syscallenter+0x263 syscall(ef2cbd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2446 tid 100149 td 0xc781a8a0 sched_switch(c781a8a0,0,104,191,5d72621,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781a8a0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(ef2f26a8,0,c0ebe1dd,0,0,...) at sleepq_timedwait+0x6b _sleep(ef2f26a8,0,0,c0ebe1dd,7d0,...) at _sleep+0x342 kmem_malloc(c15b808c,4000,2,ef2f26f8,c0bfa9f0,...) at kmem_malloc+0x24b page_alloc(0,4000,ef2f26eb,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,0,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffff7f3,ffffffff,9e2,0,2ec08,...) at setup_trunc_indir+0x3a2 softdep_journal_freeblocks(c79aa15c,c804e900,278babd,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c77ffae0,278babd,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef2f2bf0,c0ed9e34,c77ffae0,ef2f2b88,c77ffae0,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef2f2bf0,c77ffae0,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c7449038,278babd,0,c804e900,c781a8a0,...) at vn_truncate+0x145 kern_ftruncate(c781a8a0,3,278babd,0,ef2f2c7c,...) at kern_ftruncate+0xe7 ftruncate(c781a8a0,ef2f2cec,ef2f2d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c781a8a0,ef2f2ce4,ef2f2ce4,0,c101f500,...) at syscallenter+0x263 syscall(ef2f2d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2445 tid 100101 td 0xc77fa2e0 kdb_enter(c0e85a53,c0e85a53,c0ebe1e3,ef1f9610,2,...) at kdb_enter+0x3a panic(c0ebe1e3,4000,196ed000,c0ebe1dd,7d0,...) at panic+0x134 kmem_malloc(c15b808c,4000,2,ef1f9674,c0bfa9f0,...) at kmem_malloc+0x280 page_alloc(0,4000,ef1f9667,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,0,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffff7f4,ffffffff,efd,0,17b68,...) at setup_trunc_indir+0x3a2 setup_trunc_indir(fffff7f3,ffffffff,efd,0,2eaf8,...) at setup_trunc_indir+0x48b softdep_journal_freeblocks(c7ca5828,c804e900,3bf505e,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c7da3984,3bf505e,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef1f9bf0,c0ed9e34,c7da3984,ef1f9b88,c7da3984,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef1f9bf0,c7da3984,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74c4ce8,3bf505e,0,c804e900,c77fa2e0,...) at vn_truncate+0x145 kern_ftruncate(c77fa2e0,3,3bf505e,0,ef1f9c7c,...) at kern_ftruncate+0xe7 ftruncate(c77fa2e0,ef1f9cec,ef1f9d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c77fa2e0,ef1f9ce4,ef1f9ce4,0,c101f500,...) at syscallenter+0x263 syscall(ef1f9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2444 tid 100146 td 0xc74b8b80 sched_switch(c74b8b80,0,104,191,6e8572b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74b8b80,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(ef2e9624,0,c0ebe1dd,0,0,...) at sleepq_timedwait+0x6b _sleep(ef2e9624,0,0,c0ebe1dd,7d0,...) at _sleep+0x342 kmem_malloc(c15b808c,4000,2,ef2e9674,c0bfa9f0,...) at kmem_malloc+0x24b page_alloc(0,4000,ef2e9667,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,0,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffff7f4,ffffffff,b11,0,17bc0,...) at setup_trunc_indir+0x3a2 setup_trunc_indir(fffff7f3,ffffffff,b11,0,17bb8,...) at setup_trunc_indir+0x48b softdep_journal_freeblocks(c7e29a6c,c804e900,2c47ea7,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c804d570,2c47ea7,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef2e9bf0,c0ed9e34,c804d570,ef2e9b88,c804d570,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef2e9bf0,c804d570,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c744ac78,2c47ea7,0,c804e900,c74b8b80,...) at vn_truncate+0x145 kern_ftruncate(c74b8b80,3,2c47ea7,0,ef2e9c7c,...) at kern_ftruncate+0xe7 ftruncate(c74b8b80,ef2e9cec,c09cd77d,c101fdb8,0,...) at ftruncate+0x28 syscallenter(c74b8b80,ef2e9ce4,ef2e9cc0,c09cfe08,c101fb80,...) at syscallenter+0x263 syscall(ef2e9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2443 tid 100106 td 0xc77f92e0 sched_switch(c77f92e0,0,104,191,84d8abb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77f92e0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(ef2126a8,0,c0ebe1dd,0,0,...) at sleepq_timedwait+0x6b _sleep(ef2126a8,0,0,c0ebe1dd,7d0,...) at _sleep+0x342 kmem_malloc(c15b808c,4000,2,ef2126f8,c0bfa9f0,...) at kmem_malloc+0x24b page_alloc(0,4000,ef2126eb,2,2eb8525,...) at page_alloc+0x27 uma_large_malloc(4000,2,c0e84007,2,c8608480,...) at uma_large_malloc+0x50 malloc(4000,c0fb8b48,2,1632,0,...) at malloc+0x14d setup_trunc_indir(fffffff4,ffffffff,79e,0,2c68,...) at setup_trunc_indir+0x3a2 softdep_journal_freeblocks(c7e29ae0,c804e900,1e78ba5,0,800,...) at softdep_journal_freeblocks+0x681 ffs_truncate(c804d6cc,1e78ba5,0,800,c804e900,...) at ffs_truncate+0x94e ufs_setattr(ef212bf0,c0ed9e34,c804d6cc,ef212b88,c804d6cc,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb340,ef212bf0,c804d6cc,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74497a8,1e78ba5,0,c804e900,c77f92e0,...) at vn_truncate+0x145 kern_ftruncate(c77f92e0,3,1e78ba5,0,ef212c7c,...) at kern_ftruncate+0xe7 ftruncate(c77f92e0,ef212cec,c09cd77d,c101f738,0,...) at ftruncate+0x28 syscallenter(c77f92e0,ef212ce4,ef212cc0,c09cfe08,c101f500,...) at syscallenter+0x263 syscall(ef212d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2442 tid 100173 td 0xc7df6b80 sched_switch(c7df6b80,0,104,191,640ec3b7,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7df6b80,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7df12bc,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7df12bc,c7df1344,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7df6b80,ffffffff,ef33dc44,0,0,...) at kern_wait+0xbe6 wait4(c7df6b80,ef33dcec,28195d08,1,0,...) at wait4+0x3b syscallenter(c7df6b80,ef33dce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef33dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x280f093b, esp = 0xbfbfe82c, ebp = 0xbfbfe848 --- Tracing command bash pid 2441 tid 100170 td 0xc7df75c0 sched_switch(c7df75c0,0,104,191,63b6bb3d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7df75c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7df1af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7df1af0,c7df1b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7df75c0,ffffffff,ef334c44,0,0,...) at kern_wait+0xbe6 wait4(c7df75c0,ef334cec,28368d08,1,0,...) at wait4+0x3b syscallenter(c7df75c0,ef334ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef334d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe3ec, ebp = 0xbfbfe408 --- Tracing command su pid 2440 tid 100092 td 0xc74738a0 sched_switch(c74738a0,0,104,191,62f3cd30,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c74738a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f1af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f1af0,c77f1b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c74738a0,989,ef1dec44,2,0,...) at kern_wait+0xbe6 wait4(c74738a0,ef1decec,281c8d08,1,0,...) at wait4+0x3b syscallenter(c74738a0,ef1dece4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef1ded28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2812393b, esp = 0xbfbfe32c, ebp = 0xbfbfe348 --- Tracing command md5 pid 2435 tid 100110 td 0xc74bd5c0 sched_switch(c74bd5c0,0,104,191,d72713ef,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c74bd5c0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c7348000,5c,c0e31d71,0,0,...) at sleepq_wait+0x63 _sleep(c7348000,c7348020,25c,c0e31d71,0,...) at _sleep+0x372 md_kthread(c7348000,ef223d28,c0e8036c,390,c77f3af0,...) at md_kthread+0x11a fork_exit(c07276f0,c7348000,ef223d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xef223d60, ebp = 0 --- Tracing command sh pid 2416 tid 100094 td 0xc74732e0 sched_switch(c74732e0,0,104,191,619e9fdf,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c74732e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f1578,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f1578,c77f1600,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c74732e0,ffffffff,ef1e4c44,2,0,...) at kern_wait+0xbe6 wait4(c74732e0,ef1e4cec,ef1e4d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c74732e0,ef1e4ce4,ef1e4ce4,0,0,...) at syscallenter+0x263 syscall(ef1e4d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfe83c, ebp = 0xbfbfe858 --- Tracing command sh pid 2321 tid 100098 td 0xc77fab80 sched_switch(c77fab80,0,104,191,f0f00988,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c77fab80,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f0834,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f0834,c77f08bc,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c77fab80,ffffffff,ef1f0c44,2,0,...) at kern_wait+0xbe6 wait4(c77fab80,ef1f0cec,ef1f0d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c77fab80,ef1f0ce4,ef1f0ce4,0,0,...) at syscallenter+0x263 syscall(ef1f0d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfe70c, ebp = 0xbfbfe728 --- Tracing command bash pid 2315 tid 100162 td 0xc7db1000 sched_switch(c7db1000,0,104,191,b2ffc21d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7db1000,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7da62bc,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7da62bc,c7da6344,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7db1000,ffffffff,ef31bc44,6,0,...) at kern_wait+0xbe6 wait4(c7db1000,ef31bcec,ef31bd28,c0e8babe,0,...) at wait4+0x3b syscallenter(c7db1000,ef31bce4,ef31bce4,0,0,...) at syscallenter+0x263 syscall(ef31bd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command csh pid 2311 tid 100087 td 0xc747a5c0 sched_switch(c747a5c0,0,104,191,b2913c9f,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,74,...) at mi_switch+0x219 sleepq_switch(c747a5c0,0,c0e8b180,1a7,74,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c74705d0,74,c0d20e4e,100,0,...) at sleepq_wait_sig+0x17 _sleep(c74705d0,c7470600,174,c0d20e4e,0,...) at _sleep+0x35c kern_sigsuspend(c747a5c0,0,0,0,0,...) at kern_sigsuspend+0xba sigsuspend(c747a5c0,ef1b1cec,ef1b1d28,c0e8babe,0,...) at sigsuspend+0x4d syscallenter(c747a5c0,ef1b1ce4,ef1b1ce4,0,0,...) at syscallenter+0x263 syscall(ef1b1d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818ac8b, esp = 0xbfbfe59c, ebp = 0xbfbfe608 --- Tracing command su pid 2310 tid 100112 td 0xc781d5c0 sched_switch(c781d5c0,0,104,191,5d184f54,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c781d5c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f3578,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f3578,c77f3600,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c781d5c0,907,ef229c44,2,0,...) at kern_wait+0xbe6 wait4(c781d5c0,ef229cec,281c8d08,1,0,...) at wait4+0x3b syscallenter(c781d5c0,ef229ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef229d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2812393b, esp = 0xbfbfe5cc, ebp = 0xbfbfe5e8 --- Tracing command bash pid 2303 tid 100111 td 0xc74bd2e0 sched_switch(c74bd2e0,0,104,191,56eaa826,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c74bd2e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f3834,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f3834,c77f38bc,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c74bd2e0,ffffffff,ef226c44,6,0,...) at kern_wait+0xbe6 wait4(c74bd2e0,ef226cec,ef226d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c74bd2e0,ef226ce4,ef226ce4,0,0,...) at syscallenter+0x263 syscall(ef226d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe97c, ebp = 0xbfbfe998 --- Tracing command sshd pid 2302 tid 100167 td 0xc7df8000 sched_switch(c7df8000,0,104,191,5ff9e2ca,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7df8000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c716ca10,0,c0e84007,c7df8000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c716ca24,0,ef32ba4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c716ca24,c716ca10,c0e8d785,627,c74493f0,...) at _cv_wait_sig+0x243 seltdwait(c74493f0,58,c7b11700,c7df8000,246,...) at seltdwait+0xa2 kern_select(c7df8000,c,288060b8,288060dc,0,0,20,c7df2578,c7df2578) at kern_select+0x504 select(c7df8000,ef32bcec,ef32bd28,c0e8babe,0,...) at select+0x66 syscallenter(c7df8000,ef32bce4,ef32bce4,0,0,...) at syscallenter+0x263 syscall(ef32bd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2300 tid 100150 td 0xc74b85c0 sched_switch(c74b85c0,0,104,191,945fccab,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c74b85c0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7a98db8,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7a98db8,c7a98d78,168,c0e915e1,0) at _sleep+0x35c sbwait(c7a98d54,4,c0e916b9,5ec,c7a98d78,...) at sbwait+0x76 soreceive_generic(c7a98d00,0,ef2f5c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7a98d00,0,ef2f5c28,0,0,0) at soreceive+0x38 soo_read(c78ee6c8,ef2f5c28,c7412e00,0,c74b85c0,...) at soo_read+0x4e dofileread(ef2f5c28,ffffffff,ffffffff,0,c78ee6c8,...) at dofileread+0x9e kern_readv(c74b85c0,5,ef2f5c28,ef2f5c48,1,...) at kern_readv+0x58 read(c74b85c0,ef2f5cec,ef2f5d28,c0e8babe,0,...) at read+0x4f syscallenter(c74b85c0,ef2f5ce4,ef2f5ce4,0,0,...) at syscallenter+0x263 syscall(ef2f5d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command getty pid 2204 tid 100156 td 0xc781a000 sched_switch(c781a000,0,104,191,2a3d5220,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781a000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781a000,c781a000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182070,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182070,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182000,c7182070,ef307c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182000,ef307c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717b800,ef307c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5a10,ef307c28,c6d9ee80,0,c781a000,...) at devfs_read_f+0x7e dofileread(ef307c28,ffffffff,ffffffff,0,c74d5a10,...) at dofileread+0x9e kern_readv(c781a000,0,ef307c28,ef307c48,1,...) at kern_readv+0x58 read(c781a000,ef307cec,ef307d28,c0e8babe,0,...) at read+0x4f syscallenter(c781a000,ef307ce4,ef307ce4,0,0,...) at syscallenter+0x263 syscall(ef307d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2203 tid 100143 td 0xc781b000 sched_switch(c781b000,0,104,191,2a4a497e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781b000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781b000,c781b000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182270,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182270,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182200,c7182270,ef2e0c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182200,ef2e0c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717b900,ef2e0c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5770,ef2e0c28,c6d9ee80,0,c781b000,...) at devfs_read_f+0x7e dofileread(ef2e0c28,ffffffff,ffffffff,0,c74d5770,...) at dofileread+0x9e kern_readv(c781b000,0,ef2e0c28,ef2e0c48,1,...) at kern_readv+0x58 read(c781b000,ef2e0cec,ef2e0d28,c0e8babe,0,...) at read+0x4f syscallenter(c781b000,ef2e0ce4,ef2e0ce4,0,0,...) at syscallenter+0x263 syscall(ef2e0d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2202 tid 100139 td 0xc781b5c0 sched_switch(c781b5c0,0,104,191,2a15375d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781b5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781b5c0,c781b5c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182470,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182470,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182400,c7182470,ef2d4c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182400,ef2d4c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717ba00,ef2d4c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d55e8,ef2d4c28,c6d9ee80,0,c781b5c0,...) at devfs_read_f+0x7e dofileread(ef2d4c28,ffffffff,ffffffff,0,c74d55e8,...) at dofileread+0x9e kern_readv(c781b5c0,0,ef2d4c28,ef2d4c48,1,...) at kern_readv+0x58 read(c781b5c0,ef2d4cec,ef2d4d28,c0e8babe,0,...) at read+0x4f syscallenter(c781b5c0,ef2d4ce4,ef2d4ce4,0,0,...) at syscallenter+0x263 syscall(ef2d4d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2201 tid 100142 td 0xc781b2e0 sched_switch(c781b2e0,0,104,191,2a42b4a2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781b2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781b2e0,c781b2e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52070,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52070,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52000,c6f52070,ef2ddc28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52000,ef2ddc28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bb00,ef2ddc28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7464310,ef2ddc28,c6d9ee80,0,c781b2e0,...) at devfs_read_f+0x7e dofileread(ef2ddc28,ffffffff,ffffffff,0,c7464310,...) at dofileread+0x9e kern_readv(c781b2e0,0,ef2ddc28,ef2ddc48,1,...) at kern_readv+0x58 read(c781b2e0,ef2ddcec,ef2ddd28,c0e8babe,0,...) at read+0x4f syscallenter(c781b2e0,ef2ddce4,ef2ddce4,0,0,...) at syscallenter+0x263 syscall(ef2ddd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2200 tid 100138 td 0xc781b8a0 sched_switch(c781b8a0,0,104,191,2a4f902d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781b8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781b8a0,c781b8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52270,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52270,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52200,c6f52270,ef2d1c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52200,ef2d1c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bc00,ef2d1c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c78eebd0,ef2d1c28,c6d9ee80,0,c781b8a0,...) at devfs_read_f+0x7e dofileread(ef2d1c28,ffffffff,ffffffff,0,c78eebd0,...) at dofileread+0x9e kern_readv(c781b8a0,0,ef2d1c28,ef2d1c48,1,...) at kern_readv+0x58 read(c781b8a0,ef2d1cec,ef2d1d28,c0e8babe,0,...) at read+0x4f syscallenter(c781b8a0,ef2d1ce4,ef2d1ce4,0,0,...) at syscallenter+0x263 syscall(ef2d1d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2199 tid 100127 td 0xc7986b80 sched_switch(c7986b80,0,104,191,2a400765,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7986b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c7986b80,c7986b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52470,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52470,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52400,c6f52470,ef29ac28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52400,ef29ac28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bd00,ef29ac28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5380,ef29ac28,c6d9ee80,0,c7986b80,...) at devfs_read_f+0x7e dofileread(ef29ac28,ffffffff,ffffffff,0,c74d5380,...) at dofileread+0x9e kern_readv(c7986b80,0,ef29ac28,ef29ac48,1,...) at kern_readv+0x58 read(c7986b80,ef29acec,ef29ad28,c0e8babe,0,...) at read+0x4f syscallenter(c7986b80,ef29ace4,ef29ace4,0,0,...) at syscallenter+0x263 syscall(ef29ad28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2198 tid 100086 td 0xc74bbb80 sched_switch(c74bbb80,0,104,191,2a08cfa4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bbb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c74bbb80,c74bbb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52670,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52670,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52600,c6f52670,ef1adc28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52600,ef1adc28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717be00,ef1adc28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5d90,ef1adc28,c6d9ee80,0,c74bbb80,...) at devfs_read_f+0x7e dofileread(ef1adc28,ffffffff,ffffffff,0,c74d5d90,...) at dofileread+0x9e kern_readv(c74bbb80,0,ef1adc28,ef1adc48,1,...) at kern_readv+0x58 read(c74bbb80,ef1adcec,ef1add28,c0e8babe,0,...) at read+0x4f syscallenter(c74bbb80,ef1adce4,ef1adce4,0,0,...) at syscallenter+0x263 syscall(ef1add28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2197 tid 100097 td 0xc77fb000 sched_switch(c77fb000,0,104,191,2a255bd9,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77fb000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c77fb000,c77fb000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52870,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52870,c1010f70,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52800,c6f52870,ef1edc28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52800,ef1edc28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717c000,ef1edc28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7464428,ef1edc28,c6d9ee80,0,c77fb000,...) at devfs_read_f+0x7e dofileread(ef1edc28,ffffffff,ffffffff,0,c7464428,...) at dofileread+0x9e kern_readv(c77fb000,0,ef1edc28,ef1edc48,1,...) at kern_readv+0x58 read(c77fb000,ef1edcec,ef1edd28,c0e8babe,0,...) at read+0x4f syscallenter(c77fb000,ef1edce4,ef1edce4,0,0,...) at syscallenter+0x263 syscall(ef1edd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command getty pid 2196 tid 100077 td 0xc743eb80 sched_switch(c743eb80,0,104,191,5db570b4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c743eb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c6f52a04,0,c0e84007,c743eb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52a70,0,ef189ad8,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52a70,c6f52a04,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52a00,c6f52a70,ef189c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52a00,ef189c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c6da2800,ef189c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74d5d20,ef189c28,c6d9ee80,0,c743eb80,...) at devfs_read_f+0x7e dofileread(ef189c28,ffffffff,ffffffff,0,c74d5d20,...) at dofileread+0x9e kern_readv(c743eb80,0,ef189c28,ef189c48,1,...) at kern_readv+0x58 read(c743eb80,ef189cec,ef189d28,c0e8babe,0,...) at read+0x4f syscallenter(c743eb80,ef189ce4,ef189ce4,0,0,...) at syscallenter+0x263 syscall(ef189d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28196623, esp = 0xbfbfed8c, ebp = 0xbfbfedb8 --- Tracing command inetd pid 2152 tid 100148 td 0xc781ab80 sched_switch(c781ab80,0,104,191,e3d36d5,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781ab80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c716c510,0,c0e84007,c781ab80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c716c524,0,ef2efa4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c716c524,c716c510,c0e8d785,627,c74c4460,...) at _cv_wait_sig+0x243 seltdwait(c74c4460,58,c6d9ee80,c781ab80,c0e84007,...) at seltdwait+0xa2 kern_select(c781ab80,6,bfbfdfa0,0,0,0,20,c7d97834,c7d97834) at kern_select+0x504 select(c781ab80,ef2efcec,ef2efd28,c0e8babe,0,...) at select+0x66 syscallenter(c781ab80,ef2efce4,ef2efce4,0,0,...) at syscallenter+0x263 syscall(ef2efd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x281a85a3, esp = 0xbfbfdf5c, ebp = 0xbfbfede8 --- Tracing command watchdogd pid 2125 tid 100130 td 0xc79862e0 sched_switch(c79862e0,0,104,191,f9aac10e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c79862e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(ea61,c09e7470,c79862e0,1,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c1012884,6c,c0e86f77,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c1012884,0,16c,c0e86f77,ea61,...) at _sleep+0x328 kern_nanosleep(c79862e0,ef2a6c34,ef2a6c3c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c79862e0,ef2a6cec,ef2a6d28,c0e8babe,0,...) at nanosleep+0x6f syscallenter(c79862e0,ef2a6ce4,ef2a6ce4,0,0,...) at syscallenter+0x263 syscall(ef2a6d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28191b67, esp = 0xbfbfecbc, ebp = 0xbfbfece8 --- Tracing command cron pid 2100 tid 100128 td 0xc79868a0 sched_switch(c79868a0,0,104,191,fd27ce54,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c79868a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(ea61,c09e7470,c79868a0,0,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c1012884,6c,c0e86f77,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c1012884,0,16c,c0e86f77,ea61,...) at _sleep+0x328 kern_nanosleep(c79868a0,ef29ec34,ef29ec3c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c79868a0,ef29ecec,ef29ed28,c0e8babe,0,...) at nanosleep+0x6f syscallenter(c79868a0,ef29ece4,ef29ece4,0,0,...) at syscallenter+0x263 syscall(ef29ed28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28184b67, esp = 0xbfbfec4c, ebp = 0xbfbfec78 --- Tracing command sendmail pid 2092 tid 100082 td 0xc747b000 sched_switch(c747b000,0,104,191,e7c1d98d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,74,...) at mi_switch+0x219 sleepq_switch(c747b000,0,c0e8b180,1a7,74,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7472058,74,c0d20e4e,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7472058,c7472088,174,c0d20e4e,0,...) at _sleep+0x35c kern_sigsuspend(c747b000,0,0,0,0,...) at kern_sigsuspend+0xba sigsuspend(c747b000,ef19dcec,ef19dd28,c0e8babe,0,...) at sigsuspend+0x4d syscallenter(c747b000,ef19dce4,ef19dce4,0,0,...) at syscallenter+0x263 syscall(ef19dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (4, FreeBSD ELF32, write), eip = 0x28338c8b, esp = 0xbfbfcf9c, ebp = 0xbfbfcfc8 --- Tracing command sendmail pid 2088 tid 100120 td 0xc743b5c0 sched_switch(c743b5c0,0,104,191,ca0c039b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c743b5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef263a14,c099890a,c741e190,0,c743b5c0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c741e1a4,0,ef263a4c,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c741e1a4,c741e190,1389,627,c7913310,...) at _cv_timedwait_sig+0x252 seltdwait(ef263bf8,ef263c00,c74d3c00,c743b5c0,ef263af8,...) at seltdwait+0x8a kern_select(c743b5c0,5,bfbfc510,0,0,ef263c40,20,5,0) at kern_select+0x504 select(c743b5c0,ef263cec,ef263d28,c0e8babe,0,...) at select+0x66 syscallenter(c743b5c0,ef263ce4,ef263ce4,0,0,...) at syscallenter+0x263 syscall(ef263d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x283e05a3, esp = 0xbfbfc47c, ebp = 0xbfbfcfa8 --- Tracing command sshd pid 2080 tid 100107 td 0xc77f9000 sched_switch(c77f9000,0,104,191,c293bac2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77f9000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741e1d0,0,c0e84007,c77f9000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741e1e4,0,ef215a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741e1e4,c741e1d0,c0e8d785,627,c7464e38,...) at _cv_wait_sig+0x243 seltdwait(c7464e38,58,c7b11580,c77f9000,f33,...) at seltdwait+0xa2 kern_select(c77f9000,5,2880c0b0,0,0,0,20,c7817578,c7817578) at kern_select+0x504 select(c77f9000,ef215cec,2880d070,1,0,...) at select+0x66 syscallenter(c77f9000,ef215ce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef215d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe25c, ebp = 0xbfbfedf8 --- Tracing command moused pid 2020 tid 100091 td 0xc7473b80 sched_switch(c7473b80,0,104,191,4e3ea7cb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7473b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741e210,0,c0e84007,c7473b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741e224,0,ef1dba4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741e224,c741e210,c0e8d785,627,c74496c8,...) at _cv_wait_sig+0x243 seltdwait(c74496c8,58,c6d9ee80,c7473b80,14,...) at seltdwait+0xa2 kern_select(c7473b80,6,bfbfea04,0,0,0,20,c77f3000,c77f3000) at kern_select+0x504 select(c7473b80,ef1dbcec,ef1dbd28,c0e8babe,0,...) at select+0x66 syscallenter(c7473b80,ef1dbce4,ef1dbce4,0,0,...) at syscallenter+0x263 syscall(ef1dbd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x281b35a3, esp = 0xbfbfe99c, ebp = 0xbfbfeb28 --- Tracing command ntpd pid 1960 tid 100108 td 0xc74bdb80 sched_switch(c74bdb80,0,104,191,d07bb6ac,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bdb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7401250,0,c0e84007,c74bdb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7401264,0,ef21ba4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7401264,c7401250,c0e8d785,627,c744a1f8,...) at _cv_wait_sig+0x243 seltdwait(c744a1f8,58,c6d9ee80,c74bdb80,0,...) at seltdwait+0xa2 kern_select(c74bdb80,1c,bfbfece8,0,0,0,20,c78172bc,c78172bc) at kern_select+0x504 select(c74bdb80,ef21bcec,ef21bd80,ef21bc88,0,...) at select+0x66 syscallenter(c74bdb80,ef21bce4,c0cd2a06,fffffffe,246,...) at syscallenter+0x263 syscall(ef21bd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x283625a3, esp = 0xbfbfecbc, ebp = 0xbfbfed88 --- Tracing command nfsd pid 1842 tid 100125 td 0xc74bb000 sched_switch(c74bb000,0,104,191,18b18afe,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bb000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef293be0,c099890a,c7197e00,0,c74bb000,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c79f9810,0,ef293c18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c79f9810,c7197e00,1388,3b1,0,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef293d14,c097bbc8,c7197e00,ef293d28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7197e00,ef293d28,c0e8036c,390,c74702bc,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7197e00,ef293d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x804c12e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 1842 tid 100124 td 0xc74bb2e0 sched_switch(c74bb2e0,0,104,191,c087494,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bb2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef290be0,c099890a,c7197e00,0,c74bb2e0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c6f7f350,0,ef290c18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c6f7f350,c7197e00,1388,3b1,0,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef290d14,c097bbc8,c7197e00,ef290d28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7197e00,ef290d28,c0e8036c,390,c74702bc,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7197e00,ef290d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x804c12e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 1842 tid 100123 td 0xc74bb5c0 sched_switch(c74bb5c0,0,104,191,fa1dd2c3,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bb5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef28dbe0,c099890a,c7197e00,0,c74bb5c0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c79f9850,0,ef28dc18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c79f9850,c7197e00,1388,3b1,c,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef28dd14,c097bbc8,c7197e00,ef28dd28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7197e00,ef28dd28,c0e8036c,390,c74702bc,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7197e00,ef28dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x804c12e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 1842 tid 100088 td 0xc747a2e0 sched_switch(c747a2e0,0,104,191,44edd8c,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747a2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef1b5ab4,c099890a,c7197e00,0,c747a2e0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c6f7f490,0,ef1b5aec,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c6f7f490,c7197e00,1388,3b1,ef1b5b34,...) at _cv_timedwait_sig+0x252 svc_run_internal(c747a490,14,c0eb3d1a,c79dc60f,ef1b5c10,...) at svc_run_internal+0x356 svc_run(c7197e00,0,c79dca4f,1c2,0,...) at svc_run+0x7b nfssvc_nfsd(bfbfe870,ef1b5c10,c,c6d9ee80,ef1b5c24,...) at nfssvc_nfsd+0xb7 nfssvc_nfsserver(c747a2e0,ef1b5cec,c74702bc,0,ef1b5c7c,...) at nfssvc_nfsserver+0x55 nfssvc(c747a2e0,ef1b5cec,ef1b5d28,c0e8babe,0,...) at nfssvc+0x89 syscallenter(c747a2e0,ef1b5ce4,ef1b5ce4,0,0,...) at syscallenter+0x263 syscall(ef1b5d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (155, FreeBSD ELF32, nfssvc), eip = 0x280dd86b, esp = 0xbfbfe82c, ebp = 0xbfbfea98 --- Tracing command nfsd pid 1841 tid 100078 td 0xc747bb80 sched_switch(c747bb80,0,104,191,4413fd25,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747bb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741e250,0,c0e84007,c747bb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741e264,0,ef18da4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741e264,c741e250,c0e8d785,627,c7449268,...) at _cv_wait_sig+0x243 seltdwait(c7449268,58,c6d9ee80,c747bb80,f33,...) at seltdwait+0xa2 kern_select(c747bb80,5,bfbfecb4,0,0,0,20,c7472af0,c7472af0) at kern_select+0x504 select(c747bb80,ef18dcec,bfbffff4,1,0,...) at select+0x66 syscallenter(c747bb80,ef18dce4,c0cd2d4d,c1010f70,0,...) at syscallenter+0x263 syscall(ef18dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x281845a3, esp = 0xbfbfea9c, ebp = 0xbfbfede8 --- Tracing command mountd pid 1832 tid 100116 td 0xc743e2e0 sched_switch(c743e2e0,0,104,191,6169ec5c,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c743e2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c716c6d0,0,c0e84007,c743e2e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c716c6e4,0,ef243a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c716c6e4,c716c6d0,c0e8d785,627,c7464578,...) at _cv_wait_sig+0x243 seltdwait(c7464578,58,c6d9ee80,c743e2e0,c115b6f0,...) at seltdwait+0xa2 kern_select(c743e2e0,9,bfbfed3c,0,0,0,20,c74392bc,c74392bc) at kern_select+0x504 select(c743e2e0,ef243cec,ef243d28,c0e8babe,0,...) at select+0x66 syscallenter(c743e2e0,ef243ce4,ef243ce4,0,0,...) at syscallenter+0x263 syscall(ef243d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x2819a5a3, esp = 0xbfbfed0c, ebp = 0xbfbfedd8 --- Tracing command rpcbind pid 1733 tid 100089 td 0xc74bb8a0 sched_switch(c74bb8a0,0,104,191,d28c3d29,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74bb8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef1b9a6c,c099890a,c741e290,0,c74bb8a0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c741e2a4,0,ef1b9aa4,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c741e2a4,c741e290,7531,627,ef1b9b5c,...) at _cv_timedwait_sig+0x252 seltdwait(ef1b9c2c,ef1b9c34,535,c74bb8a0,ef1b9b2c,...) at seltdwait+0x8a poll(c74bb8a0,ef1b9cec,ef1b9d28,c0e8babe,0,...) at poll+0x300 syscallenter(c74bb8a0,ef1b9ce4,ef1b9ce4,0,0,...) at syscallenter+0x263 syscall(ef1b9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (209, FreeBSD ELF32, poll), eip = 0x2813f7ab, esp = 0xbfbfcbac, ebp = 0xbfbfed78 --- Tracing command syslogd pid 1708 tid 100093 td 0xc74735c0 sched_switch(c74735c0,0,104,191,5eff45ab,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74735c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741dc90,0,c0e84007,c74735c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741dca4,0,ef1e1a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741dca4,c741dc90,c0e8d785,627,c7449738,...) at _cv_wait_sig+0x243 seltdwait(c7449738,58,c6d9ee80,c74735c0,0,...) at seltdwait+0xa2 kern_select(c74735c0,9,2847f0ac,0,0,0,20,c77f1834,c77f1834) at kern_select+0x504 select(c74735c0,ef1e1cec,ef1e1d28,c0e8babe,0,...) at select+0x66 syscallenter(c74735c0,ef1e1ce4,ef1e1ce4,0,246,...) at syscallenter+0x263 syscall(ef1e1d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x281995a3, esp = 0xbfbfe29c, ebp = 0xbfbfede8 --- Tracing command devd pid 1507 tid 100113 td 0xc781d2e0 sched_switch(c781d2e0,0,104,191,c3a831c2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781d2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c741e390,0,c0e84007,c781d2e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741e3a4,0,ef22da4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c741e3a4,c741e390,c0e8d785,627,c744a700,...) at _cv_wait_sig+0x243 seltdwait(c744a700,58,c6d9ee80,c781d2e0,c0ebd381,...) at seltdwait+0xa2 kern_select(c781d2e0,5,bfbfe960,0,0,0,20,c77f32bc,c77f32bc) at kern_select+0x504 select(c781d2e0,ef22dcec,ef22dd28,c0e8babe,0,...) at select+0x66 syscallenter(c781d2e0,ef22dce4,ef22dce4,0,0,...) at syscallenter+0x263 syscall(ef22dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x808b98b, esp = 0xbfbfe92c, ebp = 0xbfbfee08 --- Tracing command softdepflush pid 18 tid 100075 td 0xc7045b80 sched_switch(c7045b80,0,104,191,176284f0,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7045b80,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e07db1e0,60,c0e93014,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e07db1e0,80900,c118ef28,0,0,...) at __lockmgr_args+0xb1f getdirtybuf(c118ef28,4,c0eb851c,1ac2,0,...) at getdirtybuf+0xc3 freework_freeblock(c118ef28,0,c0eb851c,1c7a,c0eb8525,...) at freework_freeblock+0x59 indir_trunc(fffff7f3,ffffffff,c0eb851c,1b10,c8990280,...) at indir_trunc+0x611 handle_workitem_indirblk(c118ef28,0,c0eb851c,1b5d,8,...) at handle_workitem_indirblk+0x9e handle_workitem_freeblocks(0,ecf96c78,2,65e,200,...) at handle_workitem_freeblocks+0x1c5 process_worklist_item(c118ef28,0,c0eb851c,5a8,c7045b80,...) at process_worklist_item+0x225 softdep_process_worklist(c7755b50,0,c0eb851c,538,3e8,...) at softdep_process_worklist+0x83 softdep_flush(0,ecf96d28,c0e8036c,390,c73a42bc,...) at softdep_flush+0x2a0 fork_exit(c0bd8560,0,ecf96d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf96d60, ebp = 0 --- Tracing command syncer pid 17 tid 100074 td 0xc7170000 sched_switch(c7170000,0,104,191,c02b9bb9,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7170000,0,c0e8b180,28b,c7170000,...) at sleepq_switch+0x162 sleepq_timedwait(c1188a14,0,ecf93c78,1,0,...) at sleepq_timedwait+0x6b _cv_timedwait(c1188a14,c1188a00,3e8,76a,4e20,...) at _cv_timedwait+0x252 sched_sync(0,ecf93d28,c0e8036c,390,c73a4578,...) at sched_sync+0x595 fork_exit(c0a42990,0,ecf93d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf93d60, ebp = 0 --- Tracing command vnlru pid 16 tid 100073 td 0xc71702e0 sched_switch(c71702e0,0,104,191,7bb7dcdb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c71702e0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c73a4834,60,c0e95e04,0,0,...) at sleepq_timedwait+0x6b _sleep(c73a4834,c11889d4,260,c0e95e04,3e8,...) at _sleep+0x342 vnlru_proc(0,ecf90d28,c0e8036c,390,c73a4834,...) at vnlru_proc+0xe7 fork_exit(c0a44a00,0,ecf90d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf90d60, ebp = 0 --- Tracing command bufdaemon pid 9 tid 100072 td 0xc71705c0 cpustop_handler(1,ecf8dbc8,c0cd2606,ee,0,...) at cpustop_handler+0x34 ipi_nmi_handler(ee,0,17ef57e,c09a7fd0,c73a4af0,...) at ipi_nmi_handler+0x2f trap(ecf8dbd4) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc09a7fd5, esp = 0xecf8dc14, ebp = 0xecf8dc38 --- panic(c0e76de9,e077fca0,c0e924eb,91e,0,...) at panic+0x35 flushbufqueues(d0,c0e84007,c73a4b78,391,391,...) at flushbufqueues+0x2d7 buf_do_flush(c73a4af0,0,c0e924eb,8ac,64,...) at buf_do_flush+0x94 buf_daemon(0,ecf8dd28,c0e8036c,390,c73a4af0,...) at buf_daemon+0xea fork_exit(c0a2a100,0,ecf8dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf8dd60, ebp = 0 --- Tracing command pagezero pid 8 tid 100071 td 0xc71708a0 sched_switch(c71708a0,0,104,191,eaa74cc5,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c71708a0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c1190ddc,0,c0ec0e48,0,0,...) at sleepq_timedwait+0x6b _sleep(c1190ddc,c118f880,0,c0ec0e48,493e0,...) at _sleep+0x342 vm_pagezero(0,ecf8ad28,c0e8036c,390,c73a6000,...) at vm_pagezero+0xdc fork_exit(c0c1ad00,0,ecf8ad28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf8ad60, ebp = 0 --- Tracing command vmdaemon pid 7 tid 100070 td 0xc7170b80 sched_switch(c7170b80,0,104,191,1f0ab411,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,74,...) at mi_switch+0x219 sleepq_switch(c7170b80,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c11909c8,74,c0e92e32,0,0,...) at sleepq_wait+0x63 _sleep(c11909c8,c11909cc,74,c0e92e32,0,...) at _sleep+0x372 vm_daemon(0,ecf87d28,c0e8036c,390,c6dbe2bc,...) at vm_daemon+0x59 fork_exit(c0c148c0,0,ecf87d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf87d60, ebp = 0 --- Tracing command pagedaemon pid 6 tid 100069 td 0xc7171000 sched_switch(c7171000,0,104,191,c2d9ee0c,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,54,...) at mi_switch+0x219 sleepq_switch(c7171000,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c1190990,54,c0e92e32,0,0,...) at sleepq_timedwait+0x6b _sleep(c1190990,c118f880,54,c0e92e32,1388,...) at _sleep+0x342 vm_pageout(0,ecf84d28,c0e8036c,390,c6dbe578,...) at vm_pageout+0x2c7 fork_exit(c0c158e0,0,ecf84d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf84d60, ebp = 0 --- Tracing command xpt_thrd pid 5 tid 100068 td 0xc71712e0 sched_switch(c71712e0,0,104,191,1aea1a86,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c71712e0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c0fd7754,5c,c0cf9c72,0,0,...) at sleepq_wait+0x63 _sleep(c0fd7754,c0fd7798,5c,c0cf9c72,0,...) at _sleep+0x372 xpt_scanner_thread(0,ecf81d28,c0e8036c,390,c6dbe834,...) at xpt_scanner_thread+0x47 fork_exit(c048bb70,0,ecf81d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf81d60, ebp = 0 --- Tracing command sctp_iterator pid 4 tid 100067 td 0xc71715c0 sched_switch(c71715c0,0,104,191,65e17532,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c71715c0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c118a4d8,0,c0ea8ddf,0,0,...) at sleepq_wait+0x63 _sleep(c118a4d8,c118a4a0,0,c0ea8ddf,0,...) at _sleep+0x372 sctp_iterator_thread(0,ecf7ed28,c0e8036c,390,c6dbeaf0,...) at sctp_iterator_thread+0x5c fork_exit(c0ad3ae0,0,ecf7ed28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf7ed60, ebp = 0 --- Tracing command fdc0 pid 3 tid 100063 td 0xc70362e0 sched_switch(c70362e0,0,104,191,7b9c28f4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c70362e0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c6fe143c,5c,c0e78e92,0,0,...) at sleepq_timedwait+0x6b _sleep(c6fe143c,c6fe14f0,5c,c0e78e92,3e8,...) at _sleep+0x342 fdc_thread(c6fe1400,ecf72d28,c0e8036c,390,c701e000,...) at fdc_thread+0x27d fork_exit(c0c99e70,c6fe1400,ecf72d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf72d60, ebp = 0 --- Tracing command fw0_probe pid 2 tid 100061 td 0xc70368a0 sched_switch(c70368a0,0,104,191,1b0d2ba0,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c70368a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c706b000,6c,c0e78e92,100,0,...) at sleepq_wait_sig+0x17 _sleep(c706b000,c706f488,16c,c0e78e92,0,...) at _sleep+0x35c fw_bus_probe_thread(c706b000,ecf62d28,c0e8036c,390,c701e2bc,...) at fw_bus_probe_thread+0xa08 fork_exit(c06aaa90,c706b000,ecf62d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf62d60, ebp = 0 --- Tracing command usb pid 15 tid 100057 td 0xc70435c0 sched_switch(c70435c0,0,104,191,84640f1,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70435c0,0,c0e8b180,268,c70435c0,...) at sleepq_switch+0x162 sleepq_wait(c704bd34,0,ecf4fcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c704bd34,c704bdd4,c0e5753e,6b,c704bd3c,...) at _cv_wait+0x243 usb_process(c704bd2c,ecf4fd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c704bd2c,ecf4fd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf4fd60, ebp = 0 --- Tracing command usb pid 15 tid 100056 td 0xc70438a0 sched_switch(c70438a0,0,104,191,9f741111,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70438a0,0,c0e8b180,268,c70438a0,...) at sleepq_switch+0x162 sleepq_wait(c704bd04,0,ecf4ccac,1,0,...) at sleepq_wait+0x63 _cv_wait(c704bd04,c704bdd4,c0e5753e,6b,c704bd0c,...) at _cv_wait+0x243 usb_process(c704bcfc,ecf4cd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c704bcfc,ecf4cd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf4cd60, ebp = 0 --- Tracing command usb pid 15 tid 100055 td 0xc7043b80 sched_switch(c7043b80,0,104,191,7dcb0f3,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7043b80,0,c0e8b180,268,c7043b80,...) at sleepq_switch+0x162 sleepq_wait(c704bcd4,0,ecf49cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c704bcd4,c704bdd4,c0e5753e,6b,c704bcdc,...) at _cv_wait+0x243 usb_process(c704bccc,ecf49d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c704bccc,ecf49d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf49d60, ebp = 0 --- Tracing command usb pid 15 tid 100054 td 0xc7045000 sched_switch(c7045000,0,104,191,7dc9e8a,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7045000,0,c0e8b180,268,c7045000,...) at sleepq_switch+0x162 sleepq_wait(c704bca4,0,ecf46cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c704bca4,c704bdd4,c0e5753e,6b,c704bcac,...) at _cv_wait+0x243 usb_process(c704bc9c,ecf46d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c704bc9c,ecf46d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf46d60, ebp = 0 --- Tracing command usb pid 15 tid 100052 td 0xc70455c0 sched_switch(c70455c0,0,104,191,7dc89ba,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70455c0,0,c0e8b180,268,c70455c0,...) at sleepq_switch+0x162 sleepq_wait(c7040b5c,0,ecf3dcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7040b5c,c7040bfc,c0e5753e,6b,c7040b64,...) at _cv_wait+0x243 usb_process(c7040b54,ecf3dd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7040b54,ecf3dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf3dd60, ebp = 0 --- Tracing command usb pid 15 tid 100051 td 0xc7034000 sched_switch(c7034000,0,104,191,96f9d9bc,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7034000,0,c0e8b180,268,c7034000,...) at sleepq_switch+0x162 sleepq_wait(c7040b2c,0,ecf3acac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7040b2c,c7040bfc,c0e5753e,6b,c7040b34,...) at _cv_wait+0x243 usb_process(c7040b24,ecf3ad28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7040b24,ecf3ad28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf3ad60, ebp = 0 --- Tracing command usb pid 15 tid 100050 td 0xc70342e0 sched_switch(c70342e0,0,104,191,7754109,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70342e0,0,c0e8b180,268,c70342e0,...) at sleepq_switch+0x162 sleepq_wait(c7040afc,0,ecf37cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7040afc,c7040bfc,c0e5753e,6b,c7040b04,...) at _cv_wait+0x243 usb_process(c7040af4,ecf37d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7040af4,ecf37d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf37d60, ebp = 0 --- Tracing command usb pid 15 tid 100049 td 0xc70345c0 sched_switch(c70345c0,0,104,191,7753060,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70345c0,0,c0e8b180,268,c70345c0,...) at sleepq_switch+0x162 sleepq_wait(c7040acc,0,ecf34cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7040acc,c7040bfc,c0e5753e,6b,c7040ad4,...) at _cv_wait+0x243 usb_process(c7040ac4,ecf34d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7040ac4,ecf34d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf34d60, ebp = 0 --- Tracing command usb pid 15 tid 100048 td 0xc70348a0 sched_switch(c70348a0,0,104,191,7751844,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70348a0,0,c0e8b180,268,c70348a0,...) at sleepq_switch+0x162 sleepq_wait(c7039b5c,0,e0bffcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7039b5c,c7039bfc,c0e5753e,6b,c7039b64,...) at _cv_wait+0x243 usb_process(c7039b54,e0bffd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7039b54,e0bffd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bffd60, ebp = 0 --- Tracing command usb pid 15 tid 100047 td 0xc7034b80 sched_switch(c7034b80,0,104,191,9353e1d2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7034b80,0,c0e8b180,268,c7034b80,...) at sleepq_switch+0x162 sleepq_wait(c7039b2c,0,e0bfccac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7039b2c,c7039bfc,c0e5753e,6b,c7039b34,...) at _cv_wait+0x243 usb_process(c7039b24,e0bfcd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7039b24,e0bfcd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bfcd60, ebp = 0 --- Tracing command usb pid 15 tid 100046 td 0xc7035000 sched_switch(c7035000,0,104,191,17e9d11,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7035000,0,c0e8b180,268,c7035000,...) at sleepq_switch+0x162 sleepq_wait(c7039afc,0,e0bf9cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7039afc,c7039bfc,c0e5753e,6b,c7039b04,...) at _cv_wait+0x243 usb_process(c7039af4,e0bf9d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7039af4,e0bf9d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bf9d60, ebp = 0 --- Tracing command usb pid 15 tid 100045 td 0xc70352e0 sched_switch(c70352e0,0,104,191,17e8c20,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70352e0,0,c0e8b180,268,c70352e0,...) at sleepq_switch+0x162 sleepq_wait(c7039acc,0,e0bf6cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7039acc,c7039bfc,c0e5753e,6b,c7039ad4,...) at _cv_wait+0x243 usb_process(c7039ac4,e0bf6d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7039ac4,e0bf6d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bf6d60, ebp = 0 --- Tracing command usb pid 15 tid 100044 td 0xc70355c0 sched_switch(c70355c0,0,104,191,17e77b1,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70355c0,0,c0e8b180,268,c70355c0,...) at sleepq_switch+0x162 sleepq_wait(c702fb5c,0,e0bf2cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c702fb5c,c702fbfc,c0e5753e,6b,c702fb64,...) at _cv_wait+0x243 usb_process(c702fb54,e0bf2d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c702fb54,e0bf2d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bf2d60, ebp = 0 --- Tracing command usb pid 15 tid 100043 td 0xc70358a0 sched_switch(c70358a0,0,104,191,9293d034,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70358a0,0,c0e8b180,268,c70358a0,...) at sleepq_switch+0x162 sleepq_wait(c702fb2c,0,e0befcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c702fb2c,c702fbfc,c0e5753e,6b,c702fb34,...) at _cv_wait+0x243 usb_process(c702fb24,e0befd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c702fb24,e0befd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0befd60, ebp = 0 --- Tracing command usb pid 15 tid 100042 td 0xc7035b80 sched_switch(c7035b80,0,104,191,117e615,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7035b80,0,c0e8b180,268,c7035b80,...) at sleepq_switch+0x162 sleepq_wait(c702fafc,0,e0beccac,1,0,...) at sleepq_wait+0x63 _cv_wait(c702fafc,c702fbfc,c0e5753e,6b,c702fb04,...) at _cv_wait+0x243 usb_process(c702faf4,e0becd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c702faf4,e0becd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0becd60, ebp = 0 --- Tracing command usb pid 15 tid 100041 td 0xc7036000 sched_switch(c7036000,0,104,191,117d2ee,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7036000,0,c0e8b180,268,c7036000,...) at sleepq_switch+0x162 sleepq_wait(c702facc,0,e0be9cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c702facc,c702fbfc,c0e5753e,6b,c702fad4,...) at _cv_wait+0x243 usb_process(c702fac4,e0be9d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c702fac4,e0be9d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0be9d60, ebp = 0 --- Tracing command usb pid 15 tid 100039 td 0xc701f2e0 sched_switch(c701f2e0,0,104,191,117bebc,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c701f2e0,0,c0e8b180,268,c701f2e0,...) at sleepq_switch+0x162 sleepq_wait(c7029b5c,0,e0be2cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7029b5c,c7029bfc,c0e5753e,6b,c7029b64,...) at _cv_wait+0x243 usb_process(c7029b54,e0be2d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7029b54,e0be2d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0be2d60, ebp = 0 --- Tracing command usb pid 15 tid 100038 td 0xc701f5c0 sched_switch(c701f5c0,0,104,191,90f78456,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c701f5c0,0,c0e8b180,268,c701f5c0,...) at sleepq_switch+0x162 sleepq_wait(c7029b2c,0,e0bdfcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7029b2c,c7029bfc,c0e5753e,6b,c7029b34,...) at _cv_wait+0x243 usb_process(c7029b24,e0bdfd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7029b24,e0bdfd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bdfd60, ebp = 0 --- Tracing command usb pid 15 tid 100037 td 0xc701f8a0 sched_switch(c701f8a0,0,104,191,b121ea,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c701f8a0,0,c0e8b180,268,c701f8a0,...) at sleepq_switch+0x162 sleepq_wait(c7029afc,0,e0bdccac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7029afc,c7029bfc,c0e5753e,6b,c7029b04,...) at _cv_wait+0x243 usb_process(c7029af4,e0bdcd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7029af4,e0bdcd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bdcd60, ebp = 0 --- Tracing command usb pid 15 tid 100036 td 0xc701fb80 sched_switch(c701fb80,0,104,191,b10ecc,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c701fb80,0,c0e8b180,268,c701fb80,...) at sleepq_switch+0x162 sleepq_wait(c7029acc,0,e0bd9cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7029acc,c7029bfc,c0e5753e,6b,c7029ad4,...) at _cv_wait+0x243 usb_process(c7029ac4,e0bd9d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7029ac4,e0bd9d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bd9d60, ebp = 0 --- Tracing command usb pid 15 tid 100034 td 0xc70222e0 sched_switch(c70222e0,0,104,191,b0fa46,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70222e0,0,c0e8b180,268,c70222e0,...) at sleepq_switch+0x162 sleepq_wait(c7019b5c,0,e0bd2cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7019b5c,c7019bfc,c0e5753e,6b,c7019b64,...) at _cv_wait+0x243 usb_process(c7019b54,e0bd2d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7019b54,e0bd2d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bd2d60, ebp = 0 --- Tracing command usb pid 15 tid 100033 td 0xc70225c0 sched_switch(c70225c0,0,104,191,8eedd4a4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70225c0,0,c0e8b180,268,c70225c0,...) at sleepq_switch+0x162 sleepq_wait(c7019b2c,0,e0bcfcac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7019b2c,c7019bfc,c0e5753e,6b,c7019b34,...) at _cv_wait+0x243 usb_process(c7019b24,e0bcfd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7019b24,e0bcfd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bcfd60, ebp = 0 --- Tracing command usb pid 15 tid 100032 td 0xc70228a0 sched_switch(c70228a0,0,104,191,49d8d5,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70228a0,0,c0e8b180,268,c70228a0,...) at sleepq_switch+0x162 sleepq_wait(c7019afc,0,e0bcccac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7019afc,c7019bfc,c0e5753e,6b,c7019b04,...) at _cv_wait+0x243 usb_process(c7019af4,e0bccd28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7019af4,e0bccd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bccd60, ebp = 0 --- Tracing command usb pid 15 tid 100031 td 0xc7022b80 sched_switch(c7022b80,0,104,191,49c34b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7022b80,0,c0e8b180,268,c7022b80,...) at sleepq_switch+0x162 sleepq_wait(c7019acc,0,e0bc9cac,1,0,...) at sleepq_wait+0x63 _cv_wait(c7019acc,c7019bfc,c0e5753e,6b,c7019ad4,...) at _cv_wait+0x243 usb_process(c7019ac4,e0bc9d28,c0e8036c,390,c701e578,...) at usb_process+0x193 fork_exit(c0850390,c7019ac4,e0bc9d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bc9d60, ebp = 0 --- Tracing command yarrow pid 14 tid 100017 td 0xc6ecb5c0 sched_switch(c6ecb5c0,0,104,191,d6ea45ef,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6ecb5c0,0,c0e8b180,28b,2,...) at sleepq_switch+0x162 sleepq_timedwait(c1011684,0,c0e78e92,2,0,...) at sleepq_timedwait+0x6b _sleep(c1011684,0,0,c0e78e92,64,...) at _sleep+0x342 pause(c0e78e92,64,c0e45f4e,111,0,...) at pause+0x47 random_kthread(0,c6b55d28,c0e8036c,390,c6dbd000,...) at random_kthread+0x1ef fork_exit(c07bb4a0,0,c6b55d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b55d60, ebp = 0 --- Tracing command geom pid 13 tid 100015 td 0xc6ecbb80 sched_switch(c6ecbb80,0,104,191,d7237450,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c6ecbb80,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c100f2c8,5c,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c100f2c8,c100f228,25c,c0e78e92,0,...) at _sleep+0x372 g_io_schedule_down(c6ecbb80,0,c0e7a9e5,6c,c6b4fd14,...) at g_io_schedule_down+0x5b g_down_procbody(0,c6b4fd28,c0e8036c,390,c6dbd2bc,...) at g_down_procbody+0x9d fork_exit(c093e770,0,c6b4fd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b4fd60, ebp = 0 --- Tracing command geom pid 13 tid 100014 td 0xc6ecc000 cpustop_handler(8,c6b4caf4,c0cd2606,ee,0,...) at cpustop_handler+0x34 ipi_nmi_handler(ee,0,1820ba6,c0998ac9,c6dbd2bc,...) at ipi_nmi_handler+0x2f trap(c6b4cb00) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0998ae6, esp = 0xc6b4cb40, ebp = 0xc6b4cb5c --- _mtx_lock_sleep(c11886f4,c6ecc000,0,c0e924eb,615,...) at _mtx_lock_sleep+0xb6 _mtx_lock_flags(c11886f4,0,c0e924eb,615,4,...) at _mtx_lock_flags+0xf7 bqrelse(e0761520,0,c0e924eb,d58,c102dfd4,...) at bqrelse+0x1cc bufdone_finish(e0761520,e06e8de0,e077fca0,0,c6b4cc50,...) at bufdone_finish+0x3b4 bufdone(e0761520,20,e06e8de0,c77ffbd8,c751fe40,...) at bufdone+0x6a cluster_callback(e06e8de0,c159e000,e06e8de0,c751fe40,c6b4cc80,...) at cluster_callback+0x89 bufdone(e06e8de0,c6d75934) at bufdone+0x53 g_vfs_done(c751fe40,0,c0e924eb,c56,c6ecc000,...) at g_vfs_done+0x85 biodone(c751fe40,c100f248,25c,c0e78e92,0,...) at biodone+0xa5 g_io_schedule_up(c6ecc000,0,c0e7a9e5,5f,c6b4cd14,...) at g_io_schedule_up+0xde g_up_procbody(0,c6b4cd28,c0e8036c,390,c6dbd2bc,...) at g_up_procbody+0x9d fork_exit(c093e810,0,c6b4cd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b4cd60, ebp = 0 --- Tracing command geom pid 13 tid 100013 td 0xc6dc02e0 sched_switch(c6dc02e0,0,104,191,60965380,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c6dc02e0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c100f2bc,5c,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c100f2bc,c100f1ec,25c,c0e78e92,0,...) at _sleep+0x372 g_run_events(c101f500,0,c0e7a9e5,79,c6b49d14,...) at g_run_events+0x526 g_event_procbody(0,c6b49d28,c0e8036c,390,c6dbd2bc,...) at g_event_procbody+0x90 fork_exit(c093e8b0,0,c6b49d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b49d60, ebp = 0 --- Tracing command intr pid 12 tid 100065 td 0xc7171b80 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100064 td 0xc7172000 sched_switch(c7172000,0,109,191,461721,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c7172000,...) at mi_switch+0x219 ithread_loop(c7162ae0,ecf75d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c7162ae0,ecf75d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf75d60, ebp = 0 --- Tracing command intr pid 12 tid 100062 td 0xc70365c0 sched_switch(c70365c0,0,109,191,5db52f49,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c70365c0,...) at mi_switch+0x219 ithread_loop(c7162b70,ecf65d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c7162b70,ecf65d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf65d60, ebp = 0 --- Tracing command intr pid 12 tid 100059 td 0xc7043000 sched_switch(c7043000,0,109,191,45b10d,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c7043000,...) at mi_switch+0x219 ithread_loop(c701db60,ecf59d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c701db60,ecf59d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf59d60, ebp = 0 --- Tracing command intr pid 12 tid 100058 td 0xc70432e0 sched_switch(c70432e0,0,109,191,1bdee4ba,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c70432e0,...) at mi_switch+0x219 ithread_loop(c701d210,ecf55d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c701d210,ecf55d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf55d60, ebp = 0 --- Tracing command intr pid 12 tid 100053 td 0xc70452e0 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100040 td 0xc701f000 sched_switch(c701f000,0,109,191,258bc22a,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c701f000,...) at mi_switch+0x219 ithread_loop(c70028a0,e0be6d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c70028a0,e0be6d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0be6d60, ebp = 0 --- Tracing command intr pid 12 tid 100035 td 0xc7022000 sched_switch(c7022000,0,109,191,1ff79d17,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c7022000,...) at mi_switch+0x219 ithread_loop(c7002ab0,e0bd6d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c7002ab0,e0bd6d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bd6d60, ebp = 0 --- Tracing command intr pid 12 tid 100030 td 0xc6ecc2e0 sched_switch(c6ecc2e0,0,109,191,1e098844,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6ecc2e0,...) at mi_switch+0x219 ithread_loop(c701d080,e0bc6d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c701d080,e0bc6d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0bc6d60, ebp = 0 --- Tracing command intr pid 12 tid 100029 td 0xc6ecc5c0 sched_switch(c6ecc5c0,0,109,191,54ed5783,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6ecc5c0,...) at mi_switch+0x219 ithread_loop(c7002340,e0a70d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c7002340,e0a70d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0a70d60, ebp = 0 --- Tracing command intr pid 12 tid 100028 td 0xc6ecc8a0 sched_switch(c6ecc8a0,0,109,191,5f9f6ba5,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6ecc8a0,...) at mi_switch+0x219 ithread_loop(c70024e0,e0a6cd28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c70024e0,e0a6cd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe0a6cd60, ebp = 0 --- Tracing command intr pid 12 tid 100027 td 0xc6eccb80 sched_switch(c6eccb80,0,109,191,54ee005e,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6eccb80,...) at mi_switch+0x219 ithread_loop(c6d83380,c6b73d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d83380,c6b73d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b73d60, ebp = 0 --- Tracing command intr pid 12 tid 100021 td 0xc6e068a0 sched_switch(c6e068a0,0,109,191,3cad7100,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6e068a0,...) at mi_switch+0x219 ithread_loop(c6d83430,c6b61d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d83430,c6b61d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b61d60, ebp = 0 --- Tracing command intr pid 12 tid 100020 td 0xc6e06b80 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100018 td 0xc6ecb2e0 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100012 td 0xc6dc05c0 sched_switch(c6dc05c0,0,109,191,53e96079,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6dc05c0,...) at mi_switch+0x219 ithread_loop(c6d836d0,c6b46d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d836d0,c6b46d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b46d60, ebp = 0 --- Tracing command intr pid 12 tid 100011 td 0xc6dc08a0 sched_switch(c6dc08a0,0,109,191,d6ea112a,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6dc08a0,...) at mi_switch+0x219 ithread_loop(c6d836e0,c6b43d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d836e0,c6b43d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b43d60, ebp = 0 --- Tracing command intr pid 12 tid 100010 td 0xc6dc0b80 sched_switch(c6dc0b80,0,109,191,cbf88506,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6dc0b80,...) at mi_switch+0x219 ithread_loop(c6d836f0,c6b40d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d836f0,c6b40d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b40d60, ebp = 0 --- Tracing command intr pid 12 tid 100009 td 0xc6e06000 sched_switch(c6e06000,0,109,191,dadf7516,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6e06000,...) at mi_switch+0x219 ithread_loop(c6d83700,c6b3dd28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d83700,c6b3dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b3dd60, ebp = 0 --- Tracing command intr pid 12 tid 100008 td 0xc6e062e0 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100007 td 0xc6e065c0 sched_switch(c6e065c0,0,109,191,14f852ed,...) at sched_switch+0x3bc mi_switch(109,0,c0e80691,554,c6e065c0,...) at mi_switch+0x219 ithread_loop(c6d83720,c6b37d28,c0e8036c,390,c6dbd578,...) at ithread_loop+0x1fb fork_exit(c097f750,c6d83720,c6b37d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b37d60, ebp = 0 --- Tracing command idle pid 11 tid 100006 td 0xc6dbf000 sched_switch(c6dbf000,0,608,18c,d6847bc9,...) at sched_switch+0x3bc mi_switch(608,0,c0e8627f,cd,0,...) at mi_switch+0x219 critical_exit(0,ffffffff,c101f500,2,c6b33ce8,...) at critical_exit+0xa8 cpu_idle(0,c6b33cc4,c0e87a4b,a05,c6dbf000,...) at cpu_idle+0x9e sched_idletd(0,c6b33d28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x263 fork_exit(c09ce540,0,c6b33d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b33d60, ebp = 0 --- Tracing command idle pid 11 tid 100005 td 0xc6dbf2e0 cpustop_handler(2,c6b30c04,c0cd2606,ee,0,...) at cpustop_handler+0x34 ipi_nmi_handler(ee,0,0,c11b3b4c,c6dbd834,...) at ipi_nmi_handler+0x2f trap(c6b30c10) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0cb7315, esp = 0xc6b30c50, ebp = 0xc6b30c50 --- acpi_cpu_c1(c6b30c6c,c0fd79d0,1,2f4,fb0,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(0,c6b30ca0,c0cc5530,0,ffffffff,...) at acpi_cpu_idle+0x122 cpu_idle_acpi(0,ffffffff,c101fb80,2,c6b30ce8,...) at cpu_idle_acpi+0x2f cpu_idle(0,c6b30cc4,c0e87a4b,3bb,c6dbf2e0,...) at cpu_idle+0x90 sched_idletd(0,c6b30d28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x263 fork_exit(c09ce540,0,c6b30d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b30d60, ebp = 0 --- Tracing command idle pid 11 tid 100004 td 0xc6dbf5c0 sched_switch(c6dbf5c0,0,608,18c,d7212715,...) at sched_switch+0x3bc mi_switch(608,0,c0e8627f,cd,0,...) at mi_switch+0x219 critical_exit(0,ffffffff,c1020200,2,c6b2dce8,...) at critical_exit+0xa8 cpu_idle(0,c6b2dcc4,c0e87a4b,3bb,c6dbf5c0,...) at cpu_idle+0x9e sched_idletd(0,c6b2dd28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x263 fork_exit(c09ce540,0,c6b2dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b2dd60, ebp = 0 --- Tracing command idle pid 11 tid 100003 td 0xc6dbf8a0 sched_switch(c6dbf8a0,0,608,18c,d7274bc0,...) at sched_switch+0x3bc mi_switch(608,0,c0e8627f,cd,0,...) at mi_switch+0x219 critical_exit(0,ffffffff,c1020880,2,c6b2ace8,...) at critical_exit+0xa8 cpu_idle(0,c6b2acc4,c0e87a4b,a05,c6dbf8a0,...) at cpu_idle+0x9e sched_idletd(0,c6b2ad28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x263 fork_exit(c09ce540,0,c6b2ad28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b2ad60, ebp = 0 --- Tracing command init pid 1 tid 100002 td 0xc6dbfb80 sched_switch(c6dbfb80,0,104,191,848b8596,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c6dbfb80,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6dbdaf0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c6dbdaf0,c6dbdb78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c6dbfb80,ffffffff,c6b26c44,0,0,...) at kern_wait+0xbe6 wait4(c6dbfb80,c6b26cec,c6b26d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c6dbfb80,c6b26ce4,c6b26ce4,0,0,...) at syscallenter+0x263 syscall(c6b26d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x8060de7, esp = 0xbfbfe8bc, ebp = 0xbfbfe8d8 --- Tracing command audit pid 10 tid 100001 td 0xc6dc0000 sched_switch(c6dc0000,0,104,191,47a7c2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6dc0000,0,c0e8b180,268,c6dc0000,...) at sleepq_switch+0x162 sleepq_wait(c118e700,0,c6b23c8c,1,0,...) at sleepq_wait+0x63 _cv_wait(c118e700,c118e6e4,c0eb5797,194,0,...) at _cv_wait+0x243 audit_worker(0,c6b23d28,c0e8036c,390,c6dbe000,...) at audit_worker+0x84 fork_exit(c0b9aeb0,0,c6b23d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b23d60, ebp = 0 --- Tracing command kernel pid 0 tid 100076 td 0xc70458a0 sched_switch(c70458a0,0,104,191,e441e093,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c70458a0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c71853c0,0,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c71853c0,c71853d8,0,c0e78e92,0,...) at _sleep+0x372 taskqueue_thread_loop(c11e61a0,ef185d28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c11e61a0,ef185d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xef185d60, ebp = 0 --- Tracing command kernel pid 0 tid 100066 td 0xc71718a0 sched_switch(c71718a0,0,104,191,5b37a1af,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c71718a0,0,c0e8b180,28b,2,...) at sleepq_switch+0x162 sleepq_timedwait(c1011684,0,c0e78e92,2,0,...) at sleepq_timedwait+0x6b _sleep(c1011684,0,0,c0e78e92,bb8,...) at _sleep+0x342 pause(c0e78e92,bb8,124,122,c100f428,...) at pause+0x47 deadlkres(0,ecf7bd28,c0e8036c,390,c100f3a0,...) at deadlkres+0x324 fork_exit(c095ffe0,0,ecf7bd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf7bd60, ebp = 0 --- Tracing command kernel pid 0 tid 100060 td 0xc7036b80 sched_switch(c7036b80,0,104,191,d2bbb546,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7036b80,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c7073900,0,c0e867a1,c0e78e92,0,...) at sleepq_wait+0x63 msleep_spin(c7073900,c7073918,c0e78e92,0,c0e84007,...) at msleep_spin+0x21d taskqueue_thread_loop(c706f49c,ecf5fd28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c706f49c,ecf5fd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf5fd60, ebp = 0 --- Tracing command kernel pid 0 tid 100026 td 0xc6fab000 sched_switch(c6fab000,0,104,191,1af15165,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6fab000,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92340,0,c0e867a1,c0e78e92,0,...) at sleepq_wait+0x63 msleep_spin(c6d92340,c6d92358,c0e78e92,0,c0e84007,...) at msleep_spin+0x21d taskqueue_thread_loop(c0fda638,c6b70d28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda638,c6b70d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b70d60, ebp = 0 --- Tracing command kernel pid 0 tid 100025 td 0xc6fab2e0 sched_switch(c6fab2e0,0,104,191,1af144bb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6fab2e0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92340,0,c0e867a1,c0e78e92,0,...) at sleepq_wait+0x63 msleep_spin(c6d92340,c6d92358,c0e78e92,0,c0e84007,...) at msleep_spin+0x21d taskqueue_thread_loop(c0fda638,c6b6dd28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda638,c6b6dd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b6dd60, ebp = 0 --- Tracing command kernel pid 0 tid 100024 td 0xc6fab5c0 sched_switch(c6fab5c0,0,104,191,1af0ed4f,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6fab5c0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92340,0,c0e867a1,c0e78e92,0,...) at sleepq_wait+0x63 msleep_spin(c6d92340,c6d92358,c0e78e92,0,c0e84007,...) at msleep_spin+0x21d taskqueue_thread_loop(c0fda638,c6b6ad28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda638,c6b6ad28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b6ad60, ebp = 0 --- Tracing command kernel pid 0 tid 100023 td 0xc6fab8a0 sched_switch(c6fab8a0,0,104,191,1aea9fbc,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6fab8a0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92380,0,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c6d92380,c6d92398,0,c0e78e92,0,...) at _sleep+0x372 taskqueue_thread_loop(c100fd18,c6b67d28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c100fd18,c6b67d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b67d60, ebp = 0 --- Tracing command kernel pid 0 tid 100022 td 0xc6fabb80 sched_switch(c6fabb80,0,104,191,1aea8ef7,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6fabb80,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d923c0,0,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c6d923c0,c6d923d8,0,c0e78e92,0,...) at _sleep+0x372 taskqueue_thread_loop(c118ece4,c6b64d28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c118ece4,c6b64d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b64d60, ebp = 0 --- Tracing command kernel pid 0 tid 100019 td 0xc6ecb000 sched_switch(c6ecb000,0,104,191,1d8ebc41,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6ecb000,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92500,0,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c6d92500,c6d92518,0,c0e78e92,0,...) at _sleep+0x372 taskqueue_thread_loop(c102e228,c6b5bd28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c102e228,c6b5bd28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b5bd60, ebp = 0 --- Tracing command kernel pid 0 tid 100016 td 0xc6ecb8a0 sched_switch(c6ecb8a0,0,104,191,41fc6f81,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c6ecb8a0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(c6d92a80,0,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c6d92a80,c6d92a98,0,c0e78e92,0,...) at _sleep+0x372 taskqueue_thread_loop(c102cca0,c6b52d28,c0e8036c,390,c100f3a0,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c102cca0,c6b52d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc6b52d60, ebp = 0 --- Tracing command kernel pid 0 tid 100000 td 0xc100f660 sched_switch(c100f660,0,104,191,c010f601,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,54,...) at mi_switch+0x219 sleepq_switch(c100f660,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c100f3a0,54,c0e8835f,0,0,...) at sleepq_timedwait+0x6b _sleep(c100f3a0,0,54,c0e8835f,2710,...) at _sleep+0x342 scheduler(0,141ec00,141ec00,141e000,1425000,...) at scheduler+0x240 mi_startup() at mi_startup+0xac begin() at begin+0x2c db:0:allt> call doadump Physical memory: 3439 MB Dumping 561 MB: 546 530 514 498 482 466 450 434 418 402 386 370 354 338 322 306 290 274 258 242 226 210 194 178 162 146 130 114 98 82 66 50 34 18 2 Dump complete = 0xf db:0:doadump> reset cpu_reset: Restarting BSP cpu_reset_proxy: Stopped CPU 2 (kgdb) bt #0 doadump () at pcpu.h:244 #1 0xc04ddcb9 in db_fncall (dummy1=0xc09dcaca, dummy2=0x0, dummy3=0xffffffff, dummy4=0xef1f92a8 "¼\222\037ï") at ../../../ddb/db_command.c:548 #2 0xc04de0ef in db_command (last_cmdp=0xc0fd87fc, cmd_table=0x0, dopager=0x0) at ../../../ddb/db_command.c:445 #3 0xc04de1a4 in db_command_script (command=0xc0fd9708 "call doadump") at ../../../ddb/db_command.c:516 #4 0xc04e2470 in db_script_exec (scriptname=0xc0fd9060 "doadump", warnifnotfound=Variable "warnifnotfound" is not available. ) at ../../../ddb/db_script.c:302 #5 0xc04e2501 in db_run_cmd (addr=0x1, have_addr=0x0, count=0xc11b1180, modif=0xef1f93e0 "") at ../../../ddb/db_script.c:375 #6 0xc04de0b1 in db_command (last_cmdp=0xc0fd87fc, cmd_table=0x0, dopager=0x1) at ../../../ddb/db_command.c:445 #7 0xc04de20a in db_command_loop () at ../../../ddb/db_command.c:498 #8 0xc04e018d in db_trap (type=0x3, code=0x0) at ../../../ddb/db_main.c:229 #9 0xc09dcc42 in kdb_trap (type=0x3, code=0x0, tf=0xef1f9590) at ../../../kern/subr_kdb.c:533 #10 0xc0cd2c3b in trap (frame=0xef1f9590) at ../../../i386/i386/trap.c:719 #11 0xc0cbb94c in calltrap () at ../../../i386/i386/exception.s:168 #12 0xc09dcaca in kdb_enter (why=0xc0e85a53 "panic", msg=0xc0e85a53 "panic") at cpufunc.h:71 #13 0xc09a80d4 in panic (fmt=0xc0ebe1e3 "kmem_malloc(%ld): kmem_map too small: %ld total allocated") at ../../../kern/kern_shutdown.c:584 #14 0xc0c03aa0 in kmem_malloc (map=0xc15b808c, size=0x4000, flags=0x2) at ../../../vm/vm_kern.c:334 #15 0xc0bf8d07 in page_alloc (zone=0x0, bytes=0x4000, pflag=0xef1f9667 "\002", wait=0x2) at ../../../vm/uma_core.c:994 #16 0xc0bfa9f0 in uma_large_malloc (size=0x4000, wait=0x2) at ../../../vm/uma_core.c:3064 #17 0xc099554d in malloc (size=0x4000, mtp=0xc0fb8b48, flags=0x2) at ../../../kern/kern_malloc.c:492 #18 0xc0bd15d2 in setup_trunc_indir (freeblks=0xc8773480, ip=0xc7ca5828, lbn=0xfffffffffffff7f4, lastlbn=0xefd, blkno=0x17b68, needj=0x1) at ../../../ufs/ffs/ffs_softdep.c:5689 #19 0xc0bd16bb in setup_trunc_indir (freeblks=0xc8773480, ip=0xc7ca5828, lbn=Variable "lbn" is not available. ) at ../../../ufs/ffs/ffs_softdep.c:5711 #20 0xc0bd76b1 in softdep_journal_freeblocks (ip=0xc7ca5828, cred=0xc804e900, length=0x3bf505e, flags=0x800) at ../../../ufs/ffs/ffs_softdep.c:5921 #21 0xc0bbb06e in ffs_truncate (vp=0xc7da3984, length=0x3bf505e, flags=Variable "flags" is not available. ) at ../../../ufs/ffs/ffs_inode.c:330 #22 0xc0bf00d8 in ufs_setattr (ap=0xef1f9bf0) at ../../../ufs/ufs/ufs_vnops.c:621 #23 0xc0cf5975 in VOP_SETATTR_APV (vop=0xc0fbb840, a=0xef1f9bf0) at vnode_if.c:760 #24 0xc0a511e5 in vn_truncate (fp=0xc74c4ce8, length=0x3bf505e, active_cred=0xc804e900, td=0xc77fa2e0) at vnode_if.h:335 #25 0xc09f6247 in kern_ftruncate (td=0xc77fa2e0, fd=0x3, length=0x3bf505e) at file.h:247 #26 0xc09f62c8 in ftruncate (td=0xc77fa2e0, uap=0xef1f9cec) at ../../../kern/sys_generic.c:595 #27 0xc09eada3 in syscallenter (td=0xc77fa2e0, sa=0xef1f9ce4) at ../../../kern/subr_trap.c:344 #28 0xc0cd24ef in syscall (frame=0xef1f9d28) at ../../../i386/i386/trap.c:1082 #29 0xc0cbb9b1 in Xint0x80_syscall () at ../../../i386/i386/exception.s:266 #30 0x00000033 in ?? () Previous frame inner to this frame (corrupt stack?) (kgdb) f 18 #18 0xc0bd15d2 in setup_trunc_indir (freeblks=0xc8773480, ip=0xc7ca5828, lbn=0xfffffffffffff7f4, lastlbn=0xefd, blkno=0x17b68, needj=0x1) at ../../../ufs/ffs/ffs_softdep.c:5689 5689 indirdep->ir_saveddata = malloc(bp->b_bcount, M_INDIRDEP, (kgdb) l 5684 * Creation is protected by the buf lock. The saveddata is only 5685 * needed if a full truncation follows a partial truncation but it 5686 * is difficult to allocate in that case so we fetch it anyway. 5687 */ 5688 if (indirdep->ir_saveddata == NULL); 5689 indirdep->ir_saveddata = malloc(bp->b_bcount, M_INDIRDEP, 5690 M_SOFTDEP_FLAGS); 5691 nowork: 5692 /* Fetch the blkno of the child and the zero start offset. */ 5693 if (ip->i_ump->um_fstype == UFS1) { (kgdb) $ vmstat -m /var/crash/vmcore.137 Type InUse MemUse HighUse Requests Size(s) sbp 104 9K - 104 32,128 cdev 8 1K - 8 128 entropy 1024 64K - 1024 64 sigio 1 1K - 1 32 filedesc 61 22K - 2358 16,32,256,512,2048 kenv 83 7K - 104 16,32,64,128,4096 kqueue 0 0K - 78 128,1024 proc-args 33 2K - 958 16,32,64,128,256 hhook 2 1K - 2 128 acpiintr 1 1K - 1 32 ithread 84 7K - 84 16,64,128 KTRACE 100 13K - 100 128 linker 178 388K - 240 16,32,512,1024,2048,4096 lockf 32 2K - 764 32,64 loginclass 2 1K - 9 64 acpica 2573 135K - 66755 16,32,64,128,256,512,1024 ip6ndp 12 1K - 13 64,128 temp 35 225K - 30983 16,32,64,128,256,512,1024,2048,4096 devbuf 2631 5141K - 2668 16,32,64,128,256,512,1024,2048,4096 module 483 31K - 483 64,128 mtx_pool 2 8K - 2 4096 UART 3 2K - 3 16,256,1024 acpitask 1 1K - 1 1024 osd 2 1K - 2 16,32 subproc 158 231K - 2437 256,4096 proc 2 8K - 2 4096 session 26 2K - 48 64 pgrp 30 2K - 60 64 cred 52 5K - 11806 64,128 uidinfo 4 2K - 38 64,1024 plimit 15 4K - 285 256 kbdmux 6 18K - 6 16,256,1024,2048 CAM dev queue 7 1K - 7 128 sysctltmp 0 0K - 527 16,32,64,128,4096 sysctloid 3310 101K - 3427 16,32,64,128 sysctl 0 0K - 563 16,32,64 tidhash 1 8K - 1 callout 3 768K - 3 umtx 380 36K - 380 64,128 p1003.1b 1 1K - 1 16 SWAP 2 2189K - 2 64 bus-sc 73 146K - 3041 16,32,64,128,256,512,1024,2048,4096 bus 1218 55K - 5685 16,32,64,128,256,1024 devstat 14 29K - 14 16,4096 eventhandler 77 4K - 77 32,64,128 acpisem 17 2K - 17 64,128 kobj 346 692K - 404 2048 Per-cpu 1 1K - 1 16 CAM queue 25 1K - 180 16,32,128 rman 226 14K - 639 16,32,64 USBdev 24 8K - 24 32,128,1024 sbuf 1 1K - 1407 16,32,64,128,256,512,1024,2048,4096 USB 42 8K - 42 16,32,64,1024 CAM SIM 7 1K - 7 128 stack 0 0K - 2 128 taskqueue 17 1K - 17 16,64 Unitno 13 1K - 35 16,64 scsi_cd 0 0K - 3 16 CAM periph 6 1K - 33 16,32,64,128 Witness 1 104K - 1 iov 0 0K - 567 16,64,128,256 select 41 3K - 41 64 ioctlops 0 0K - 1547 16,32,64,128,256,512,1024 msg 4 25K - 4 1024,4096 sem 4 101K - 4 1024,4096 shm 1 12K - 1 tty 21 11K - 23 512,2048 pts 1 1K - 1 128 mbuf_tag 0 0K - 7 32 shmfd 1 4K - 1 4096 CAM XPT 87 85K - 237 16,32,64,1024,2048 pcb 26 79K - 128 16,64,512,1024,2048,4096 soname 4 1K - 730 16,32,128 biobuf 0 0K - 6 2048 vfscache 1 512K - 1 cl_savebuf 0 0K - 81 32,64 vfs_hash 1 256K - 1 vnodes 2 1K - 2 128 vnodemarker 0 0K - 101 512 mount 109 5K - 840 16,32,64,128,256 BPF 10 1K - 10 64 ether_multi 40 2K - 46 16,32,64 ifaddr 86 17K - 86 16,32,64,128,256,512,2048 ifnet 11 11K - 11 64,1024 clone 6 24K - 6 4096 arpcom 2 1K - 2 16 fw_com 1 1K - 1 64 lltable 26 7K - 26 128,256 routetbl 35 4K - 200 16,32,64,128,256 igmp 10 2K - 10 128 DEVFS1 127 32K - 137 256 DEVFS3 147 19K - 161 128 in_multi 2 1K - 2 128 sctp_iter 0 0K - 2 256 sctp_ifn 2 1K - 2 128 sctp_ifa 5 1K - 5 128 sctp_vrf 1 1K - 1 64 sctp_a_it 0 0K - 2 16 hostcache 1 16K - 1 syncache 1 72K - 1 ip6_moptions 2 1K - 2 32,128 in6_multi 22 3K - 22 16,256 in6_mfilter 1 1K - 1 512 DEVFS 34 1K - 35 16,64 mld 10 2K - 10 128 rpc 14 6K - 14 16,32,64,128,512,4096 audit_evclass 174 3K - 213 16 savedino 0 0K - 42 256 freework 1 1K - 104 16,128 newdirblk 0 0K - 6 32 dirrem 0 0K - 136 64 mkdir 0 0K - 12 64 diradd 1 1K - 140 64 freefile 0 0K - 112 32 freeblks 0 0K - 103 128 freefrag 0 0K - 287 64 indirdep 0 0K - 23 64 newblk 1 64K - 32515 128 bmsafemap 2 5K - 115 128,4096 inodedep 2 257K - 245 256 pagedep 2 65K - 102 128 ufs_dirhash 165 31K - 171 16,32,64,128,512,1024 ufs_quota 1 256K - 1 ufs_mount 15 64K - 18 256,2048,4096 vm_pgdata 2 65K - 2 64 UMAHash 1 1K - 2 256,512 atkbddev 2 1K - 2 32 memdesc 1 4K - 1 4096 pfs_nodes 72 9K - 72 128 pfs_vncache 2 1K - 2 32 acpidev 65 3K - 65 32 apmdev 1 1K - 1 64 GEOM 194 41K - 838 16,32,64,128,512,1024,2048 fw_xfer 0 0K - 1 128 firewire 11 23K - 14 32,64,512,1024,2048,4096 io_apic 1 1K - 1 1024 pci_link 16 2K - 16 64,128 msi 1 1K - 1 64 nexusdev 4 1K - 4 16 isadev 7 1K - 7 64 ddb_capture 1 48K - 1 linux 15 1K - 15 32,64 NFS FHA 1 1K - 1 1024 $ vmstat -z /var/crash/vmcore.137 ITEM SIZE LIMIT USED FREE REQ FAIL SLEEP UMA Kegs: 128, 0, 147, 3, 147, 0, 0 UMA Zones: 224, 0, 147, 6, 147, 0, 0 UMA Slabs: 284, 0, 1005, 3, 1887, 0, 0 UMA RCntSlabs: 544, 0, 514, 4, 514, 0, 0 UMA Hash: 128, 0, 2, 28, 3, 0, 0 16 Bucket: 76, 0, 199, 1, 199, 0, 0 32 Bucket: 140, 0, 132, 8, 132, 0, 0 64 Bucket: 268, 0, 162, 6, 162, 58, 0 128 Bucket: 524, 0, 444, 4, 444, 623, 0 VM OBJECT: 136, 0, 7459, 255, 33058, 0, 0 MAP: 140, 0, 7, 49, 7, 0, 0 KMAP ENTRY: 72, 57505, 29, 501, 12122, 0, 0 MAP ENTRY: 72, 0, 681, 485, 55085, 0, 0 fakepg: 72, 0, 0, 0, 0, 0, 0 mt_zone: 2060, 0, 305, 34, 305, 0, 0 16: 16, 0, 26, 177, 89, 0, 0 16: 16, 0, 2088, 551, 3185, 0, 0 16: 16, 0, 84, 525, 630, 0, 0 16: 16, 0, 233, 579, 29467, 0, 0 16: 16, 0, 11, 395, 11, 0, 0 16: 16, 0, 478, 740, 4114, 0, 0 16: 16, 0, 58, 348, 81, 0, 0 16: 16, 0, 2, 607, 1000, 0, 0 32: 32, 0, 5, 221, 6, 0, 0 32: 32, 0, 532, 485, 920, 0, 0 32: 32, 0, 81, 484, 1042, 0, 0 32: 32, 0, 945, 524, 32923, 0, 0 32: 32, 0, 3, 223, 10, 0, 0 32: 32, 0, 1369, 326, 3658, 0, 0 32: 32, 0, 97, 355, 97, 0, 0 32: 32, 0, 3, 449, 324, 0, 0 64: 64, 0, 1065, 174, 1082, 0, 0 64: 64, 0, 963, 335, 1269, 0, 0 64: 64, 0, 48, 306, 6873, 0, 0 64: 64, 0, 1665, 341, 2354, 0, 0 64: 64, 0, 9, 286, 43, 0, 0 64: 64, 0, 1191, 284, 1808, 0, 0 64: 64, 0, 40, 196, 74, 0, 0 64: 64, 0, 540, 286, 1465, 0, 0 128: 128, 0, 6, 84, 7, 0, 0 128: 128, 0, 73, 137, 161, 0, 0 128: 128, 0, 90, 120, 6142, 0, 0 128: 128, 0, 11, 79, 1810, 0, 0 128: 128, 0, 138, 162, 242, 0, 0 128: 128, 0, 1082, 32308, 34336, 0, 0 128: 128, 0, 87, 63, 87, 0, 0 128: 128, 0, 14, 196, 746, 0, 0 256: 256, 0, 0, 0, 0, 0, 0 256: 256, 0, 1, 59, 44, 0, 0 256: 256, 0, 1, 59, 25, 0, 0 256: 256, 0, 5, 25, 8, 0, 0 256: 256, 0, 44, 166, 719, 0, 0 256: 256, 0, 489, 216, 3703, 0, 0 256: 256, 0, 37, 53, 38, 0, 0 256: 256, 0, 107, 58, 143, 0, 0 512: 512, 0, 2, 14, 2, 0, 0 512: 512, 0, 7, 41, 114, 0, 0 512: 512, 0, 55, 33, 70, 0, 0 512: 512, 0, 6, 10, 7, 0, 0 512: 512, 0, 21, 27, 21, 0, 0 512: 512, 0, 31, 41, 1100, 0, 0 512: 512, 0, 13, 19, 13, 0, 0 512: 512, 0, 0, 48, 33, 0, 0 1024: 1024, 0, 10, 18, 43, 0, 0 1024: 1024, 0, 3, 33, 48, 0, 0 1024: 1024, 0, 1, 19, 10, 0, 0 1024: 1024, 0, 15, 13, 1374, 0, 0 1024: 1024, 0, 0, 0, 0, 0, 0 1024: 1024, 0, 10, 170, 863, 0, 0 1024: 1024, 0, 11, 1, 11, 0, 0 1024: 1024, 0, 0, 12, 10, 0, 0 2048: 2048, 0, 37, 27, 73, 0, 0 2048: 2048, 0, 5, 13, 12, 0, 0 2048: 2048, 0, 2, 10, 10, 0, 0 2048: 2048, 0, 2, 2, 2, 0, 0 2048: 2048, 0, 0, 4, 2, 0, 0 2048: 2048, 0, 14, 20, 212, 0, 0 2048: 2048, 0, 6, 12, 7, 0, 0 2048: 2048, 0, 346, 42, 404, 0, 0 4096: 4096, 0, 1, 1, 1, 0, 0 4096: 4096, 0, 11, 16, 17, 0, 0 4096: 4096, 0, 2, 12, 10, 0, 0 4096: 4096, 0, 5, 0, 5, 0, 0 4096: 4096, 0, 0, 0, 0, 0, 0 4096: 4096, 0, 228, 56, 29545, 0, 0 4096: 4096, 0, 3, 2, 3, 0, 0 4096: 4096, 0, 59, 60, 2339, 0, 0 Files: 56, 0, 99, 437, 13610, 0, 0 TURNSTILE: 72, 0, 191, 109, 191, 0, 0 umtx pi: 52, 0, 0, 0, 0, 0, 0 MAC labels: 20, 0, 0, 0, 0, 0, 0 PROC: 700, 0, 50, 55, 2330, 0, 0 THREAD: 728, 0, 166, 24, 166, 0, 0 SLEEPQUEUE: 48, 0, 191, 222, 191, 0, 0 VMSPACE: 232, 0, 33, 154, 2314, 0, 0 cpuset: 40, 0, 2, 182, 2, 0, 0 audit_record: 816, 0, 0, 0, 0, 0, 0 mbuf_packet: 256, 0, 256, 640, 1175, 0, 0 mbuf: 256, 0, 2, 647, 2380, 0, 0 mbuf_cluster: 2048, 25600, 896, 44, 896, 0, 0 mbuf_jumbo_page: 4096, 12800, 0, 44, 46, 0, 0 mbuf_jumbo_9k: 9216, 6400, 0, 0, 0, 0, 0 mbuf_jumbo_16k: 16384, 3200, 0, 0, 0, 0, 0 mbuf_ext_refcnt: 4, 0, 0, 0, 0, 0, 0 g_bio: 152, 0, 0, 1768, 1602625, 0, 0 ttyinq: 152, 0, 315, 127, 1065, 0, 0 ttyoutq: 256, 0, 164, 91, 556, 0, 0 ata_request: 208, 0, 0, 38, 11, 0, 0 ata_composite: 180, 0, 0, 0, 0, 0, 0 VNODE: 348, 0, 26683, 69, 26821, 0, 0 VNODEPOLL: 60, 0, 0, 0, 0, 0, 0 S VFS Cache: 72, 0, 26677, 194, 29242, 0, 0 L VFS Cache: 292, 0, 30, 22, 30, 0, 0 NAMEI: 1024, 0, 0, 56, 45474, 0, 0 DIRHASH: 1024, 0, 224, 80, 324, 0, 0 NCLNODE: 372, 0, 0, 0, 0, 0, 0 Mountpoints: 724, 0, 8, 22, 9, 0, 0 pipe: 392, 0, 2, 88, 1703, 0, 0 ksiginfo: 80, 0, 96, 960, 106, 0, 0 itimer: 220, 0, 1, 35, 1, 0, 0 KNOTE: 72, 0, 0, 265, 78, 0, 0 socket: 416, 25605, 40, 68, 534, 0, 0 ipq: 32, 904, 0, 0, 0, 0, 0 udp_inpcb: 220, 25614, 18, 90, 353, 0, 0 udpcb: 8, 25781, 18, 591, 353, 0, 0 tcp_inpcb: 220, 25614, 12, 60, 56, 0, 0 tcpcb: 692, 25600, 12, 13, 56, 0, 0 tcptw: 52, 5184, 0, 144, 1, 0, 0 syncache: 112, 15365, 0, 105, 8, 0, 0 hostcache: 76, 15400, 2, 148, 2, 0, 0 tcpreass: 20, 1690, 0, 0, 0, 0, 0 sackhole: 20, 0, 0, 0, 0, 0, 0 sctp_ep: 880, 25600, 0, 0, 0, 0, 0 sctp_asoc: 1548, 40000, 0, 0, 0, 0, 0 sctp_laddr: 24, 80040, 0, 145, 4, 0, 0 sctp_raddr: 480, 80000, 0, 0, 0, 0, 0 sctp_chunk: 96, 400000, 0, 0, 0, 0, 0 sctp_readq: 76, 400000, 0, 0, 0, 0, 0 sctp_stream_msg_out: 72, 400044, 0, 0, 0, 0, 0 sctp_asconf: 24, 400055, 0, 0, 0, 0, 0 sctp_asconf_ack: 24, 400055, 0, 0, 0, 0, 0 ripcb: 220, 25614, 0, 0, 0, 0, 0 unpcb: 172, 25622, 9, 106, 119, 0, 0 rtentry: 108, 0, 17, 91, 17, 0, 0 selfd: 28, 0, 86, 549, 9467, 0, 0 SWAPMETA: 276, 121576, 0, 0, 0, 0, 0 FFS inode: 116, 0, 26557, 140, 26678, 0, 0 FFS1 dinode: 128, 0, 0, 0, 0, 0, 0 FFS2 dinode: 256, 0, 26557, 98, 26678, 0, 0 $ svn diff -x -p /usr/src/sys Index: /usr/src/sys/ufs/ufs/ufsmount.h =================================================================== --- /usr/src/sys/ufs/ufs/ufsmount.h (revision 221878) +++ /usr/src/sys/ufs/ufs/ufsmount.h (working copy) @@ -61,6 +61,7 @@ struct jblocks; struct inodedep; TAILQ_HEAD(inodedeplst, inodedep); +LIST_HEAD(bmsafemaphd, bmsafemap); /* This structure describes the UFS specific mount structure data. */ struct ufsmount { @@ -82,7 +83,8 @@ struct ufsmount { struct workhead softdep_journal_pending; /* journal work queue */ struct worklist *softdep_journal_tail; /* Tail pointer for above */ struct jblocks *softdep_jblocks; /* Journal block information */ - struct inodedeplst softdep_unlinked; /* Unlinked inodes */ + struct inodedeplst softdep_unlinked; /* Unlinked inodes */ + struct bmsafemaphd softdep_dirtycg; /* Dirty CGs */ int softdep_on_journal; /* Items on the journal list */ int softdep_on_worklist; /* Items on the worklist */ int softdep_on_worklist_inprogress; /* Busy items on worklist */ Index: /usr/src/sys/ufs/ffs/ffs_softdep.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_softdep.c (revision 221878) +++ /usr/src/sys/ufs/ffs/ffs_softdep.c (working copy) @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #define DEBUG #endif +/* #define SUJ_DEBUG 1 */ + #include #include #include @@ -214,6 +216,17 @@ softdep_setup_allocindir_meta(nbp, ip, bp, ptrno, } void +softdep_journal_freeblocks(ip, cred, length, flags) + struct inode *ip; + struct ucred *cred; + off_t length; + int flags; +{ + + panic("softdep_journal_freeblocks called"); +} + +void softdep_setup_freeblocks(ip, length, flags) struct inode *ip; off_t length; @@ -618,6 +631,7 @@ FEATURE(softupdates, "FFS soft-updates support"); unsigned long dep_current[D_LAST + 1]; unsigned long dep_total[D_LAST + 1]; +unsigned long dep_write[D_LAST + 1]; SYSCTL_NODE(_debug, OID_AUTO, softdep, CTLFLAG_RW, 0, "soft updates stats"); @@ -625,13 +639,17 @@ SYSCTL_NODE(_debug_softdep, OID_AUTO, total, CTLFL "total dependencies allocated"); SYSCTL_NODE(_debug_softdep, OID_AUTO, current, CTLFLAG_RW, 0, "current dependencies allocated"); +SYSCTL_NODE(_debug_softdep, OID_AUTO, write, CTLFLAG_RW, 0, + "current dependencies written"); #define SOFTDEP_TYPE(type, str, long) \ static MALLOC_DEFINE(M_ ## type, #str, long); \ SYSCTL_ULONG(_debug_softdep_total, OID_AUTO, str, CTLFLAG_RD, \ &dep_total[D_ ## type], 0, ""); \ SYSCTL_ULONG(_debug_softdep_current, OID_AUTO, str, CTLFLAG_RD, \ - &dep_current[D_ ## type], 0, ""); + &dep_current[D_ ## type], 0, ""); \ + SYSCTL_ULONG(_debug_softdep_write, OID_AUTO, str, CTLFLAG_RD, \ + &dep_write[D_ ## type], 0, ""); SOFTDEP_TYPE(PAGEDEP, pagedep, "File page dependencies"); SOFTDEP_TYPE(INODEDEP, inodedep, "Inode dependencies"); @@ -736,8 +754,10 @@ static int flush_pagedep_deps(struct vnode *, stru struct diraddhd *); static void free_pagedep(struct pagedep *); static int flush_newblk_dep(struct vnode *, struct mount *, ufs_lbn_t); -static int flush_inodedep_deps(struct mount *, ino_t); +static int flush_inodedep_deps(struct vnode *, struct mount *, ino_t); static int flush_deplist(struct allocdirectlst *, int, int *); +static int flush_trunclist(struct vnode *, struct inodedep *, int, int *); +static void sync_cgs(struct mount *, int); static int handle_written_filepage(struct pagedep *, struct buf *); static int handle_written_sbdep(struct sbdep *, struct buf *); static void initiate_write_sbdep(struct sbdep *); @@ -752,6 +772,7 @@ static void handle_written_jseg(struct jseg *, str static void handle_written_jnewblk(struct jnewblk *); static void handle_written_jfreeblk(struct jfreeblk *); static void handle_written_jfreefrag(struct jfreefrag *); +static void handle_written_jtrunc(struct jtrunc *); static void complete_jseg(struct jseg *); static void jseg_write(struct ufsmount *ump, struct jseg *, uint8_t *); static void jaddref_write(struct jaddref *, struct jseg *, uint8_t *); @@ -768,7 +789,9 @@ static void handle_allocdirect_partdone(struct all static struct jnewblk *cancel_newblk(struct newblk *, struct worklist *, struct workhead *); static void indirdep_complete(struct indirdep *); -static int indirblk_inseg(struct mount *, ufs2_daddr_t); +static int indirblk_lookup(struct mount *, ufs2_daddr_t); +static void indirblk_insert(struct freework *); +static void indirblk_remove(struct freework *); static void handle_allocindir_partdone(struct allocindir *); static void initiate_write_filepage(struct pagedep *, struct buf *); static void initiate_write_indirdep(struct indirdep*, struct buf *); @@ -780,7 +803,9 @@ static void handle_workitem_freefile(struct freefi static void handle_workitem_remove(struct dirrem *, struct vnode *); static struct dirrem *newdirrem(struct buf *, struct inode *, struct inode *, int, struct dirrem **); -static void cancel_indirdep(struct indirdep *, struct buf *, struct inodedep *, +static struct indirdep *indirdep_lookup(struct mount *, struct inode *, + struct buf *); +static void cancel_indirdep(struct indirdep *, struct buf *, struct freeblks *); static void free_indirdep(struct indirdep *); static void free_diradd(struct diradd *, struct workhead *); @@ -795,8 +820,13 @@ static void cancel_diradd(struct diradd *, struct struct jremref *, struct jremref *); static void dirrem_journal(struct dirrem *, struct jremref *, struct jremref *, struct jremref *); -static void cancel_allocindir(struct allocindir *, struct inodedep *, - struct freeblks *); +static void cancel_allocindir(struct allocindir *, struct buf *bp, + struct freeblks *, int); +static int setup_trunc_indir(struct freeblks *, struct inode *, + ufs_lbn_t, ufs_lbn_t, ufs2_daddr_t, int); +static void complete_trunc_indir(struct freework *); +static void trunc_indirdep(struct indirdep *, struct freeblks *, struct buf *, + int); static void complete_mkdir(struct mkdir *); static void free_newdirblk(struct newdirblk *); static void free_jremref(struct jremref *); @@ -818,30 +848,29 @@ static void cancel_jfreefrag(struct jfreefrag *); static inline void setup_freedirect(struct freeblks *, struct inode *, int, int); static inline void setup_freeext(struct freeblks *, struct inode *, int, int); -static inline void setup_freeindir(struct freeblks *, struct inode *, int i, +static inline void setup_freeindir(struct freeblks *, struct inode *, int, ufs_lbn_t, int); static inline struct freeblks *newfreeblks(struct mount *, struct inode *); static void indir_trunc(struct freework *, ufs2_daddr_t, ufs_lbn_t); -static void softdep_trunc_deps(struct vnode *, struct freeblks *, ufs_lbn_t, +static void trunc_dependencies(struct inode *, struct freeblks *, ufs_lbn_t, int, int); -static int cancel_pagedep(struct pagedep *, struct inodedep *, - struct freeblks *); -static int deallocate_dependencies(struct buf *, struct inodedep *, - struct freeblks *, int off); +static int cancel_pagedep(struct pagedep *, struct freeblks *, int); +static int deallocate_dependencies(struct buf *, struct freeblks *, int); +static void newblk_freefrag(struct newblk*); static void free_newblk(struct newblk *); static void cancel_allocdirect(struct allocdirectlst *, - struct allocdirect *, struct freeblks *, int); + struct allocdirect *, struct freeblks *); static int check_inode_unwritten(struct inodedep *); static int free_inodedep(struct inodedep *); static void freework_freeblock(struct freework *); static void handle_workitem_freeblocks(struct freeblks *, int); -static void handle_complete_freeblocks(struct freeblks *); +static void handle_complete_freeblocks(struct freeblks *, int); static void handle_workitem_indirblk(struct freework *); static void handle_written_freework(struct freework *); static void merge_inode_lists(struct allocdirectlst *,struct allocdirectlst *); static struct worklist *jnewblk_merge(struct worklist *, struct worklist *, struct workhead *); -static void setup_allocindir_phase2(struct buf *, struct inode *, +static struct freefrag *setup_allocindir_phase2(struct buf *, struct inode *, struct inodedep *, struct allocindir *, ufs_lbn_t); static struct allocindir *newallocindir(struct inode *, int, ufs2_daddr_t, ufs2_daddr_t, ufs_lbn_t); @@ -870,7 +899,9 @@ static void pause_timer(void *); static int request_cleanup(struct mount *, int); static int process_worklist_item(struct mount *, int); static void process_removes(struct vnode *); +static void process_truncates(struct vnode *); static void jwork_move(struct workhead *, struct workhead *); +static void jwork_insert(struct workhead *, struct jsegdep *); static void add_to_worklist(struct worklist *, int); static void remove_from_worklist(struct worklist *); static void softdep_flush(void); @@ -894,11 +925,12 @@ static inline void newinoref(struct inoref *, ino_ static inline struct jsegdep *inoref_jseg(struct inoref *); static struct jmvref *newjmvref(struct inode *, ino_t, off_t, off_t); static struct jfreeblk *newjfreeblk(struct freeblks *, ufs_lbn_t, - ufs2_daddr_t, int); + ufs2_daddr_t, int, int); +static void cancel_jfreeblk(struct freeblks *, ufs2_daddr_t); static struct jfreefrag *newjfreefrag(struct freefrag *, struct inode *, ufs2_daddr_t, long, ufs_lbn_t); static struct freework *newfreework(struct ufsmount *, struct freeblks *, - struct freework *, ufs_lbn_t, ufs2_daddr_t, int, int); + struct freework *, ufs_lbn_t, ufs2_daddr_t, int, int, int); static void jwait(struct worklist *wk); static struct inodedep *inodedep_lookup_ip(struct inode *); static int bmsafemap_rollbacks(struct bmsafemap *); @@ -1064,6 +1096,30 @@ jwork_move(dst, src) } } +static void +jwork_insert(dst, jsegdep) + struct workhead *dst; + struct jsegdep *jsegdep; +{ + struct jsegdep *jsegdepn; + struct worklist *wk; + + LIST_FOREACH(wk, dst, wk_list) + if (wk->wk_type == D_JSEGDEP) + break; + if (wk == NULL) { + WORKLIST_INSERT(dst, &jsegdep->jd_list); + return; + } + jsegdepn = WK_JSEGDEP(wk); + if (jsegdep->jd_seg->js_seq < jsegdepn->jd_seg->js_seq) { + WORKLIST_REMOVE(wk); + free_jsegdep(jsegdepn); + WORKLIST_INSERT(dst, &jsegdep->jd_list); + } else + free_jsegdep(jsegdep); +} + /* * Routines for tracking and managing workitems. */ @@ -1101,14 +1157,18 @@ workitem_alloc(item, type, mp) int type; struct mount *mp; { + struct ufsmount *ump; + item->wk_type = type; item->wk_mp = mp; item->wk_state = 0; + + ump = VFSTOUFS(mp); ACQUIRE_LOCK(&lk); dep_current[type]++; dep_total[type]++; - VFSTOUFS(mp)->softdep_deps++; - VFSTOUFS(mp)->softdep_accdeps++; + ump->softdep_deps++; + ump->softdep_accdeps++; FREE_LOCK(&lk); } @@ -1478,6 +1538,43 @@ process_removes(vp) } /* + * Process all truncations associated with a vnode if we are running out + * of journal space. This is called when the vnode lock is already held + * and no other process can clear the truncation. + */ +static void +process_truncates(vp) + struct vnode *vp; +{ + struct inodedep *inodedep; + struct freeblks *freeblks; + struct mount *mp; + ino_t inum; + + mtx_assert(&lk, MA_OWNED); + + mp = vp->v_mount; + inum = VTOI(vp)->i_number; + for (;;) { + if (inodedep_lookup(mp, inum, 0, &inodedep) == 0) + return; + TAILQ_FOREACH(freeblks, &inodedep->id_freeblklst, fb_next) + if ((freeblks->fb_state & (ALLCOMPLETE | ONWORKLIST)) == + (ALLCOMPLETE | ONWORKLIST)) + break; + if (freeblks == NULL) + return; + remove_from_worklist(&freeblks->fb_list); + FREE_LOCK(&lk); + if (vn_start_secondary_write(NULL, &mp, V_NOWAIT)) + panic("process_removes: suspended filesystem"); + handle_workitem_freeblocks(freeblks, 0); + vn_finished_secondary_write(mp); + ACQUIRE_LOCK(&lk); + } +} + +/* * Process one item on the worklist. */ static int @@ -1560,7 +1657,9 @@ process_worklist_item(mp, flags) case D_FREEWORK: /* Final block in an indirect was freed. */ + ACQUIRE_LOCK(&lk); handle_workitem_indirblk(WK_FREEWORK(wk)); + FREE_LOCK(&lk); break; default: @@ -1922,6 +2021,7 @@ inodedep_lookup(mp, inum, flags, inodedeppp) TAILQ_INIT(&inodedep->id_newinoupdt); TAILQ_INIT(&inodedep->id_extupdt); TAILQ_INIT(&inodedep->id_newextupdt); + TAILQ_INIT(&inodedep->id_freeblklst); LIST_INSERT_HEAD(inodedephd, inodedep, id_hash); *inodedeppp = inodedep; return (0); @@ -2008,43 +2108,86 @@ newblk_lookup(mp, newblkno, flags, newblkpp) } /* - * Structures and routines associated with indir caching. + * Structures and routines associated with freed indirect block caching. */ -struct workhead *indir_hashtbl; +struct freeworklst *indir_hashtbl; u_long indir_hash; /* size of hash table - 1 */ #define INDIR_HASH(mp, blkno) \ (&indir_hashtbl[((((register_t)(mp)) >> 13) + (blkno)) & indir_hash]) +/* + * Lookup an indirect block in the indir hash table. The freework is + * removed and potentially freed. The caller must do a blocking journal + * write before writing to the blkno. + */ static int -indirblk_inseg(mp, blkno) +indirblk_lookup(mp, blkno) struct mount *mp; ufs2_daddr_t blkno; { struct freework *freework; - struct workhead *wkhd; - struct worklist *wk; + struct freeworklst *wkhd; wkhd = INDIR_HASH(mp, blkno); - LIST_FOREACH(wk, wkhd, wk_list) { - freework = WK_FREEWORK(wk); - if (freework->fw_blkno == blkno && - freework->fw_list.wk_mp == mp) { - LIST_REMOVE(freework, fw_next); - WORKLIST_REMOVE(&freework->fw_list); - WORKITEM_FREE(freework, D_FREEWORK); - return (1); - } + TAILQ_FOREACH(freework, wkhd, fw_next) { + if (freework->fw_blkno != blkno) + continue; + if (freework->fw_list.wk_mp != mp) + continue; + indirblk_remove(freework); + return (1); } return (0); } /* + * Insert an indirect block represented by freework into the indirblk + * hash table so that it may prevent the block from being re-used prior + * to the journal being written. + */ +static void +indirblk_insert(freework) + struct freework *freework; +{ + struct freeblks *freeblks; + struct jsegdep *jsegdep; + struct worklist *wk; + + freeblks = freework->fw_freeblks; + LIST_FOREACH(wk, &freeblks->fb_jwork, wk_list) + if (wk->wk_type == D_JSEGDEP) + break; + if (wk == NULL) + return; + + jsegdep = WK_JSEGDEP(wk); + LIST_INSERT_HEAD(&jsegdep->jd_seg->js_indirs, freework, fw_segs); + TAILQ_INSERT_HEAD(INDIR_HASH(freework->fw_list.wk_mp, + freework->fw_blkno), freework, fw_next); + freework->fw_state &= ~DEPCOMPLETE; +} + +static void +indirblk_remove(freework) + struct freework *freework; +{ + + LIST_REMOVE(freework, fw_segs); + TAILQ_REMOVE(INDIR_HASH(freework->fw_list.wk_mp, + freework->fw_blkno), freework, fw_next); + freework->fw_state |= DEPCOMPLETE; + if ((freework->fw_state & ALLCOMPLETE) == ALLCOMPLETE) + WORKITEM_FREE(freework, D_FREEWORK); +} + +/* * Executed during filesystem system initialization before * mounting any filesystems. */ void softdep_initialize() { + int i; LIST_INIT(&mkdirlisthd); max_softdeps = desiredvnodes * 4; @@ -2052,7 +2195,12 @@ softdep_initialize() inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, &inodedep_hash); newblk_hashtbl = hashinit(desiredvnodes / 5, M_NEWBLK, &newblk_hash); bmsafemap_hashtbl = hashinit(1024, M_BMSAFEMAP, &bmsafemap_hash); - indir_hashtbl = hashinit(desiredvnodes / 10, M_FREEWORK, &indir_hash); + i = 1 << (ffs(desiredvnodes / 10) - 1); + indir_hashtbl = malloc(i * sizeof(indir_hashtbl[0]), M_FREEWORK, + M_WAITOK); + indir_hash = i - 1; + for (i = 0; i <= indir_hash; i++) + TAILQ_INIT(&indir_hashtbl[i]); /* initialise bioops hack */ bioops.io_start = softdep_disk_io_initiation; @@ -2077,6 +2225,7 @@ softdep_uninitialize() hashdestroy(inodedep_hashtbl, M_INODEDEP, inodedep_hash); hashdestroy(newblk_hashtbl, M_NEWBLK, newblk_hash); hashdestroy(bmsafemap_hashtbl, M_BMSAFEMAP, bmsafemap_hash); + free(indir_hashtbl, M_FREEWORK); } /* @@ -2108,6 +2257,7 @@ softdep_mount(devvp, mp, fs, cred) LIST_INIT(&ump->softdep_workitem_pending); LIST_INIT(&ump->softdep_journal_pending); TAILQ_INIT(&ump->softdep_unlinked); + LIST_INIT(&ump->softdep_dirtycg); ump->softdep_worklist_tail = NULL; ump->softdep_on_worklist = 0; ump->softdep_deps = 0; @@ -2570,6 +2720,7 @@ softdep_prealloc(vp, waitok) ffs_syncvnode(vp, waitok); ACQUIRE_LOCK(&lk); process_removes(vp); + process_truncates(vp); if (journal_space(ump, 0) == 0) { softdep_speedup(); if (journal_space(ump, 1) == 0) @@ -2604,9 +2755,12 @@ softdep_prelink(dvp, vp) ffs_syncvnode(dvp, MNT_WAIT); ACQUIRE_LOCK(&lk); /* Process vp before dvp as it may create .. removes. */ - if (vp) + if (vp) { process_removes(vp); + process_truncates(vp); + } process_removes(dvp); + process_truncates(dvp); softdep_speedup(); process_worklist_item(UFSTOVFS(ump), LK_NOWAIT); process_worklist_item(UFSTOVFS(ump), LK_NOWAIT); @@ -2753,6 +2907,7 @@ jtrunc_write(jtrunc, jseg, data) { struct jtrncrec *rec; + jtrunc->jt_jsegdep->jd_seg = jseg; rec = (struct jtrncrec *)data; rec->jt_op = JOP_TRUNC; rec->jt_ino = jtrunc->jt_ino; @@ -3013,7 +3168,8 @@ complete_jseg(jseg) rele_jseg(jseg); jmvref = WK_JMVREF(wk); LIST_REMOVE(jmvref, jm_deps); - free_pagedep(jmvref->jm_pagedep); + if ((jmvref->jm_pagedep->pd_state & ONWORKLIST) == 0) + free_pagedep(jmvref->jm_pagedep); WORKITEM_FREE(jmvref, D_JMVREF); break; case D_JNEWBLK: @@ -3026,8 +3182,7 @@ complete_jseg(jseg) handle_written_jfreefrag(WK_JFREEFRAG(wk)); break; case D_JTRUNC: - WK_JTRUNC(wk)->jt_jsegdep->jd_seg = jseg; - WORKITEM_FREE(wk, D_JTRUNC); + handle_written_jtrunc(WK_JTRUNC(wk)); break; default: panic("handle_written_jseg: Unknown type %s", @@ -3082,6 +3237,27 @@ handle_written_jseg(jseg, bp) free_jsegs(jblocks); } +static void +handle_written_jtrunc(jtrunc) + struct jtrunc *jtrunc; +{ + struct freeblks *freeblks; + + freeblks = jtrunc->jt_freeblks; + freeblks->fb_jtrunc = NULL; + jwork_insert(&freeblks->fb_jwork, jtrunc->jt_jsegdep); + /* + * If the freeblks is all journaled, we can add it to the worklist. + */ + if ((freeblks->fb_state & ALLCOMPLETE) == ALLCOMPLETE) { + /* Remove from the b_dep that is waiting on this write. */ + if (freeblks->fb_state & ONWORKLIST) + WORKLIST_REMOVE(&freeblks->fb_list); + add_to_worklist(&freeblks->fb_list, 1); + } + WORKITEM_FREE(jtrunc, D_JTRUNC); +} + static inline struct jsegdep * inoref_jseg(inoref) struct inoref *inoref; @@ -3123,7 +3299,7 @@ handle_written_jremref(jremref) jremref->jr_dirrem = NULL; LIST_REMOVE(jremref, jr_deps); jsegdep->jd_state |= jremref->jr_state & MKDIR_PARENT; - WORKLIST_INSERT(&dirrem->dm_jwork, &jsegdep->jd_list); + jwork_insert(&dirrem->dm_jwork, jsegdep); if (LIST_EMPTY(&dirrem->dm_jremrefhd) && (dirrem->dm_state & COMPLETE) != 0) add_to_worklist(&dirrem->dm_list, 0); @@ -3183,7 +3359,7 @@ handle_written_jaddref(jaddref) mkdir->md_state |= DEPCOMPLETE; complete_mkdir(mkdir); } - WORKLIST_INSERT(&diradd->da_jwork, &jsegdep->jd_list); + jwork_insert(&diradd->da_jwork, jsegdep); if (jaddref->ja_state & NEWBLOCK) { inodedep->id_state |= ONDEPLIST; LIST_INSERT_HEAD(&inodedep->id_bmsafemap->sm_inodedephd, @@ -3205,10 +3381,9 @@ handle_written_jnewblk(jnewblk) { struct bmsafemap *bmsafemap; struct freefrag *freefrag; + struct freework *freework; struct jsegdep *jsegdep; struct newblk *newblk; - struct freework *freework; - struct indirdep *indirdep; /* Grab the jsegdep. */ jsegdep = jnewblk->jn_jsegdep; @@ -3225,10 +3400,13 @@ handle_written_jnewblk(jnewblk) */ newblk = WK_NEWBLK(jnewblk->jn_dep); newblk->nb_jnewblk = NULL; - bmsafemap = newblk->nb_bmsafemap; - newblk->nb_state |= ONDEPLIST; - LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk, nb_deps); - WORKLIST_INSERT(&newblk->nb_jwork, &jsegdep->jd_list); + if ((newblk->nb_state & GOINGAWAY) == 0) { + bmsafemap = newblk->nb_bmsafemap; + newblk->nb_state |= ONDEPLIST; + LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk, + nb_deps); + } + jwork_insert(&newblk->nb_jwork, jsegdep); break; case D_FREEFRAG: /* @@ -3245,16 +3423,9 @@ handle_written_jnewblk(jnewblk) */ freework = WK_FREEWORK(jnewblk->jn_dep); freework->fw_jnewblk = NULL; - WORKLIST_INSERT(&freework->fw_jwork, &jsegdep->jd_list); + WORKLIST_INSERT(&freework->fw_freeblks->fb_jwork, + &jsegdep->jd_list); break; - case D_INDIRDEP: - /* - * An indirect block was removed by truncate. - */ - indirdep = WK_INDIRDEP(jnewblk->jn_dep); - LIST_REMOVE(jnewblk, jn_indirdeps); - WORKLIST_INSERT(&indirdep->ir_jwork, &jsegdep->jd_list); - break; default: panic("handle_written_jnewblk: Unknown type %d.", jnewblk->jn_dep->wk_type); @@ -3321,7 +3492,7 @@ handle_written_jfreefrag(jfreefrag) panic("handle_written_jfreefrag: No freefrag."); freefrag->ff_state |= DEPCOMPLETE; freefrag->ff_jdep = NULL; - WORKLIST_INSERT(&freefrag->ff_jwork, &jsegdep->jd_list); + jwork_insert(&freefrag->ff_jwork, jsegdep); if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) add_to_worklist(&freefrag->ff_list, 0); jfreefrag->fr_freefrag = NULL; @@ -3351,12 +3522,8 @@ handle_written_jfreeblk(jfreeblk) * If the freeblks is all journaled, we can add it to the worklist. */ if (LIST_EMPTY(&freeblks->fb_jfreeblkhd) && - (freeblks->fb_state & ALLCOMPLETE) == ALLCOMPLETE) { - /* Remove from the b_dep that is waiting on this write. */ - if (freeblks->fb_state & ONWORKLIST) - WORKLIST_REMOVE(&freeblks->fb_list); + (freeblks->fb_state & ALLCOMPLETE) == ALLCOMPLETE) add_to_worklist(&freeblks->fb_list, 1); - } free_jfreeblk(jfreeblk); } @@ -3493,51 +3660,79 @@ free_freedep(freedep) * is visible outside of softdep_setup_freeblocks(). */ static struct freework * -newfreework(ump, freeblks, parent, lbn, nb, frags, journal) +newfreework(ump, freeblks, parent, lbn, nb, frags, off, journal) struct ufsmount *ump; struct freeblks *freeblks; struct freework *parent; ufs_lbn_t lbn; ufs2_daddr_t nb; int frags; + int off; int journal; { + struct jfreeblk *jfreeblk; struct freework *freework; freework = malloc(sizeof(*freework), M_FREEWORK, M_SOFTDEP_FLAGS); workitem_alloc(&freework->fw_list, D_FREEWORK, freeblks->fb_list.wk_mp); + freework->fw_state = ATTACHED; freework->fw_jnewblk = NULL; freework->fw_freeblks = freeblks; freework->fw_parent = parent; freework->fw_lbn = lbn; freework->fw_blkno = nb; freework->fw_frags = frags; + freework->fw_indir = NULL; freework->fw_ref = ((UFSTOVFS(ump)->mnt_kern_flag & MNTK_SUJ) == 0 || lbn >= -NXADDR) ? 0 : NINDIR(ump->um_fs) + 1; - freework->fw_off = 0; - LIST_INIT(&freework->fw_jwork); - + freework->fw_start = freework->fw_off = off; + jfreeblk = NULL; + if (journal) { + jfreeblk = newjfreeblk(freeblks, lbn, nb, frags, off); + LIST_INSERT_HEAD(&freeblks->fb_jfreeblkhd, jfreeblk, jf_deps); + } if (parent == NULL) { - WORKLIST_INSERT_UNLOCKED(&freeblks->fb_freeworkhd, - &freework->fw_list); + ACQUIRE_LOCK(&lk); + freework->fw_state |= ONDEPLIST; + WORKLIST_INSERT(&freeblks->fb_freeworkhd, &freework->fw_list); freeblks->fb_ref++; + FREE_LOCK(&lk); } - if (journal) - newjfreeblk(freeblks, lbn, nb, frags); return (freework); } /* + * Eliminate a jfreeblk for a block that does not need journaling. + */ +static void +cancel_jfreeblk(freeblks, blkno) + struct freeblks *freeblks; + ufs2_daddr_t blkno; +{ + struct jfreeblk *jfreeblk; + + LIST_FOREACH(jfreeblk, &freeblks->fb_jfreeblkhd, jf_deps) + if (jfreeblk->jf_blkno == blkno) + break; + if (jfreeblk == NULL) + return; + free_jsegdep(jfreeblk->jf_jsegdep); + LIST_REMOVE(jfreeblk, jf_deps); + WORKITEM_FREE(jfreeblk, D_JFREEBLK); +} + +/* * Allocate a new jfreeblk to journal top level block pointer when truncating * a file. The caller must add this to the worklist when lk is held. */ static struct jfreeblk * -newjfreeblk(freeblks, lbn, blkno, frags) +newjfreeblk(freeblks, lbn, blkno, frags, off) struct freeblks *freeblks; ufs_lbn_t lbn; ufs2_daddr_t blkno; int frags; + int off; { struct jfreeblk *jfreeblk; @@ -3545,12 +3740,12 @@ static struct jfreeblk * workitem_alloc(&jfreeblk->jf_list, D_JFREEBLK, freeblks->fb_list.wk_mp); jfreeblk->jf_jsegdep = newjsegdep(&jfreeblk->jf_list); jfreeblk->jf_state = ATTACHED | DEPCOMPLETE; - jfreeblk->jf_ino = freeblks->fb_previousinum; + jfreeblk->jf_ino = freeblks->fb_inum; jfreeblk->jf_lbn = lbn; jfreeblk->jf_blkno = blkno; jfreeblk->jf_frags = frags; + jfreeblk->jf_off = off; jfreeblk->jf_freeblks = freeblks; - LIST_INSERT_HEAD(&freeblks->fb_jfreeblkhd, jfreeblk, jf_deps); return (jfreeblk); } @@ -3645,7 +3840,7 @@ cancel_jaddref(jaddref, inodedep, wkhd) if (jaddref->ja_state & IOSTARTED) { jaddref->ja_state &= ~IOSTARTED; WORKLIST_REMOVE(&jaddref->ja_list); - WORKLIST_INSERT(wkhd, &jsegdep->jd_list); + jwork_insert(wkhd, jsegdep); } else { free_jsegdep(jsegdep); if (jaddref->ja_state & DEPCOMPLETE) @@ -3734,11 +3929,7 @@ free_jnewblk(jnewblk) } /* - * Cancel a jnewblk which has been superseded by a freeblk. The jnewblk - * is kept linked into the bmsafemap until the free completes, thus - * preventing the modified state from ever reaching disk. The free - * routine must pass this structure via ffs_blkfree() to - * softdep_setup_freeblks() so there is no race in releasing the space. + * Cancel a jnewblk which has been been made redundant by frag extension. */ static void cancel_jnewblk(jnewblk, wkhd) @@ -3756,7 +3947,7 @@ cancel_jnewblk(jnewblk, wkhd) if (jnewblk->jn_state & IOSTARTED) { jnewblk->jn_state &= ~IOSTARTED; WORKLIST_REMOVE(&jnewblk->jn_list); - WORKLIST_INSERT(wkhd, &jsegdep->jd_list); + jwork_insert(wkhd, jsegdep); } else { free_jsegdep(jsegdep); remove_from_journal(&jnewblk->jn_list); @@ -3792,11 +3983,8 @@ free_jseg(jseg, jblocks) * Free freework structures that were lingering to indicate freed * indirect blocks that forced journal write ordering on reallocate. */ - while ((freework = LIST_FIRST(&jseg->js_indirs)) != NULL) { - LIST_REMOVE(freework, fw_next); - WORKLIST_REMOVE(&freework->fw_list); - WORKITEM_FREE(freework, D_FREEWORK); - } + while ((freework = LIST_FIRST(&jseg->js_indirs)) != NULL) + indirblk_remove(freework); if (jblocks->jb_oldestseg == jseg) jblocks->jb_oldestseg = TAILQ_NEXT(jseg, js_next); TAILQ_REMOVE(&jblocks->jb_segs, jseg, js_next); @@ -3928,68 +4116,6 @@ inodedep_lookup_ip(ip) } /* - * Create a journal entry that describes a truncate that we're about to - * perform. The inode allocations and frees between here and the completion - * of the operation are done asynchronously and without journaling. At - * the end of the operation the vnode is sync'd and the journal space - * is released. Recovery will discover the partially completed truncate - * and complete it. - */ -void * -softdep_setup_trunc(vp, length, flags) - struct vnode *vp; - off_t length; - int flags; -{ - struct jsegdep *jsegdep; - struct jtrunc *jtrunc; - struct ufsmount *ump; - struct inode *ip; - - softdep_prealloc(vp, MNT_WAIT); - ip = VTOI(vp); - ump = VFSTOUFS(vp->v_mount); - jtrunc = malloc(sizeof(*jtrunc), M_JTRUNC, M_SOFTDEP_FLAGS); - workitem_alloc(&jtrunc->jt_list, D_JTRUNC, vp->v_mount); - jsegdep = jtrunc->jt_jsegdep = newjsegdep(&jtrunc->jt_list); - jtrunc->jt_ino = ip->i_number; - jtrunc->jt_extsize = 0; - jtrunc->jt_size = length; - if ((flags & IO_EXT) == 0 && ump->um_fstype == UFS2) - jtrunc->jt_extsize = ip->i_din2->di_extsize; - if ((flags & IO_NORMAL) == 0) - jtrunc->jt_size = DIP(ip, i_size); - ACQUIRE_LOCK(&lk); - add_to_journal(&jtrunc->jt_list); - while (jsegdep->jd_seg == NULL) { - stat_jwait_freeblks++; - jwait(&jtrunc->jt_list); - } - FREE_LOCK(&lk); - - return (jsegdep); -} - -/* - * After synchronous truncation is complete we free sync the vnode and - * release the jsegdep so the journal space can be freed. - */ -int -softdep_complete_trunc(vp, cookie) - struct vnode *vp; - void *cookie; -{ - int error; - - error = ffs_syncvnode(vp, MNT_WAIT); - ACQUIRE_LOCK(&lk); - free_jsegdep((struct jsegdep *)cookie); - FREE_LOCK(&lk); - - return (error); -} - -/* * Called prior to creating a new inode and linking it to a directory. The * jaddref structure must already be allocated by softdep_setup_inomapdep * and it is discovered here so we can initialize the mode and update @@ -4523,6 +4649,8 @@ bmsafemap_lookup(mp, bp, cg) LIST_INIT(&bmsafemap->sm_newblkwr); LIST_INIT(&bmsafemap->sm_jaddrefhd); LIST_INIT(&bmsafemap->sm_jnewblkhd); + LIST_INIT(&bmsafemap->sm_freehd); + LIST_INIT(&bmsafemap->sm_freewr); ACQUIRE_LOCK(&lk); if (bmsafemap_find(bmsafemaphd, mp, cg, &collision) == 1) { WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); @@ -4530,6 +4658,7 @@ bmsafemap_lookup(mp, bp, cg) } bmsafemap->sm_cg = cg; LIST_INSERT_HEAD(bmsafemaphd, bmsafemap, sm_hash); + LIST_INSERT_HEAD(&VFSTOUFS(mp)->softdep_dirtycg, bmsafemap, sm_next); WORKLIST_INSERT(&bp->b_dep, &bmsafemap->sm_list); return (bmsafemap); } @@ -4814,9 +4943,8 @@ allocdirect_merge(adphead, newadp, oldadp) &oldadp->ad_block.nb_jnewblk->jn_list, &newadp->ad_block.nb_jwork); oldadp->ad_block.nb_jnewblk = NULL; - if (cancel_newblk(&oldadp->ad_block, NULL, - &newadp->ad_block.nb_jwork)) - panic("allocdirect_merge: Unexpected dependency."); + cancel_newblk(&oldadp->ad_block, NULL, + &newadp->ad_block.nb_jwork); } else { wk = (struct worklist *) cancel_newblk(&oldadp->ad_block, &freefrag->ff_list, &freefrag->ff_jwork); @@ -5084,6 +5212,7 @@ newallocindir(ip, ptrno, newblkno, oldblkno, lbn) aip = (struct allocindir *)newblk; aip->ai_offset = ptrno; aip->ai_oldblkno = oldblkno; + aip->ai_lbn = lbn; if ((jnewblk = newblk->nb_jnewblk) != NULL) { jnewblk->jn_ino = ip->i_number; jnewblk->jn_lbn = lbn; @@ -5110,6 +5239,7 @@ softdep_setup_allocindir_page(ip, lbn, bp, ptrno, struct buf *nbp; /* buffer holding allocated page */ { struct inodedep *inodedep; + struct freefrag *freefrag; struct allocindir *aip; struct pagedep *pagedep; struct mount *mp; @@ -5130,8 +5260,10 @@ softdep_setup_allocindir_page(ip, lbn, bp, ptrno, pagedep_lookup(mp, ip->i_number, lbn, DEPALLOC, &pagedep) == 0) WORKLIST_INSERT(&nbp->b_dep, &pagedep->pd_list); WORKLIST_INSERT(&nbp->b_dep, &aip->ai_block.nb_list); - setup_allocindir_phase2(bp, ip, inodedep, aip, lbn); + freefrag = setup_allocindir_phase2(bp, ip, inodedep, aip, lbn); FREE_LOCK(&lk); + if (freefrag) + handle_workitem_freefrag(freefrag); } /* @@ -5155,7 +5287,8 @@ softdep_setup_allocindir_meta(nbp, ip, bp, ptrno, aip = newallocindir(ip, ptrno, newblkno, 0, lbn); inodedep_lookup(UFSTOVFS(ip->i_ump), ip->i_number, DEPALLOC, &inodedep); WORKLIST_INSERT(&nbp->b_dep, &aip->ai_block.nb_list); - setup_allocindir_phase2(bp, ip, inodedep, aip, lbn); + if (setup_allocindir_phase2(bp, ip, inodedep, aip, lbn)) + panic("softdep_setup_allocindir_meta: Block already existed"); FREE_LOCK(&lk); } @@ -5166,7 +5299,7 @@ indirdep_complete(indirdep) struct allocindir *aip; LIST_REMOVE(indirdep, ir_next); - indirdep->ir_state &= ~ONDEPLIST; + indirdep->ir_state |= DEPCOMPLETE; while ((aip = LIST_FIRST(&indirdep->ir_completehd)) != NULL) { LIST_REMOVE(aip, ai_next); @@ -5181,127 +5314,135 @@ indirdep_complete(indirdep) free_indirdep(indirdep); } -/* - * Called to finish the allocation of the "aip" allocated - * by one of the two routines above. - */ -static void -setup_allocindir_phase2(bp, ip, inodedep, aip, lbn) - struct buf *bp; /* in-memory copy of the indirect block */ - struct inode *ip; /* inode for file being extended */ - struct inodedep *inodedep; /* Inodedep for ip */ - struct allocindir *aip; /* allocindir allocated by the above routines */ - ufs_lbn_t lbn; /* Logical block number for this block. */ +static struct indirdep * +indirdep_lookup(mp, ip, bp) + struct mount *mp; + struct inode *ip; + struct buf *bp; { + struct indirdep *indirdep, *newindirdep; + struct newblk *newblk; struct worklist *wk; struct fs *fs; - struct newblk *newblk; - struct indirdep *indirdep, *newindirdep; - struct allocindir *oldaip; - struct freefrag *freefrag; - struct mount *mp; ufs2_daddr_t blkno; - mp = UFSTOVFS(ip->i_ump); + mtx_assert(&lk, MA_OWNED); + indirdep = NULL; + newindirdep = NULL; fs = ip->i_fs; - mtx_assert(&lk, MA_OWNED); - if (bp->b_lblkno >= 0) - panic("setup_allocindir_phase2: not indir blk"); - for (freefrag = NULL, indirdep = NULL, newindirdep = NULL; ; ) { + for (;;) { LIST_FOREACH(wk, &bp->b_dep, wk_list) { if (wk->wk_type != D_INDIRDEP) continue; indirdep = WK_INDIRDEP(wk); break; } - if (indirdep == NULL && newindirdep) { - indirdep = newindirdep; - newindirdep = NULL; - WORKLIST_INSERT(&bp->b_dep, &indirdep->ir_list); - if (newblk_lookup(mp, dbtofsb(fs, bp->b_blkno), 0, - &newblk)) { - indirdep->ir_state |= ONDEPLIST; - LIST_INSERT_HEAD(&newblk->nb_indirdeps, - indirdep, ir_next); - } else - indirdep->ir_state |= DEPCOMPLETE; - } - if (indirdep) { - aip->ai_indirdep = indirdep; - /* - * Check to see if there is an existing dependency - * for this block. If there is, merge the old - * dependency into the new one. This happens - * as a result of reallocblk only. - */ - if (aip->ai_oldblkno == 0) - oldaip = NULL; - else - - LIST_FOREACH(oldaip, &indirdep->ir_deplisthd, - ai_next) - if (oldaip->ai_offset == aip->ai_offset) - break; - if (oldaip != NULL) - freefrag = allocindir_merge(aip, oldaip); - LIST_INSERT_HEAD(&indirdep->ir_deplisthd, aip, ai_next); - KASSERT(aip->ai_offset >= 0 && - aip->ai_offset < NINDIR(ip->i_ump->um_fs), - ("setup_allocindir_phase2: Bad offset %d", - aip->ai_offset)); - KASSERT(indirdep->ir_savebp != NULL, - ("setup_allocindir_phase2 NULL ir_savebp")); - if (ip->i_ump->um_fstype == UFS1) - ((ufs1_daddr_t *)indirdep->ir_savebp->b_data) - [aip->ai_offset] = aip->ai_oldblkno; - else - ((ufs2_daddr_t *)indirdep->ir_savebp->b_data) - [aip->ai_offset] = aip->ai_oldblkno; - FREE_LOCK(&lk); - if (freefrag != NULL) - handle_workitem_freefrag(freefrag); - } else - FREE_LOCK(&lk); - if (newindirdep) { - newindirdep->ir_savebp->b_flags |= B_INVAL | B_NOCACHE; - brelse(newindirdep->ir_savebp); - ACQUIRE_LOCK(&lk); - WORKITEM_FREE((caddr_t)newindirdep, D_INDIRDEP); - if (indirdep) - break; - FREE_LOCK(&lk); - } - if (indirdep) { - ACQUIRE_LOCK(&lk); + /* Found on the buffer worklist, no new structure to free. */ + if (indirdep != NULL && newindirdep == NULL) + return (indirdep); + if (indirdep != NULL && newindirdep != NULL) + panic("indirdep_lookup: simultaneous create"); + /* None found on the buffer and a new structure is ready. */ + if (indirdep == NULL && newindirdep != NULL) break; - } + /* None found and no new structure available. */ + FREE_LOCK(&lk); newindirdep = malloc(sizeof(struct indirdep), - M_INDIRDEP, M_SOFTDEP_FLAGS); + M_INDIRDEP, M_SOFTDEP_FLAGS); workitem_alloc(&newindirdep->ir_list, D_INDIRDEP, mp); newindirdep->ir_state = ATTACHED; if (ip->i_ump->um_fstype == UFS1) newindirdep->ir_state |= UFS1FMT; + TAILQ_INIT(&newindirdep->ir_trunc); newindirdep->ir_saveddata = NULL; LIST_INIT(&newindirdep->ir_deplisthd); LIST_INIT(&newindirdep->ir_donehd); LIST_INIT(&newindirdep->ir_writehd); LIST_INIT(&newindirdep->ir_completehd); - LIST_INIT(&newindirdep->ir_jwork); - LIST_INIT(&newindirdep->ir_jnewblkhd); if (bp->b_blkno == bp->b_lblkno) { ufs_bmaparray(bp->b_vp, bp->b_lblkno, &blkno, bp, NULL, NULL); bp->b_blkno = blkno; } + newindirdep->ir_freeblks = NULL; newindirdep->ir_savebp = getblk(ip->i_devvp, bp->b_blkno, bp->b_bcount, 0, 0, 0); + newindirdep->ir_bp = bp; BUF_KERNPROC(newindirdep->ir_savebp); + BUF_NOREC(newindirdep->ir_savebp); bcopy(bp->b_data, newindirdep->ir_savebp->b_data, bp->b_bcount); ACQUIRE_LOCK(&lk); } + indirdep = newindirdep; + WORKLIST_INSERT(&bp->b_dep, &indirdep->ir_list); + /* + * If the block is not yet allocated we don't set DEPCOMPLETE so + * that we don't free dependencies until the pointers are valid. + * This could search b_dep for D_ALLOCDIRECT/D_ALLOCINDIR rather + * than using the hash. + */ + if (newblk_lookup(mp, dbtofsb(fs, bp->b_blkno), 0, &newblk)) + LIST_INSERT_HEAD(&newblk->nb_indirdeps, indirdep, ir_next); + else + indirdep->ir_state |= DEPCOMPLETE; + return (indirdep); } /* + * Called to finish the allocation of the "aip" allocated + * by one of the two routines above. + */ +static struct freefrag * +setup_allocindir_phase2(bp, ip, inodedep, aip, lbn) + struct buf *bp; /* in-memory copy of the indirect block */ + struct inode *ip; /* inode for file being extended */ + struct inodedep *inodedep; /* Inodedep for ip */ + struct allocindir *aip; /* allocindir allocated by the above routines */ + ufs_lbn_t lbn; /* Logical block number for this block. */ +{ + struct fs *fs; + struct indirdep *indirdep; + struct allocindir *oldaip; + struct freefrag *freefrag; + struct mount *mp; + + mtx_assert(&lk, MA_OWNED); + mp = UFSTOVFS(ip->i_ump); + fs = ip->i_fs; + if (bp->b_lblkno >= 0) + panic("setup_allocindir_phase2: not indir blk"); + KASSERT(aip->ai_offset >= 0 && aip->ai_offset < NINDIR(fs), + ("setup_allocindir_phase2: Bad offset %d", aip->ai_offset)); + indirdep = indirdep_lookup(mp, ip, bp); + KASSERT(indirdep->ir_savebp != NULL, + ("setup_allocindir_phase2 NULL ir_savebp")); + aip->ai_indirdep = indirdep; + /* + * Check for an unwritten dependency for this indirect offset. If + * there is, merge the old dependency into the new one. This happens + * as a result of reallocblk only. + */ + freefrag = NULL; + if (aip->ai_oldblkno != 0) { + LIST_FOREACH(oldaip, &indirdep->ir_deplisthd, ai_next) { + if (oldaip->ai_offset == aip->ai_offset) { + freefrag = allocindir_merge(aip, oldaip); + goto done; + } + } + LIST_FOREACH(oldaip, &indirdep->ir_donehd, ai_next) { + if (oldaip->ai_offset == aip->ai_offset) { + freefrag = allocindir_merge(aip, oldaip); + goto done; + } + } + } +done: + LIST_INSERT_HEAD(&indirdep->ir_deplisthd, aip, ai_next); + return (freefrag); +} + +/* * Merge two allocindirs which refer to the same block. Move newblock * dependencies and setup the freefrags appropriately. */ @@ -5363,7 +5504,7 @@ setup_freedirect(freeblks, ip, i, needj) DIP_SET(ip, i_db[i], 0); frags = sblksize(ip->i_fs, ip->i_size, i); frags = numfrags(ip->i_fs, frags); - newfreework(ip->i_ump, freeblks, NULL, i, blkno, frags, needj); + newfreework(ip->i_ump, freeblks, NULL, i, blkno, frags, 0, needj); } static inline void @@ -5382,15 +5523,15 @@ setup_freeext(freeblks, ip, i, needj) ip->i_din2->di_extb[i] = 0; frags = sblksize(ip->i_fs, ip->i_din2->di_extsize, i); frags = numfrags(ip->i_fs, frags); - newfreework(ip->i_ump, freeblks, NULL, -1 - i, blkno, frags, needj); + newfreework(ip->i_ump, freeblks, NULL, -1 - i, blkno, frags, 0, needj); } static inline void setup_freeindir(freeblks, ip, i, lbn, needj) struct freeblks *freeblks; struct inode *ip; + int i; ufs_lbn_t lbn; - int i; int needj; { ufs2_daddr_t blkno; @@ -5400,7 +5541,7 @@ setup_freeindir(freeblks, ip, i, lbn, needj) return; DIP_SET(ip, i_ib[i], 0); newfreework(ip->i_ump, freeblks, NULL, lbn, blkno, ip->i_fs->fs_frag, - needj); + 0, needj); } static inline struct freeblks * @@ -5415,16 +5556,529 @@ newfreeblks(mp, ip) workitem_alloc(&freeblks->fb_list, D_FREEBLKS, mp); LIST_INIT(&freeblks->fb_jfreeblkhd); LIST_INIT(&freeblks->fb_jwork); + freeblks->fb_ref = 1; + freeblks->fb_jtrunc = NULL; freeblks->fb_state = ATTACHED; freeblks->fb_uid = ip->i_uid; - freeblks->fb_previousinum = ip->i_number; + freeblks->fb_inum = ip->i_number; + freeblks->fb_modrev = DIP(ip, i_modrev); freeblks->fb_devvp = ip->i_devvp; freeblks->fb_chkcnt = 0; + freeblks->fb_freecnt = 0; + freeblks->fb_len = 0; return (freeblks); } +static void +trunc_indirdep(indirdep, freeblks, bp, off) + struct indirdep *indirdep; + struct freeblks *freeblks; + struct buf *bp; + int off; +{ + struct allocindir *aip, *aipn; + + /* + * The first set of allocindirs won't be in savedbp. + */ + LIST_FOREACH_SAFE(aip, &indirdep->ir_deplisthd, ai_next, aipn) + if (aip->ai_offset > off) + cancel_allocindir(aip, bp, freeblks, 1); + LIST_FOREACH_SAFE(aip, &indirdep->ir_donehd, ai_next, aipn) + if (aip->ai_offset > off) + cancel_allocindir(aip, bp, freeblks, 1); + /* + * These will exist in savedbp. + */ + LIST_FOREACH_SAFE(aip, &indirdep->ir_writehd, ai_next, aipn) + if (aip->ai_offset > off) + cancel_allocindir(aip, NULL, freeblks, 0); + LIST_FOREACH_SAFE(aip, &indirdep->ir_completehd, ai_next, aipn) + if (aip->ai_offset > off) + cancel_allocindir(aip, NULL, freeblks, 0); +} + /* + * Follow the chain of indirects down to lastlbn creating a freework + * structure for each. This will be used to start indir_trunc() at + * the right offset and create the journal records for the parrtial + * truncation. A second step will handle the truncated dependencies. + */ +static int +setup_trunc_indir(freeblks, ip, lbn, lastlbn, blkno, needj) + struct freeblks *freeblks; + struct inode *ip; + ufs_lbn_t lbn; + ufs_lbn_t lastlbn; + ufs2_daddr_t blkno; + int needj; +{ + struct indirdep *indirdep; + struct indirdep *indirn; + struct freework *freework; + struct newblk *newblk; + struct mount *mp; + struct buf *bp; + uint8_t *start; + uint8_t *end; + ufs_lbn_t lbnadd; + int level; + int error; + int off; + + + freework = NULL; + if (blkno == 0) + return (0); + mp = freeblks->fb_list.wk_mp; + bp = getblk(ITOV(ip), lbn, mp->mnt_stat.f_iosize, 0, 0, 0); + if ((bp->b_flags & B_CACHE) == 0) { + bp->b_blkno = blkptrtodb(VFSTOUFS(mp), blkno); + bp->b_iocmd = BIO_READ; + bp->b_flags &= ~B_INVAL; + bp->b_ioflags &= ~BIO_ERROR; + vfs_busy_pages(bp, 0); + bp->b_iooffset = dbtob(bp->b_blkno); + bstrategy(bp); + curthread->td_ru.ru_inblock++; + error = bufwait(bp); + if (error) { + brelse(bp); + return (error); + } + } + level = lbn_level(lbn); + lbnadd = lbn_offset(ip->i_fs, level); + /* + * Compute the offset of the last block we want to keep. Store + * in the freework the first block we want to completely free. + */ + off = (lastlbn - -(lbn + level)) / lbnadd; + if (off + 1 == NINDIR(ip->i_fs)) + goto nowork; + freework = newfreework(ip->i_ump, freeblks, NULL, lbn, blkno, 0, off+1, + needj); + /* + * Link the freework into the indirdep. This will prevent any new + * allocations from proceeding until we are finished with the + * truncate and the block is written. + */ + ACQUIRE_LOCK(&lk); + indirdep = indirdep_lookup(mp, ip, bp); + TAILQ_INSERT_TAIL(&indirdep->ir_trunc, freework, fw_next); + freework->fw_indir = indirdep; + /* + * Cancel any allocindirs that will not make it to disk. + * We have to do this for all copies of the indirdep that + * live on this newblk. + */ + if ((indirdep->ir_state & DEPCOMPLETE) == 0) { + newblk_lookup(mp, dbtofsb(ip->i_fs, bp->b_blkno), 0, &newblk); + LIST_FOREACH(indirn, &newblk->nb_indirdeps, ir_next) + trunc_indirdep(indirn, freeblks, bp, off); + } else + trunc_indirdep(indirdep, freeblks, bp, off); + FREE_LOCK(&lk); + /* + * Creation is protected by the buf lock. The saveddata is only + * needed if a full truncation follows a partial truncation but it + * is difficult to allocate in that case so we fetch it anyway. + */ + if (indirdep->ir_saveddata == NULL); + indirdep->ir_saveddata = malloc(bp->b_bcount, M_INDIRDEP, + M_SOFTDEP_FLAGS); +nowork: + /* Fetch the blkno of the child and the zero start offset. */ + if (ip->i_ump->um_fstype == UFS1) { + blkno = ((ufs1_daddr_t *)bp->b_data)[off]; + start = (uint8_t *)&((ufs1_daddr_t *)bp->b_data)[off+1]; + } else { + blkno = ((ufs2_daddr_t *)bp->b_data)[off]; + start = (uint8_t *)&((ufs2_daddr_t *)bp->b_data)[off+1]; + } + if (freework) { + /* Zero the truncated pointers. */ + end = bp->b_data + bp->b_bcount; + bzero(start, end - start); + bdwrite(bp); + } else + bqrelse(bp); + if (level == 0) + return (0); + lbn++; /* adjust level */ + lbn -= (off * lbnadd); + return setup_trunc_indir(freeblks, ip, lbn, lastlbn, blkno, needj); +} + +/* + * Complete the partial truncation of an indirect block setup by + * setup_trunc_indir(). This zeros the truncated pointers in the saved + * copy and writes them to disk before the freeblks is allowed to complete. + */ +static void +complete_trunc_indir(freework) + struct freework *freework; +{ + struct indirdep *indirdep; + struct buf *bp; + uintptr_t start; + int count; + + indirdep = freework->fw_indir; + freework->fw_state |= DEPCOMPLETE; + do { + bp = indirdep->ir_bp; + /* See if the block was discarded. */ + if (bp == NULL) + break; + } while ((bp = getdirtybuf(bp, &lk, MNT_WAIT)) == NULL); + TAILQ_REMOVE(&indirdep->ir_trunc, freework, fw_next); + /* + * Zero the pointers in the saved copy. + */ + if (indirdep->ir_state & UFS1FMT) + start = sizeof(ufs1_daddr_t); + else + start = sizeof(ufs2_daddr_t); + start *= freework->fw_start; + count = indirdep->ir_savebp->b_bcount - start; + start += (uintptr_t)indirdep->ir_savebp->b_data; + bzero((char *)start, count); + /* + * If bp is NULL the block was fully truncated, restore the saved + * block list otherwise free it if it is no longer needed. + */ + if (TAILQ_EMPTY(&indirdep->ir_trunc)) { + if (bp == NULL) + bcopy(indirdep->ir_saveddata, + indirdep->ir_savebp->b_data, + indirdep->ir_savebp->b_bcount); + free(indirdep->ir_saveddata, M_INDIRDEP); + indirdep->ir_saveddata = 0; + } + /* + * When bp is NULL there is a full truncation pending. We + * must wait for this full truncation to be journaled before + * we can release this freework because the disk pointers will + * never be written as zero. + */ + if (bp == NULL) { + if (LIST_EMPTY(&indirdep->ir_freeblks->fb_jfreeblkhd)) { + handle_written_freework(freework); + return; + } + freework->fw_state |= ONDEPLIST; + WORKLIST_INSERT(&indirdep->ir_freeblks->fb_freeworkhd, + &freework->fw_list); + return; + } + /* Complete when the real copy is written. */ + WORKLIST_INSERT(&bp->b_dep, &freework->fw_list); + FREE_LOCK(&lk); + bqrelse(bp); + ACQUIRE_LOCK(&lk); + return; +} + +/* + * Handle freeblocks for journaled softupdate filesystems. + * + * Contrary to normal softupdates, we must preserve the block pointers in + * indirects until their subordinates are free. This is to avoid journaling + * every block that is freed which may consume more space than the journal + * itself. The recovery program will see the free block journals at the + * base of the truncated area and traverse them to reclaim space. The + * pointers in the inode may be cleared immediately after the journal + * records are written because each direct and indirect pointer in the + * inode is recorded in a journal. This permits full truncation to proceed + * asynchronously. The write order is journal -> inode -> cgs -> indirects. + * + * The algorithm is as follows: + * 1) Traverse the in-memory state and create journal entries to release + * the relevant blocks and full indirect trees. + * 2) Traverse the indirect block chain adding partial truncation freework + * records to indirects in the path to lastlbn. The freework will + * prevent new allocation dependencies from being satisfied in this + * indirect until the truncation completes. + * 3) Read and lock the inode block, performing an update with the new size + * and pointers. This prevents truncated data from becoming valid on + * disk through step 4. + * 4) Reap unsatisfied dependencies that are beyond the truncated area, + * eliminate journal work for those records that do not require it. + * 5) Schedule the journal records to be written followed by the inode block. + * 6) Allocate any necessary frags for the end of file. + * 7) Zero any partially truncated blocks. + * + * From this truncation proceeds asynchronously using the freework and + * indir_trunc machinery. The file will not be extended again into a + * partially truncated indirect block until all work is completed but + * the normal dependency mechanism ensures that it is rolled back/forward + * as appropriate. Further truncation may occur without delay and is + * serialized in indir_trunc(). + */ +void +softdep_journal_freeblocks(ip, cred, length, flags) + struct inode *ip; /* The inode whose length is to be reduced */ + struct ucred *cred; + off_t length; /* The new length for the file */ + int flags; /* IO_EXT and/or IO_NORMAL */ +{ + struct freeblks *freeblks, *fbn; + struct inodedep *inodedep; + struct jfreeblk *jfreeblk; + struct allocdirect *adp, *adpn; + struct fs *fs; + struct buf *bp; + struct vnode *vp; + ufs2_daddr_t extblocks, datablocks; + struct mount *mp; + ufs_lbn_t tmpval, lbn, lastlbn, partlbn; + off_t osize; + int frags; + int lastoff, iboff; + int allocblock; + int error, i; + int partlvl; + int needj; + + fs = ip->i_fs; + mp = UFSTOVFS(ip->i_ump); + vp = ITOV(ip); + needj = 1; + lastoff = 0; + iboff = -1; + allocblock = 0; + extblocks = 0; + datablocks = 0; + partlbn = 0; + partlvl = 0; + osize = 0; + frags = 0; + freeblks = newfreeblks(mp, ip); + ACQUIRE_LOCK(&lk); + /* + * If we're truncating a removed file that will never be written + * we don't need to journal the block frees. The canceled journals + * for the allocations will suffice. + */ + inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); + if ((inodedep->id_state & (UNLINKED | DEPCOMPLETE)) == UNLINKED && + length == 0) + needj = 0; + FREE_LOCK(&lk); + /* + * Calculate the lbn that we are truncating to. This results in -1 + * if we're truncating the 0 bytes. So it is the last lbn we want + * to keep, not the first lbn we want to truncate. + */ + lastlbn = lblkno(fs, length + fs->fs_bsize - 1) - 1; + /* + * Compute frags we are keeping in lastlbn. 0 means all. + */ + if (lastlbn >= 0 && lastlbn < NDADDR) { + lastoff = blkoff(fs, length); + frags = fragroundup(fs, lastoff); + /* adp offset of last valid allocdirect. */ + iboff = lastlbn; + } + if (fs->fs_magic == FS_UFS2_MAGIC) + extblocks = btodb(fragroundup(fs, ip->i_din2->di_extsize)); + /* + * Handle normal data blocks and indirects. This section saves + * values used after the inode update to complete frag and indirect + * truncation. + */ + if ((flags & IO_NORMAL) != 0) { + /* + * Handle truncation of whole direct and indirect blocks. + */ + for (i = 0; i < NDADDR; i++) + if (i > lastlbn) + setup_freedirect(freeblks, ip, i, needj); + for (i = 0, tmpval = NINDIR(fs), lbn = NDADDR; i < NIADDR; + i++, lbn += tmpval, tmpval *= NINDIR(fs)) { + /* Release a whole indirect tree. */ + if (lbn > lastlbn) { + setup_freeindir(freeblks, ip, i, -lbn -i, + needj); + continue; + } + iboff = i + NDADDR; + /* + * Record the level and lbn for a indir needing + * partial truncation. + */ + if (lbn <= lastlbn && lbn + tmpval - 1 > lastlbn) { + partlbn = -lbn - i; + partlvl = i; + } + } + /* + * Traverse partially truncated indirect tree. + */ + if (partlbn) + setup_trunc_indir(freeblks, ip, partlbn, + lastlbn, DIP(ip, i_ib[partlvl]), needj); + osize = ip->i_size; + ip->i_size = length; + /* + * Handle partial truncation to a frag boundary. + */ + if (lastoff) { + ufs2_daddr_t blkno; + long oldfrags; + + oldfrags = blksize(fs, ip, lastlbn); + blkno = DIP(ip, i_db[lastlbn]); + if (blkno && oldfrags != frags) { + oldfrags -= frags; + oldfrags = numfrags(ip->i_fs, oldfrags); + blkno += numfrags(ip->i_fs, frags); + newfreework(ip->i_ump, freeblks, NULL, lastlbn, + blkno, oldfrags, 0, needj); + } else if (blkno == 0) { + ip->i_size = length - lastoff; + allocblock = 1; + } + } + DIP_SET(ip, i_size, ip->i_size); + if (length == 0) + datablocks = DIP(ip, i_blocks) - extblocks; + freeblks->fb_len = length; + } + if ((flags & IO_EXT) != 0) { + for (i = 0; i < NXADDR; i++) + setup_freeext(freeblks, ip, i, needj); + ip->i_din2->di_extsize = 0; + datablocks += extblocks; + } + freeblks->fb_chkcnt = datablocks; + UFS_LOCK(ip->i_ump); + fs->fs_pendingblocks += datablocks; + UFS_UNLOCK(ip->i_ump); + DIP_SET(ip, i_blocks, DIP(ip, i_blocks) - datablocks); + /* + * Handle truncation of incomplete alloc direct dependencies. We + * hold the inode block locked to prevent incomplete dependencies + * from reaching the disk while we are eliminating those that + * have been truncated. This is a partially inlined ffs_update(). + */ + ufs_itimes(vp); + ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED); + error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), + (int)fs->fs_bsize, cred, &bp); + if (error) { + brelse(bp); + softdep_error("softdep_journal_freeblocks", error); + return; + } + if (bp->b_bufsize == fs->fs_bsize) + bp->b_flags |= B_CLUSTEROK; + softdep_update_inodeblock(ip, bp, 0); + if (ip->i_ump->um_fstype == UFS1) + *((struct ufs1_dinode *)bp->b_data + + ino_to_fsbo(fs, ip->i_number)) = *ip->i_din1; + else + *((struct ufs2_dinode *)bp->b_data + + ino_to_fsbo(fs, ip->i_number)) = *ip->i_din2; + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); + if ((inodedep->id_state & IOSTARTED) != 0) + panic("softdep_setup_freeblocks: inode busy"); + /* + * Add the freeblks structure to the list of operations that + * must await the zero'ed inode being written to disk. If we + * still have a bitmap dependency (needj), then the inode + * has never been written to disk, so we can process the + * freeblks below once we have deleted the dependencies. + */ + if (needj) + WORKLIST_INSERT(&bp->b_dep, &freeblks->fb_list); + else + freeblks->fb_state |= COMPLETE; + if (flags & IO_NORMAL) { + TAILQ_FOREACH_SAFE(adp, &inodedep->id_inoupdt, ad_next, adpn) { + if (adp->ad_offset > iboff) + cancel_allocdirect(&inodedep->id_inoupdt, adp, + freeblks); + /* + * Truncate the allocdirect. We could eliminate + * or modify journal records as well. + */ + else if (adp->ad_offset == iboff && lastoff) + adp->ad_newsize = frags; + } + } + if (flags & IO_EXT) + while ((adp = TAILQ_FIRST(&inodedep->id_extupdt)) != 0) + cancel_allocdirect(&inodedep->id_extupdt, adp, + freeblks); + /* + * Add journal work. + */ + LIST_FOREACH(jfreeblk, &freeblks->fb_jfreeblkhd, jf_deps) + add_to_journal(&jfreeblk->jf_list); + FREE_LOCK(&lk); + bdwrite(bp); + /* + * Truncate dependency structures beyond length. + */ + trunc_dependencies(ip, freeblks, lastlbn, frags, flags); + /* + * This is only set when we need to allocate a fragment because + * none existed at the end of a frag-sized file. It handles only + * allocating a new, zero filled block. + */ + if (allocblock) { + error = UFS_BALLOC(vp, length - 1, 1, cred, BA_CLRBUF, &bp); + if (error != 0) { + softdep_error("softdep_journal_freeblks", error); + return; + } + ip->i_size = length; + DIP_SET(ip, i_size, length); + ip->i_flag |= IN_CHANGE | IN_UPDATE; + allocbuf(bp, frags); + bawrite(bp); + /* + * Zero the end of a truncated frag or block. + */ + } else if (lastoff != 0 && vp->v_type != VDIR) { + int size; + + size = sblksize(fs, osize, lastlbn); + error = bread(vp, lastlbn, size, cred, &bp); + if (error) { + softdep_error("softdep_journal_freeblks", error); + return; + } + bzero((char *)bp->b_data + lastoff, size - lastoff); + size = sblksize(fs, length, lastlbn); + allocbuf(bp, size); + bawrite(bp); + + } + ACQUIRE_LOCK(&lk); + inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); + TAILQ_INSERT_TAIL(&inodedep->id_freeblklst, freeblks, fb_next); + freeblks->fb_state |= DEPCOMPLETE | ONDEPLIST; + /* + * We zero earlier truncations so they don't erroneously + * update i_blocks. + */ + if (freeblks->fb_len == 0) + TAILQ_FOREACH(fbn, &inodedep->id_freeblklst, fb_next) + fbn->fb_len = 0; + if ((freeblks->fb_state & ALLCOMPLETE) != ALLCOMPLETE || + !LIST_EMPTY(&freeblks->fb_jfreeblkhd)) + freeblks = NULL; + FREE_LOCK(&lk); + if (freeblks) + handle_workitem_freeblocks(freeblks, 0); +} + +/* * Block de-allocation dependencies. * * When blocks are de-allocated, the on-disk pointers must be nullified before @@ -5464,7 +6118,6 @@ softdep_setup_freeblocks(ip, length, flags) struct freeblks *freeblks; struct inodedep *inodedep; struct allocdirect *adp; - struct jfreeblk *jfreeblk; struct buf *bp; struct fs *fs; ufs2_daddr_t extblocks, datablocks; @@ -5472,52 +6125,37 @@ softdep_setup_freeblocks(ip, length, flags) int i, delay, error; ufs_lbn_t tmpval; ufs_lbn_t lbn; - int needj; fs = ip->i_fs; mp = UFSTOVFS(ip->i_ump); if (length != 0) panic("softdep_setup_freeblocks: non-zero length"); freeblks = newfreeblks(mp, ip); - ACQUIRE_LOCK(&lk); - /* - * If we're truncating a removed file that will never be written - * we don't need to journal the block frees. The canceled journals - * for the allocations will suffice. - */ - inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); - if ((inodedep->id_state & (UNLINKED | DEPCOMPLETE)) == UNLINKED || - (fs->fs_flags & FS_SUJ) == 0) - needj = 0; - else - needj = 1; - FREE_LOCK(&lk); extblocks = 0; + datablocks = 0; if (fs->fs_magic == FS_UFS2_MAGIC) extblocks = btodb(fragroundup(fs, ip->i_din2->di_extsize)); - datablocks = DIP(ip, i_blocks) - extblocks; if ((flags & IO_NORMAL) != 0) { for (i = 0; i < NDADDR; i++) - setup_freedirect(freeblks, ip, i, needj); + setup_freedirect(freeblks, ip, i, 0); for (i = 0, tmpval = NINDIR(fs), lbn = NDADDR; i < NIADDR; i++, lbn += tmpval, tmpval *= NINDIR(fs)) - setup_freeindir(freeblks, ip, i, -lbn -i, needj); + setup_freeindir(freeblks, ip, i, -lbn -i, 0); ip->i_size = 0; DIP_SET(ip, i_size, 0); - freeblks->fb_chkcnt = datablocks; - UFS_LOCK(ip->i_ump); - fs->fs_pendingblocks += datablocks; - UFS_UNLOCK(ip->i_ump); + datablocks = DIP(ip, i_blocks) - extblocks; } if ((flags & IO_EXT) != 0) { for (i = 0; i < NXADDR; i++) - setup_freeext(freeblks, ip, i, needj); + setup_freeext(freeblks, ip, i, 0); ip->i_din2->di_extsize = 0; - freeblks->fb_chkcnt += extblocks; + datablocks += extblocks; } - if (LIST_EMPTY(&freeblks->fb_jfreeblkhd)) - needj = 0; - DIP_SET(ip, i_blocks, DIP(ip, i_blocks) - freeblks->fb_chkcnt); + freeblks->fb_chkcnt = datablocks; + UFS_LOCK(ip->i_ump); + fs->fs_pendingblocks += datablocks; + UFS_UNLOCK(ip->i_ump); + DIP_SET(ip, i_blocks, DIP(ip, i_blocks) - datablocks); /* * Push the zero'ed inode to to its disk buffer so that we are free * to delete its dependencies below. Once the dependencies are gone @@ -5557,8 +6195,6 @@ softdep_setup_freeblocks(ip, length, flags) delay = (inodedep->id_state & DEPCOMPLETE); if (delay) WORKLIST_INSERT(&bp->b_dep, &freeblks->fb_list); - else if (needj) - freeblks->fb_state |= COMPLETE; /* * Because the file length has been truncated to zero, any * pending block allocation dependency structures associated @@ -5573,27 +6209,22 @@ softdep_setup_freeblocks(ip, length, flags) &inodedep->id_inoupdt); while ((adp = TAILQ_FIRST(&inodedep->id_inoupdt)) != 0) cancel_allocdirect(&inodedep->id_inoupdt, adp, - freeblks, delay); + freeblks); } if (flags & IO_EXT) { merge_inode_lists(&inodedep->id_newextupdt, &inodedep->id_extupdt); while ((adp = TAILQ_FIRST(&inodedep->id_extupdt)) != 0) cancel_allocdirect(&inodedep->id_extupdt, adp, - freeblks, delay); + freeblks); } - LIST_FOREACH(jfreeblk, &freeblks->fb_jfreeblkhd, jf_deps) - add_to_journal(&jfreeblk->jf_list); - FREE_LOCK(&lk); bdwrite(bp); - softdep_trunc_deps(ITOV(ip), freeblks, 0, 0, flags); + trunc_dependencies(ip, freeblks, -1, 0, flags); ACQUIRE_LOCK(&lk); if (inodedep_lookup(mp, ip->i_number, 0, &inodedep) != 0) (void) free_inodedep(inodedep); - - if (delay || needj) - freeblks->fb_state |= DEPCOMPLETE; + freeblks->fb_state |= DEPCOMPLETE; if (delay) { /* * If the inode with zeroed block pointers is now on disk @@ -5604,17 +6235,15 @@ softdep_setup_freeblocks(ip, length, flags) */ if ((freeblks->fb_state & ALLCOMPLETE) == ALLCOMPLETE) add_to_worklist(&freeblks->fb_list, 1); - } - if (needj && LIST_EMPTY(&freeblks->fb_jfreeblkhd)) - needj = 0; - + } else + freeblks->fb_state |= COMPLETE; FREE_LOCK(&lk); /* - * If the inode has never been written to disk (delay == 0) and - * we're not waiting on any journal writes, then we can process the - * freeblks now that we have deleted the dependencies. + * If the inode has never been written to disk (delay == 0) then + * we can process the freeblks now that we have deleted the + * dependencies. */ - if (!delay && !needj) + if (!delay) handle_workitem_freeblocks(freeblks, 0); } @@ -5622,18 +6251,19 @@ softdep_setup_freeblocks(ip, length, flags) * Eliminate any dependencies that exist in memory beyond lblkno:off */ static void -softdep_trunc_deps(vp, freeblks, lblkno, off, flags) - struct vnode *vp; +trunc_dependencies(ip, freeblks, lastlbn, lastoff, flags) + struct inode *ip; struct freeblks *freeblks; - ufs_lbn_t lblkno; - int off; + ufs_lbn_t lastlbn; + int lastoff; int flags; { - struct inodedep *inodedep; struct bufobj *bo; + struct vnode *vp; struct buf *bp; - struct mount *mp; - ino_t ino; + struct fs *fs; + ufs_lbn_t lbn; + int blkoff; /* * We must wait for any I/O in progress to finish so that @@ -5641,25 +6271,50 @@ static void * Once they are all there, walk the list and get rid of * any dependencies. */ - ino = VTOI(vp)->i_number; - mp = vp->v_mount; + fs = ip->i_fs; + vp = ITOV(ip); bo = &vp->v_bufobj; BO_LOCK(bo); drain_output(vp); + TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs) + bp->b_vflags &= ~BV_SCANNED; restart: TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs) { if (((flags & IO_EXT) == 0 && (bp->b_xflags & BX_ALTDATA)) || ((flags & IO_NORMAL) == 0 && (bp->b_xflags & BX_ALTDATA) == 0)) continue; + if (bp->b_vflags & BV_SCANNED) + continue; + blkoff = 0; + /* + * If this is a partial truncate we only want those + * blocks and indirect blocks that cover the range + * we're after. We handle the partially de-allocated + * indirects in a different pass. + */ + if (lastlbn > -1 && (bp->b_xflags & BX_ALTDATA) == 0) { + lbn = bp->b_lblkno; + if (lbn < 0) + lbn = -(lbn + lbn_level(lbn)); + if (lbn < lastlbn) + continue; + /* Here we only truncate lblkno if it's partial. */ + if (lbn == lastlbn) { + if (lastoff == 0) + continue; + blkoff = lastoff; + } + } if ((bp = getdirtybuf(bp, BO_MTX(bo), MNT_WAIT)) == NULL) goto restart; BO_UNLOCK(bo); ACQUIRE_LOCK(&lk); - (void) inodedep_lookup(mp, ino, 0, &inodedep); - if (deallocate_dependencies(bp, inodedep, freeblks, 0)) + if (deallocate_dependencies(bp, freeblks, blkoff) == 0) bp->b_flags |= B_INVAL | B_NOCACHE; FREE_LOCK(&lk); + if (blkoff) + allocbuf(bp, blkoff); brelse(bp); BO_LOCK(bo); goto restart; @@ -5668,69 +6323,66 @@ restart: } static int -cancel_pagedep(pagedep, inodedep, freeblks) +cancel_pagedep(pagedep, freeblks, blkoff) struct pagedep *pagedep; - struct inodedep *inodedep; struct freeblks *freeblks; + int blkoff; { - struct newdirblk *newdirblk; struct jremref *jremref; struct jmvref *jmvref; - struct dirrem *dirrem; + struct dirrem *dirrem, *tmp; int i; /* - * There should be no directory add dependencies present - * as the directory could not be truncated until all - * children were removed. - */ - KASSERT(LIST_FIRST(&pagedep->pd_pendinghd) == NULL, - ("deallocate_dependencies: pendinghd != NULL")); - for (i = 0; i < DAHASHSZ; i++) - KASSERT(LIST_FIRST(&pagedep->pd_diraddhd[i]) == NULL, - ("deallocate_dependencies: diraddhd != NULL")); - /* * Copy any directory remove dependencies to the list - * to be processed after the zero'ed inode is written. - * If the inode has already been written, then they + * to be processed after the freeblks proceeds. If + * directory entry never made it to disk they * can be dumped directly onto the work list. */ - LIST_FOREACH(dirrem, &pagedep->pd_dirremhd, dm_next) { + LIST_FOREACH_SAFE(dirrem, &pagedep->pd_dirremhd, dm_next, tmp) { + /* Skip this directory removal if it is intended to remain. */ + if (dirrem->dm_offset < blkoff) + continue; /* - * If there are any dirrems we wait for - * the journal write to complete and - * then restart the buf scan as the lock + * If there are any dirrems we wait for the journal write + * to complete and then restart the buf scan as the lock * has been dropped. */ - while ((jremref = LIST_FIRST(&dirrem->dm_jremrefhd)) - != NULL) { + while ((jremref = LIST_FIRST(&dirrem->dm_jremrefhd)) != NULL) { stat_jwait_filepage++; jwait(&jremref->jr_list); return (ERESTART); } LIST_REMOVE(dirrem, dm_next); dirrem->dm_dirinum = pagedep->pd_ino; - if (inodedep == NULL || - (inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) { - dirrem->dm_state |= COMPLETE; - add_to_worklist(&dirrem->dm_list, 0); - } else - WORKLIST_INSERT(&inodedep->id_bufwait, - &dirrem->dm_list); + WORKLIST_INSERT(&freeblks->fb_freeworkhd, &dirrem->dm_list); } - if ((pagedep->pd_state & NEWBLOCK) != 0) { - newdirblk = pagedep->pd_newdirblk; - WORKLIST_REMOVE(&newdirblk->db_list); - free_newdirblk(newdirblk); - } while ((jmvref = LIST_FIRST(&pagedep->pd_jmvrefhd)) != NULL) { stat_jwait_filepage++; jwait(&jmvref->jm_list); return (ERESTART); } - WORKLIST_REMOVE(&pagedep->pd_list); - LIST_REMOVE(pagedep, pd_hash); - WORKITEM_FREE(pagedep, D_PAGEDEP); + /* + * When we're partially truncating a pagedep we just want to flush + * journal entries and return. There can not be any adds in the + * truncated portion of the directory and newblk must remain if + * part of the block remains. + */ + if (blkoff != 0) + return (0); + /* + * There should be no directory add dependencies present + * as the directory could not be truncated until all + * children were removed. + */ + KASSERT(LIST_FIRST(&pagedep->pd_pendinghd) == NULL, + ("deallocate_dependencies: pendinghd != NULL")); + for (i = 0; i < DAHASHSZ; i++) + KASSERT(LIST_FIRST(&pagedep->pd_diraddhd[i]) == NULL, + ("deallocate_dependencies: diraddhd != NULL")); + if ((pagedep->pd_state & NEWBLOCK) != 0) + free_newdirblk(pagedep->pd_newdirblk); + free_pagedep(pagedep); return (0); } @@ -5743,54 +6395,76 @@ static int * all dependencies were cleared, 0 otherwise. */ static int -deallocate_dependencies(bp, inodedep, freeblks, off) +deallocate_dependencies(bp, freeblks, off) struct buf *bp; - struct inodedep *inodedep; struct freeblks *freeblks; int off; { - struct worklist *wk; struct indirdep *indirdep; - struct allocindir *aip; struct pagedep *pagedep; + struct allocdirect *adp; + struct worklist *wk, *wkn; mtx_assert(&lk, MA_OWNED); - while ((wk = LIST_FIRST(&bp->b_dep)) != NULL) { + LIST_FOREACH_SAFE(wk, &bp->b_dep, wk_list, wkn) { switch (wk->wk_type) { - case D_INDIRDEP: indirdep = WK_INDIRDEP(wk); if (bp->b_lblkno >= 0 || bp->b_blkno != indirdep->ir_savebp->b_lblkno) panic("deallocate_dependencies: not indir"); - cancel_indirdep(indirdep, bp, inodedep, freeblks); + cancel_indirdep(indirdep, bp, freeblks); continue; case D_PAGEDEP: pagedep = WK_PAGEDEP(wk); - if (cancel_pagedep(pagedep, inodedep, freeblks)) - return (0); + if (cancel_pagedep(pagedep, freeblks, off)) + return (ERESTART); continue; case D_ALLOCINDIR: - aip = WK_ALLOCINDIR(wk); - cancel_allocindir(aip, inodedep, freeblks); + /* + * Simply remove the allocindir, we'll find it via + * the indirdep where we can clear pointers if + * needed. + */ + WORKLIST_REMOVE(wk); continue; + case D_FREEWORK: + /* + * A truncation is waiting for the zero'd pointers + * to be written. It can be freed when the freeblks + * is journaled. + */ + WORKLIST_REMOVE(wk); + wk->wk_state |= ONDEPLIST; + WORKLIST_INSERT(&freeblks->fb_freeworkhd, wk); + break; + case D_ALLOCDIRECT: - case D_INODEDEP: + adp = WK_ALLOCDIRECT(wk); + if (off != 0) + continue; + /* FALLTHROUGH */ + default: panic("deallocate_dependencies: Unexpected type %s", TYPENAME(wk->wk_type)); /* NOTREACHED */ - - default: - panic("deallocate_dependencies: Unknown type %s", - TYPENAME(wk->wk_type)); - /* NOTREACHED */ } } + /* + * Don't throw away this buf, we were partially truncating and + * some deps will always remain. + */ + if (!LIST_EMPTY(&bp->b_dep)) { + if (off == 0) + panic("deallocate_dependencies: dangling deps"); + bp->b_vflags |= BV_SCANNED; + return (EBUSY); + } - return (1); + return (0); } /* @@ -5800,20 +6474,36 @@ static int * space is no longer pointed to by the inode or in the bitmap. */ static void -cancel_allocdirect(adphead, adp, freeblks, delay) +cancel_allocdirect(adphead, adp, freeblks) struct allocdirectlst *adphead; struct allocdirect *adp; struct freeblks *freeblks; - int delay; { struct freework *freework; struct newblk *newblk; struct worklist *wk; - ufs_lbn_t lbn; TAILQ_REMOVE(adphead, adp, ad_next); newblk = (struct newblk *)adp; + freework = NULL; /* + * Find the correct freework structure. + */ + LIST_FOREACH(wk, &freeblks->fb_freeworkhd, wk_list) { + if (wk->wk_type != D_FREEWORK) + continue; + freework = WK_FREEWORK(wk); + if (freework->fw_blkno == newblk->nb_newblkno) + break; + } + if (freework == NULL) + panic("cancel_allocdirect: Freework not found"); + /* + * If a newblk exists at all we still have the journal entry that + * initiated the allocation so we do not need to journal the free. + */ + cancel_jfreeblk(freeblks, freework->fw_blkno); + /* * If the journal hasn't been written the jnewblk must be passed * to the call to ffs_blkfree that reclaims the space. We accomplish * this by linking the journal dependency into the freework to be @@ -5821,33 +6511,9 @@ static void * been written we can simply reclaim the journal space when the * freeblks work is complete. */ - if (newblk->nb_jnewblk == NULL) { - if (cancel_newblk(newblk, NULL, &freeblks->fb_jwork) != NULL) - panic("cancel_allocdirect: Unexpected dependency"); - goto found; - } - lbn = newblk->nb_jnewblk->jn_lbn; - /* - * Find the correct freework structure so it releases the canceled - * journal when the bitmap is cleared. This preserves rollback - * until the allocation is reverted. - */ - LIST_FOREACH(wk, &freeblks->fb_freeworkhd, wk_list) { - freework = WK_FREEWORK(wk); - if (freework->fw_lbn != lbn) - continue; - freework->fw_jnewblk = cancel_newblk(newblk, &freework->fw_list, - &freework->fw_jwork); - goto found; - } - panic("cancel_allocdirect: Freework not found for lbn %jd\n", lbn); -found: - if (delay) - WORKLIST_INSERT(&adp->ad_inodedep->id_bufwait, - &newblk->nb_list); - else - free_newblk(newblk); - return; + freework->fw_jnewblk = cancel_newblk(newblk, &freework->fw_list, + &freeblks->fb_jwork); + WORKLIST_INSERT(&freeblks->fb_freeworkhd, &newblk->nb_list); } @@ -5865,33 +6531,18 @@ cancel_newblk(newblk, wk, wkhd) struct worklist *wk; struct workhead *wkhd; { - struct indirdep *indirdep; - struct allocindir *aip; struct jnewblk *jnewblk; - while ((indirdep = LIST_FIRST(&newblk->nb_indirdeps)) != NULL) { - indirdep->ir_state &= ~ONDEPLIST; - LIST_REMOVE(indirdep, ir_next); - /* - * If an indirdep is not on the buf worklist we need to - * free it here as deallocate_dependencies() will never - * find it. These pointers were never visible on disk and - * can be discarded immediately. - */ - while ((aip = LIST_FIRST(&indirdep->ir_completehd)) != NULL) { - LIST_REMOVE(aip, ai_next); - if (cancel_newblk(&aip->ai_block, NULL, wkhd) != NULL) - panic("cancel_newblk: aip has journal entry"); - free_newblk(&aip->ai_block); - } - /* - * If this indirdep is not attached to a buf it was simply - * waiting on completion to clear completehd. free_indirdep() - * asserts that nothing is dangling. - */ - if ((indirdep->ir_state & ONWORKLIST) == 0) - free_indirdep(indirdep); - } + newblk->nb_state |= GOINGAWAY; + /* + * Previously we traversed the completedhd on each indirdep + * attached to this newblk to cancel them and gather journal + * work. Since we need only the oldest journal segment and + * the lowest point on the tree will always have the oldest + * journal segment we are free to release the segments + * of any subordinates and may leave the indirdep list to + * indirdep_complete() when this newblk is freed. + */ if (newblk->nb_state & ONDEPLIST) { newblk->nb_state &= ~ONDEPLIST; LIST_REMOVE(newblk, nb_deps); @@ -5904,7 +6555,7 @@ cancel_newblk(newblk, wk, wkhd) * superseding operation completes. */ jnewblk = newblk->nb_jnewblk; - if (jnewblk != NULL) { + if (jnewblk != NULL && wk != NULL) { newblk->nb_jnewblk = NULL; jnewblk->jn_dep = wk; } @@ -5915,6 +6566,25 @@ cancel_newblk(newblk, wk, wkhd) } /* + * Schedule the freefrag associated with a newblk to be released once + * the pointers are written and the previous block is no longer needed. + */ +static void +newblk_freefrag(newblk) + struct newblk *newblk; +{ + struct freefrag *freefrag; + + if (newblk->nb_freefrag == NULL) + return; + freefrag = newblk->nb_freefrag; + newblk->nb_freefrag = NULL; + freefrag->ff_state |= COMPLETE; + if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) + add_to_worklist(&freefrag->ff_list, 0); +} + +/* * Free a newblk. Generate a new freefrag work request if appropriate. * This must be called after the inode pointer and any direct block pointers * are valid or fully removed via truncate or frag extension. @@ -5924,34 +6594,23 @@ free_newblk(newblk) struct newblk *newblk; { struct indirdep *indirdep; - struct newdirblk *newdirblk; - struct freefrag *freefrag; struct worklist *wk; + KASSERT(newblk->nb_jnewblk == NULL, + ("free_newblk; jnewblk %p still attached", newblk->nb_jnewblk)); mtx_assert(&lk, MA_OWNED); + newblk_freefrag(newblk); if (newblk->nb_state & ONDEPLIST) LIST_REMOVE(newblk, nb_deps); if (newblk->nb_state & ONWORKLIST) WORKLIST_REMOVE(&newblk->nb_list); LIST_REMOVE(newblk, nb_hash); - if ((freefrag = newblk->nb_freefrag) != NULL) { - freefrag->ff_state |= COMPLETE; - if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) - add_to_worklist(&freefrag->ff_list, 0); - } - if ((wk = LIST_FIRST(&newblk->nb_newdirblk)) != NULL) { - newdirblk = WK_NEWDIRBLK(wk); - WORKLIST_REMOVE(&newdirblk->db_list); - if (!LIST_EMPTY(&newblk->nb_newdirblk)) - panic("free_newblk: extra newdirblk"); - free_newdirblk(newdirblk); - } - while ((indirdep = LIST_FIRST(&newblk->nb_indirdeps)) != NULL) { - indirdep->ir_state |= DEPCOMPLETE; + if ((wk = LIST_FIRST(&newblk->nb_newdirblk)) != NULL) + free_newdirblk(WK_NEWDIRBLK(wk)); + if (!LIST_EMPTY(&newblk->nb_newdirblk)) + panic("free_newblk: extra newdirblk"); + while ((indirdep = LIST_FIRST(&newblk->nb_indirdeps)) != NULL) indirdep_complete(indirdep); - } - KASSERT(newblk->nb_jnewblk == NULL, - ("free_newblk; jnewblk %p still attached", newblk->nb_jnewblk)); handle_jwork(&newblk->nb_jwork); newblk->nb_list.wk_type = D_NEWBLK; WORKITEM_FREE(newblk, D_NEWBLK); @@ -5968,9 +6627,9 @@ free_newdirblk(newdirblk) struct pagedep *pagedep; struct diradd *dap; struct worklist *wk; - int i; mtx_assert(&lk, MA_OWNED); + WORKLIST_REMOVE(&newdirblk->db_list); /* * If the pagedep is still linked onto the directory buffer * dependency chain, then some of the entries on the @@ -5983,21 +6642,13 @@ free_newdirblk(newdirblk) */ pagedep = newdirblk->db_pagedep; pagedep->pd_state &= ~NEWBLOCK; - if ((pagedep->pd_state & ONWORKLIST) == 0) + if ((pagedep->pd_state & ONWORKLIST) == 0) { while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != NULL) free_diradd(dap, NULL); - /* - * If no dependencies remain, the pagedep will be freed. - */ - for (i = 0; i < DAHASHSZ; i++) - if (!LIST_EMPTY(&pagedep->pd_diraddhd[i])) - break; - if (i == DAHASHSZ && (pagedep->pd_state & ONWORKLIST) == 0 && - LIST_EMPTY(&pagedep->pd_jmvrefhd)) { - KASSERT(LIST_FIRST(&pagedep->pd_dirremhd) == NULL, - ("free_newdirblk: Freeing non-free pagedep %p", pagedep)); - LIST_REMOVE(pagedep, pd_hash); - WORKITEM_FREE(pagedep, D_PAGEDEP); + /* + * If no dependencies remain, the pagedep will be freed. + */ + free_pagedep(pagedep); } /* Should only ever be one item in the list. */ while ((wk = LIST_FIRST(&newdirblk->db_mkdir)) != NULL) { @@ -6020,6 +6671,7 @@ softdep_freefile(pvp, ino, mode) struct inode *ip = VTOI(pvp); struct inodedep *inodedep; struct freefile *freefile; + struct freeblks *freeblks; /* * This sets up the inode de-allocation dependency. @@ -6048,28 +6700,38 @@ softdep_freefile(pvp, ino, mode) */ ACQUIRE_LOCK(&lk); inodedep_lookup(pvp->v_mount, ino, 0, &inodedep); - /* - * Remove this inode from the unlinked list and set - * GOINGAWAY as appropriate to indicate that this inode - * will never be written. - */ - if (inodedep && inodedep->id_state & UNLINKED) { + if (inodedep) { /* - * Save the journal work to be freed with the bitmap - * before we clear UNLINKED. Otherwise it can be lost - * if the inode block is written. + * Clear out freeblks that no longer need to reference + * this inode. */ - handle_bufwait(inodedep, &freefile->fx_jwork); - clear_unlinked_inodedep(inodedep); - /* Re-acquire inodedep as we've dropped lk. */ - inodedep_lookup(pvp->v_mount, ino, 0, &inodedep); + while ((freeblks = + TAILQ_FIRST(&inodedep->id_freeblklst)) != NULL) { + TAILQ_REMOVE(&inodedep->id_freeblklst, freeblks, + fb_next); + freeblks->fb_state &= ~ONDEPLIST; + } + /* + * Remove this inode from the unlinked list. + */ + if (inodedep->id_state & UNLINKED) { + /* + * Save the journal work to be freed with the bitmap + * before we clear UNLINKED. Otherwise it can be lost + * if the inode block is written. + */ + handle_bufwait(inodedep, &freefile->fx_jwork); + clear_unlinked_inodedep(inodedep); + /* Re-acquire inodedep as we've dropped lk. */ + inodedep_lookup(pvp->v_mount, ino, 0, &inodedep); + } } if (inodedep == NULL || check_inode_unwritten(inodedep)) { FREE_LOCK(&lk); handle_workitem_freefile(freefile); return; } - if (inodedep && (inodedep->id_state & DEPCOMPLETE) == 0) + if ((inodedep->id_state & DEPCOMPLETE) == 0) inodedep->id_state |= GOINGAWAY; WORKLIST_INSERT(&inodedep->id_inowait, &freefile->fx_list); FREE_LOCK(&lk); @@ -6154,6 +6816,7 @@ free_inodedep(inodedep) !TAILQ_EMPTY(&inodedep->id_newinoupdt) || !TAILQ_EMPTY(&inodedep->id_extupdt) || !TAILQ_EMPTY(&inodedep->id_newextupdt) || + !TAILQ_EMPTY(&inodedep->id_freeblklst) || inodedep->id_mkdiradd != NULL || inodedep->id_nlinkdelta != 0 || inodedep->id_savedino1 != NULL) @@ -6181,54 +6844,59 @@ freework_freeblock(freework) struct ufsmount *ump; struct workhead wkhd; struct fs *fs; - int pending; int bsize; int needj; + mtx_assert(&lk, MA_OWNED); + /* + * Handle partial truncate separately. + */ + if (freework->fw_indir) { + complete_trunc_indir(freework); + return; + } freeblks = freework->fw_freeblks; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; needj = freeblks->fb_list.wk_mp->mnt_kern_flag & MNTK_SUJ; bsize = lfragtosize(fs, freework->fw_frags); - pending = btodb(bsize); LIST_INIT(&wkhd); /* + * DEPCOMPLETE is cleared in indirblk_insert() if the block lives + * on the indirblk hashtable and prevents premature freeing. + */ + freework->fw_state |= DEPCOMPLETE; + /* + * SUJ needs to wait for the segment referencing freed indirect + * blocks to expire so that we know the checker will not confuse + * a re-allocated indirect block with its old contents. + */ + if (needj && freework->fw_lbn <= -NDADDR) + indirblk_insert(freework); + /* * If we are canceling an existing jnewblk pass it to the free * routine, otherwise pass the freeblk which will ultimately * release the freeblks. If we're not journaling, we can just * free the freeblks immediately. */ - ACQUIRE_LOCK(&lk); - LIST_SWAP(&wkhd, &freework->fw_jwork, worklist, wk_list); jnewblk = freework->fw_jnewblk; if (jnewblk != NULL) { - /* Could've already been canceled in indir_trunc(). */ - if ((jnewblk->jn_state & GOINGAWAY) == 0) - cancel_jnewblk(jnewblk, &wkhd); + cancel_jnewblk(jnewblk, &wkhd); needj = 0; } else if (needj) WORKLIST_INSERT(&wkhd, &freework->fw_list); - freeblks->fb_chkcnt -= pending; + freeblks->fb_freecnt += btodb(bsize); FREE_LOCK(&lk); - /* - * extattr blocks don't show up in pending blocks. XXX why? - */ - if (freework->fw_lbn >= 0 || freework->fw_lbn <= -NDADDR) { - UFS_LOCK(ump); - fs->fs_pendingblocks -= pending; - UFS_UNLOCK(ump); - } - ffs_blkfree(ump, fs, freeblks->fb_devvp, freework->fw_blkno, - bsize, freeblks->fb_previousinum, &wkhd); + ffs_blkfree(ump, fs, freeblks->fb_devvp, freework->fw_blkno, bsize, + freeblks->fb_inum, &wkhd); + ACQUIRE_LOCK(&lk); if (needj) return; /* * The jnewblk will be discarded and the bits in the map never * made it to disk. We can immediately free the freeblk. */ - ACQUIRE_LOCK(&lk); handle_written_freework(freework); - FREE_LOCK(&lk); } /* @@ -6246,15 +6914,21 @@ handle_workitem_indirblk(freework) struct ufsmount *ump; struct fs *fs; - freeblks = freework->fw_freeblks; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - if (freework->fw_off == NINDIR(fs)) + if (freework->fw_state & DEPCOMPLETE) { + handle_written_freework(freework); + return; + } + if (freework->fw_off == NINDIR(fs)) { freework_freeblock(freework); - else - indir_trunc(freework, fsbtodb(fs, freework->fw_blkno), - freework->fw_lbn); + return; + } + FREE_LOCK(&lk); + indir_trunc(freework, fsbtodb(fs, freework->fw_blkno), + freework->fw_lbn); + ACQUIRE_LOCK(&lk); } /* @@ -6268,48 +6942,17 @@ handle_written_freework(freework) { struct freeblks *freeblks; struct freework *parent; - struct jsegdep *jsegdep; - struct worklist *wk; - int needj; - needj = 0; freeblks = freework->fw_freeblks; parent = freework->fw_parent; - /* - * SUJ needs to wait for the segment referencing freed indirect - * blocks to expire so that we know the checker will not confuse - * a re-allocated indirect block with its old contents. - */ - if (freework->fw_lbn <= -NDADDR && - freework->fw_list.wk_mp->mnt_kern_flag & MNTK_SUJ) { - LIST_FOREACH(wk, &freeblks->fb_jwork, wk_list) - if (wk->wk_type == D_JSEGDEP) - break; - if (wk) { - jsegdep = WK_JSEGDEP(wk); - LIST_INSERT_HEAD(&jsegdep->jd_seg->js_indirs, - freework, fw_next); - WORKLIST_INSERT(INDIR_HASH(freework->fw_list.wk_mp, - freework->fw_blkno), &freework->fw_list); - needj = 1; - } - } if (parent) { - if (--parent->fw_ref != 0) - parent = NULL; - freeblks = NULL; - } else if (--freeblks->fb_ref != 0) - freeblks = NULL; - if (needj == 0) + if (--parent->fw_ref == 0) + add_to_worklist(&parent->fw_list, 1); + } else if (--freeblks->fb_ref == 0) + add_to_worklist(&freeblks->fb_list, 1); + freework->fw_state |= COMPLETE; + if ((freework->fw_state & ALLCOMPLETE) == ALLCOMPLETE) WORKITEM_FREE(freework, D_FREEWORK); - /* - * Don't delay these block frees or it takes an intolerable amount - * of time to process truncates and free their journal entries. - */ - if (freeblks) - add_to_worklist(&freeblks->fb_list, 1); - if (parent) - add_to_worklist(&parent->fw_list, 1); } /* @@ -6326,32 +6969,68 @@ handle_workitem_freeblocks(freeblks, flags) int flags; { struct freework *freework; + struct newblk *newblk; + struct allocindir *aip; + struct ufsmount *ump; struct worklist *wk; KASSERT(LIST_EMPTY(&freeblks->fb_jfreeblkhd), ("handle_workitem_freeblocks: Journal entries not written.")); if (LIST_EMPTY(&freeblks->fb_freeworkhd)) { - handle_complete_freeblocks(freeblks); + handle_complete_freeblocks(freeblks, flags); return; } - freeblks->fb_ref++; + ump = VFSTOUFS(freeblks->fb_list.wk_mp); + ACQUIRE_LOCK(&lk); while ((wk = LIST_FIRST(&freeblks->fb_freeworkhd)) != NULL) { - KASSERT(wk->wk_type == D_FREEWORK, - ("handle_workitem_freeblocks: Unknown type %s", - TYPENAME(wk->wk_type))); - WORKLIST_REMOVE_UNLOCKED(wk); - freework = WK_FREEWORK(wk); - if (freework->fw_lbn <= -NDADDR) - handle_workitem_indirblk(freework); - else - freework_freeblock(freework); + WORKLIST_REMOVE(wk); + switch (wk->wk_type) { + case D_DIRREM: + wk->wk_state |= COMPLETE; + add_to_worklist(wk, 0); + continue; + + case D_ALLOCDIRECT: + free_newblk(WK_NEWBLK(wk)); + continue; + + case D_ALLOCINDIR: + aip = WK_ALLOCINDIR(wk); + freework = NULL; + if (aip->ai_state & DELAYEDFREE) { + FREE_LOCK(&lk); + freework = newfreework(ump, freeblks, NULL, + aip->ai_lbn, aip->ai_newblkno, + ump->um_fs->fs_frag, 0, 0); + ACQUIRE_LOCK(&lk); + } + newblk = WK_NEWBLK(wk); + if (newblk->nb_jnewblk) { + freework->fw_jnewblk = newblk->nb_jnewblk; + newblk->nb_jnewblk->jn_dep = &freework->fw_list; + newblk->nb_jnewblk = NULL; + } + free_newblk(newblk); + continue; + + case D_FREEWORK: + wk->wk_state &= ~ONDEPLIST; + freework = WK_FREEWORK(wk); + if (freework->fw_lbn <= -NDADDR) + handle_workitem_indirblk(freework); + else + freework_freeblock(freework); + continue; + default: + panic("handle_workitem_freeblocks: Unknown type %s", + TYPENAME(wk->wk_type)); + } } - ACQUIRE_LOCK(&lk); if (--freeblks->fb_ref != 0) freeblks = NULL; FREE_LOCK(&lk); if (freeblks) - handle_complete_freeblocks(freeblks); + handle_complete_freeblocks(freeblks, flags); } /* @@ -6360,40 +7039,76 @@ handle_workitem_freeblocks(freeblks, flags) * can not be called until all other dependencies are stable on disk. */ static void -handle_complete_freeblocks(freeblks) +handle_complete_freeblocks(freeblks, flags) struct freeblks *freeblks; + int flags; { + struct inodedep *inodedep; struct inode *ip; struct vnode *vp; struct fs *fs; struct ufsmount *ump; - int flags; + ufs2_daddr_t spare; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - flags = LK_NOWAIT; + flags = LK_EXCLUSIVE | (flags & LK_NOWAIT); + spare = freeblks->fb_freecnt - freeblks->fb_chkcnt; /* - * If we still have not finished background cleanup, then check - * to see if the block count needs to be adjusted. + * If we did not release the expected number of blocks we may have + * to adjust the inode block count here. Only do so if it wasn't + * a truncation to zero and the modrev still matches. */ - if (freeblks->fb_chkcnt != 0 && (fs->fs_flags & FS_UNCLEAN) != 0 && - ffs_vgetf(freeblks->fb_list.wk_mp, freeblks->fb_previousinum, - (flags & LK_NOWAIT) | LK_EXCLUSIVE, &vp, FFSV_FORCEINSMQ) == 0) { + if (spare && freeblks->fb_len != 0) { + if (ffs_vgetf(freeblks->fb_list.wk_mp, freeblks->fb_inum, + flags, &vp, FFSV_FORCEINSMQ) != 0) { + ACQUIRE_LOCK(&lk); + add_to_worklist(&freeblks->fb_list, 1); + FREE_LOCK(&lk); + return; + } ip = VTOI(vp); - DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + freeblks->fb_chkcnt); - ip->i_flag |= IN_CHANGE; + if (DIP(ip, i_modrev) == freeblks->fb_modrev) { + DIP_SET(ip, i_blocks, DIP(ip, i_blocks) - spare); + ip->i_flag |= IN_CHANGE; + /* + * We must wait so this happens before the + * journal is reclaimed. + */ + ffs_update(vp, 1); + } vput(vp); + spare = 0; } + if (freeblks->fb_chkcnt) { + UFS_LOCK(ump); + fs->fs_pendingblocks -= freeblks->fb_chkcnt; + UFS_UNLOCK(ump); + } +#ifdef QUOTA + /* Handle spare. */ +#endif - if (!(freeblks->fb_chkcnt == 0 || +#if 0 + if (!(spare != 0 || ((fs->fs_flags & FS_UNCLEAN) != 0 && (flags & LK_NOWAIT) == 0))) - printf( - "handle_workitem_freeblocks: inode %ju block count %jd\n", - (uintmax_t)freeblks->fb_previousinum, - (intmax_t)freeblks->fb_chkcnt); + printf("handle_complete_freeblocks: " + "inode %ju block count %jd actual %jd\n", + (uintmax_t)freeblks->fb_inum, + (intmax_t)freeblks->fb_chkcnt, + (intmax_t)freeblks->fb_freecnt); +#endif ACQUIRE_LOCK(&lk); + if (freeblks->fb_state & ONDEPLIST) { + inodedep_lookup(freeblks->fb_list.wk_mp, freeblks->fb_inum, + 0, &inodedep); + TAILQ_REMOVE(&inodedep->id_freeblklst, freeblks, fb_next); + freeblks->fb_state &= ~ONDEPLIST; + if (TAILQ_EMPTY(&inodedep->id_freeblklst)) + free_inodedep(inodedep); + } /* * All of the freeblock deps must be complete prior to this call * so it's now safe to complete earlier outstanding journal entries. @@ -6404,10 +7119,15 @@ static void } /* - * Release blocks associated with the inode ip and stored in the indirect + * Release blocks associated with the freeblks and stored in the indirect * block dbn. If level is greater than SINGLE, the block is an indirect block * and recursive calls to indirtrunc must be used to cleanse other indirect * blocks. + * + * This handles partial and complete truncation of blocks. Partial is noted + * with goingaway == 0. In this case the freework is completed after the + * zero'd indirects are written to disk. For full truncation the freework + * is completed after the block is freed. */ static void indir_trunc(freework, dbn, lbn) @@ -6417,165 +7137,105 @@ indir_trunc(freework, dbn, lbn) { struct freework *nfreework; struct workhead wkhd; - struct jnewblk *jnewblkn; - struct jnewblk *jnewblk; struct freeblks *freeblks; struct buf *bp; struct fs *fs; - struct worklist *wkn; - struct worklist *wk; struct indirdep *indirdep; struct ufsmount *ump; ufs1_daddr_t *bap1 = 0; ufs2_daddr_t nb, nnb, *bap2 = 0; - ufs_lbn_t lbnadd; + ufs_lbn_t lbnadd, nlbn; int i, nblocks, ufs1fmt; int fs_pendingblocks; + int goingaway; int freedeps; int needj; int level; int cnt; - LIST_INIT(&wkhd); - level = lbn_level(lbn); - if (level == -1) - panic("indir_trunc: Invalid lbn %jd\n", lbn); freeblks = freework->fw_freeblks; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - fs_pendingblocks = 0; - freedeps = 0; - needj = UFSTOVFS(ump)->mnt_kern_flag & MNTK_SUJ; - lbnadd = lbn_offset(fs, level); /* - * Get buffer of block pointers to be freed. This routine is not - * called until the zero'ed inode has been written, so it is safe - * to free blocks as they are encountered. Because the inode has - * been zero'ed, calls to bmap on these blocks will fail. So, we - * have to use the on-disk address and the block device for the - * filesystem to look them up. If the file was deleted before its - * indirect blocks were all written to disk, the routine that set - * us up (deallocate_dependencies) will have arranged to leave - * a complete copy of the indirect block in memory for our use. - * Otherwise we have to read the blocks in from the disk. + * Get buffer of block pointers to be freed. There are three cases: + * + * 1) Partial truncate caches the indirdep pointer in the freework + * which provides us a back copy to the save bp which holds the + * pointers we want to clear. When this completes the zero + * pointers are written to the real copy. + * 2) The indirect is being completely truncated, cancel_indirdep() + * eliminated the real copy and placed the indirdep on the saved + * copy. The indirdep and buf are discarded when this completes. + * 3) The indirect was not in memory, we read a copy off of the disk + * using the devvp and drop and invalidate the buffer when we're + * done. */ -#ifdef notyet - bp = getblk(freeblks->fb_devvp, dbn, (int)fs->fs_bsize, 0, 0, - GB_NOCREAT); -#else - bp = incore(&freeblks->fb_devvp->v_bufobj, dbn); -#endif + goingaway = 1; + indirdep = NULL; + if (freework->fw_indir != NULL) { + goingaway = 0; + indirdep = freework->fw_indir; + bp = indirdep->ir_savebp; + if (bp == NULL || bp->b_blkno != dbn) + panic("indir_trunc: Bad saved buf %p blkno %jd", + bp, (intmax_t)dbn); + } else if ((bp = incore(&freeblks->fb_devvp->v_bufobj, dbn)) != NULL) { + /* + * The lock prevents the buf dep list from changing and + * indirects on devvp should only ever have one dependency. + */ + indirdep = WK_INDIRDEP(LIST_FIRST(&bp->b_dep)); + if (indirdep == NULL || (indirdep->ir_state & GOINGAWAY) == 0) + panic("indir_trunc: Bad indirdep %p from buf %p", + indirdep, bp); + } else if (bread(freeblks->fb_devvp, dbn, (int)fs->fs_bsize, + NOCRED, &bp) != 0) { + brelse(bp); + return; + } ACQUIRE_LOCK(&lk); - if (bp != NULL && (wk = LIST_FIRST(&bp->b_dep)) != NULL) { - if (wk->wk_type != D_INDIRDEP || - (wk->wk_state & GOINGAWAY) == 0) - panic("indir_trunc: lost indirdep %p", wk); - indirdep = WK_INDIRDEP(wk); - LIST_SWAP(&wkhd, &indirdep->ir_jwork, worklist, wk_list); - LIST_FOREACH_SAFE(jnewblk, &indirdep->ir_jnewblkhd, - jn_indirdeps, jnewblkn) { - /* - * XXX This cancel may cause some lengthy delay - * before the record is reclaimed below. - */ - LIST_REMOVE(jnewblk, jn_indirdeps); - cancel_jnewblk(jnewblk, &wkhd); - } - - free_indirdep(indirdep); - if (!LIST_EMPTY(&bp->b_dep)) - panic("indir_trunc: dangling dep %p", - LIST_FIRST(&bp->b_dep)); - ump->um_numindirdeps -= 1; - FREE_LOCK(&lk); - } else { -#ifdef notyet - if (bp) - brelse(bp); -#endif - FREE_LOCK(&lk); - if (bread(freeblks->fb_devvp, dbn, (int)fs->fs_bsize, - NOCRED, &bp) != 0) { - brelse(bp); + /* + * If we have an indirdep we need to enforce the truncation order + * and discard it when it is complete. + */ + if (indirdep) { + if (freework != TAILQ_FIRST(&indirdep->ir_trunc) && + !TAILQ_EMPTY(&indirdep->ir_trunc)) { + add_to_worklist(&freework->fw_list, 0); + FREE_LOCK(&lk); return; } + /* + * If we're goingaway, free the indirdep. Otherwise it will + * linger until the write completes. + */ + if (goingaway) { + free_indirdep(indirdep); + ump->um_numindirdeps -= 1; + } } - /* - * Recursively free indirect blocks. - */ + FREE_LOCK(&lk); + /* Initialize pointers depending on block size. */ if (ump->um_fstype == UFS1) { + bap1 = (ufs1_daddr_t *)bp->b_data; + nb = bap1[freework->fw_off]; ufs1fmt = 1; - bap1 = (ufs1_daddr_t *)bp->b_data; } else { + bap2 = (ufs2_daddr_t *)bp->b_data; + nb = bap2[freework->fw_off]; ufs1fmt = 0; - bap2 = (ufs2_daddr_t *)bp->b_data; } - - /* - * Reclaim indirect blocks which never made it to disk. - */ - cnt = 0; - LIST_FOREACH_SAFE(wk, &wkhd, wk_list, wkn) { - if (wk->wk_type != D_JNEWBLK) - continue; - /* XXX Is the lock necessary here for more than an assert? */ - ACQUIRE_LOCK(&lk); - WORKLIST_REMOVE(wk); - FREE_LOCK(&lk); - jnewblk = WK_JNEWBLK(wk); - if (jnewblk->jn_lbn > 0) - i = (jnewblk->jn_lbn - -lbn) / lbnadd; - else - i = (-(jnewblk->jn_lbn + level - 1) - -(lbn + level)) / - lbnadd; - KASSERT(i >= 0 && i < NINDIR(fs), - ("indir_trunc: Index out of range %d parent %jd lbn %jd level %d", - i, lbn, jnewblk->jn_lbn, level)); - /* Clear the pointer so it isn't found below. */ - if (ufs1fmt) { - nb = bap1[i]; - bap1[i] = 0; - } else { - nb = bap2[i]; - bap2[i] = 0; - } - KASSERT(nb == jnewblk->jn_blkno, - ("indir_trunc: Block mismatch %jd != %jd", - nb, jnewblk->jn_blkno)); - if (level != 0) { - ufs_lbn_t nlbn; - - nlbn = (lbn + 1) - (i * lbnadd); - nfreework = newfreework(ump, freeblks, freework, - nlbn, nb, fs->fs_frag, 0); - nfreework->fw_jnewblk = jnewblk; - freedeps++; - indir_trunc(nfreework, fsbtodb(fs, nb), nlbn); - } else { - struct workhead freewk; - - LIST_INIT(&freewk); - ACQUIRE_LOCK(&lk); - WORKLIST_INSERT(&freewk, wk); - FREE_LOCK(&lk); - ffs_blkfree(ump, fs, freeblks->fb_devvp, - jnewblk->jn_blkno, fs->fs_bsize, - freeblks->fb_previousinum, &freewk); - } - cnt++; - } - ACQUIRE_LOCK(&lk); - /* Any remaining journal work can be completed with freeblks. */ - jwork_move(&freeblks->fb_jwork, &wkhd); - FREE_LOCK(&lk); + level = lbn_level(lbn); + needj = UFSTOVFS(ump)->mnt_kern_flag & MNTK_SUJ; + lbnadd = lbn_offset(fs, level); nblocks = btodb(fs->fs_bsize); - if (ufs1fmt) - nb = bap1[0]; - else - nb = bap2[0]; nfreework = freework; + freedeps = 0; + cnt = 0; /* - * Reclaim on disk blocks. + * Reclaim blocks. Traverses into nested indirect levels and + * arranges for the current level to be freed when subordinates + * are free when journaling. */ for (i = freework->fw_off; i < NINDIR(fs); i++, nb = nnb) { if (i != NINDIR(fs) - 1) { @@ -6589,12 +7249,10 @@ indir_trunc(freework, dbn, lbn) continue; cnt++; if (level != 0) { - ufs_lbn_t nlbn; - nlbn = (lbn + 1) - (i * lbnadd); if (needj != 0) { nfreework = newfreework(ump, freeblks, freework, - nlbn, nb, fs->fs_frag, 0); + nlbn, nb, fs->fs_frag, 0, 0); freedeps++; } indir_trunc(nfreework, fsbtodb(fs, nb), nlbn); @@ -6614,85 +7272,102 @@ indir_trunc(freework, dbn, lbn) freedeps++; } ffs_blkfree(ump, fs, freeblks->fb_devvp, nb, - fs->fs_bsize, freeblks->fb_previousinum, &wkhd); + fs->fs_bsize, freeblks->fb_inum, &wkhd); } } + if (goingaway) { + bp->b_flags |= B_INVAL | B_NOCACHE; + brelse(bp); + } + fs_pendingblocks = 0; if (level == 0) fs_pendingblocks = (nblocks * cnt); /* - * If we're not journaling we can free the indirect now. Otherwise - * setup the ref counts and offset so this indirect can be completed - * when its children are free. + * If we are journaling set up the ref counts and offset so this + * indirect can be completed when its children are free. */ - if (needj == 0) { - fs_pendingblocks += nblocks; - dbn = dbtofsb(fs, dbn); - ffs_blkfree(ump, fs, freeblks->fb_devvp, dbn, fs->fs_bsize, - freeblks->fb_previousinum, NULL); + if (needj) { ACQUIRE_LOCK(&lk); - freeblks->fb_chkcnt -= fs_pendingblocks; - if (freework->fw_blkno == dbn) - handle_written_freework(freework); - FREE_LOCK(&lk); - freework = NULL; - } else { - ACQUIRE_LOCK(&lk); freework->fw_off = i; freework->fw_ref += freedeps; freework->fw_ref -= NINDIR(fs) + 1; - if (freework->fw_ref != 0) - freework = NULL; - freeblks->fb_chkcnt -= fs_pendingblocks; + freeblks->fb_freecnt += fs_pendingblocks; + if (freework->fw_ref == 0) + freework_freeblock(freework); FREE_LOCK(&lk); + return; } - if (fs_pendingblocks) { - UFS_LOCK(ump); - fs->fs_pendingblocks -= fs_pendingblocks; - UFS_UNLOCK(ump); + /* + * If we're not journaling we can free the indirect now. + */ + fs_pendingblocks += nblocks; + dbn = dbtofsb(fs, dbn); + ffs_blkfree(ump, fs, freeblks->fb_devvp, dbn, fs->fs_bsize, + freeblks->fb_inum, NULL); + /* Non SUJ softdep does single-threaded truncations. */ + freeblks->fb_freecnt += fs_pendingblocks; + if (freework->fw_blkno == dbn) { + ACQUIRE_LOCK(&lk); + handle_written_freework(freework); + FREE_LOCK(&lk); } - bp->b_flags |= B_INVAL | B_NOCACHE; - brelse(bp); - if (freework) - handle_workitem_indirblk(freework); return; } /* - * Cancel an allocindir when it is removed via truncation. + * Cancel an allocindir when it is removed via truncation. When bp is not + * NULL the indirect never appeared on disk and is scheduled to be freed + * independently of the indir so we can more easily track journal work. */ static void -cancel_allocindir(aip, inodedep, freeblks) +cancel_allocindir(aip, bp, freeblks, trunc) struct allocindir *aip; - struct inodedep *inodedep; + struct buf *bp; struct freeblks *freeblks; + int trunc; { - struct jnewblk *jnewblk; + struct indirdep *indirdep; + struct freefrag *freefrag; struct newblk *newblk; + newblk = (struct newblk *)aip; + LIST_REMOVE(aip, ai_next); /* + * We must eliminate the pointer in bp if it must be freed on its + * own due to partial truncate or pending journal work. + */ + if (bp && (trunc || newblk->nb_jnewblk)) { + /* + * Clear the pointer and mark the aip to be freed + * directly if it never existed on disk. + */ + aip->ai_state |= DELAYEDFREE; + indirdep = aip->ai_indirdep; + if (indirdep->ir_state & UFS1FMT) + ((ufs1_daddr_t *)bp->b_data)[aip->ai_offset] = 0; + else + ((ufs2_daddr_t *)bp->b_data)[aip->ai_offset] = 0; + } + /* + * When truncating the previous pointer will be freed via + * savedbp. Eliminate the freefrag which would dup free. + */ + if (trunc && (freefrag = newblk->nb_freefrag) != NULL) { + newblk->nb_freefrag = NULL; + if (freefrag->ff_jdep) + cancel_jfreefrag( + WK_JFREEFRAG(freefrag->ff_jdep)); + jwork_move(&freeblks->fb_jwork, &freefrag->ff_jwork); + WORKITEM_FREE(freefrag, D_FREEFRAG); + } + /* * If the journal hasn't been written the jnewblk must be passed * to the call to ffs_blkfree that reclaims the space. We accomplish - * this by linking the journal dependency into the indirdep to be - * freed when indir_trunc() is called. If the journal has already - * been written we can simply reclaim the journal space when the - * freeblks work is complete. + * this by leaving the journal dependency on the newblk to be freed + * when a freework is created in handle_workitem_freeblocks(). */ - LIST_REMOVE(aip, ai_next); - newblk = (struct newblk *)aip; - if (newblk->nb_jnewblk == NULL) { - if (cancel_newblk(newblk, NULL, &freeblks->fb_jwork)) - panic("cancel_allocindir: Unexpected dependency."); - } else { - jnewblk = cancel_newblk(newblk, &aip->ai_indirdep->ir_list, - &aip->ai_indirdep->ir_jwork); - if (jnewblk) - LIST_INSERT_HEAD(&aip->ai_indirdep->ir_jnewblkhd, - jnewblk, jn_indirdeps); - } - if (inodedep && inodedep->id_state & DEPCOMPLETE) - WORKLIST_INSERT(&inodedep->id_bufwait, &newblk->nb_list); - else - free_newblk(newblk); + cancel_newblk(newblk, NULL, &freeblks->fb_jwork); + WORKLIST_INSERT(&freeblks->fb_freeworkhd, &newblk->nb_list); } /* @@ -6788,7 +7463,7 @@ setup_newdir(dap, newinum, dinum, newdirbp, mkdirp WORKITEM_FREE(mkdir2, D_MKDIR); } else { LIST_INSERT_HEAD(&mkdirlisthd, mkdir2, md_mkdirs); - WORKLIST_INSERT(&inodedep->id_bufwait,&mkdir2->md_list); + WORKLIST_INSERT(&inodedep->id_bufwait, &mkdir2->md_list); } *mkdirp = mkdir2; @@ -7540,6 +8215,7 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) &pagedep) == 0) WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); dirrem->dm_pagedep = pagedep; + dirrem->dm_offset = offset; /* * If we're renaming a .. link to a new directory, cancel any * existing MKDIR_PARENT mkdir. If it has already been canceled @@ -8372,7 +9048,7 @@ softdep_disk_io_initiation(bp) freeblks = WK_FREEBLKS(wk); jfreeblk = LIST_FIRST(&freeblks->fb_jfreeblkhd); /* - * We have to wait for the jfreeblks to be journaled + * We have to wait for the freeblks to be journaled * before we can write an inodeblock with updated * pointers. Be careful to arrange the marker so * we revisit the jfreeblk if it's not removed by @@ -8396,7 +9072,7 @@ softdep_disk_io_initiation(bp) */ newblk = WK_NEWBLK(wk); if (newblk->nb_jnewblk != NULL && - indirblk_inseg(newblk->nb_list.wk_mp, + indirblk_lookup(newblk->nb_list.wk_mp, newblk->nb_newblkno)) { LIST_REMOVE(&marker, wk_list); LIST_INSERT_BEFORE(wk, &marker, wk_list); @@ -8900,10 +9576,9 @@ initiate_write_inodeblock_ufs2(inodedep, bp) * list. */ static void -cancel_indirdep(indirdep, bp, inodedep, freeblks) +cancel_indirdep(indirdep, bp, freeblks) struct indirdep *indirdep; struct buf *bp; - struct inodedep *inodedep; struct freeblks *freeblks; { struct allocindir *aip; @@ -8924,24 +9599,38 @@ static void */ if (indirdep->ir_state & GOINGAWAY) panic("cancel_indirdep: already gone"); - if (indirdep->ir_state & ONDEPLIST) { - indirdep->ir_state &= ~ONDEPLIST; + if ((indirdep->ir_state & DEPCOMPLETE) == 0) { + indirdep->ir_state |= DEPCOMPLETE; LIST_REMOVE(indirdep, ir_next); } indirdep->ir_state |= GOINGAWAY; VFSTOUFS(indirdep->ir_list.wk_mp)->um_numindirdeps += 1; + /* + * Pass in bp for blocks still have journal writes + * pending so we can cancel them on their own. + */ while ((aip = LIST_FIRST(&indirdep->ir_deplisthd)) != 0) - cancel_allocindir(aip, inodedep, freeblks); + cancel_allocindir(aip, bp, freeblks, 0); while ((aip = LIST_FIRST(&indirdep->ir_donehd)) != 0) - cancel_allocindir(aip, inodedep, freeblks); + cancel_allocindir(aip, NULL, freeblks, 0); while ((aip = LIST_FIRST(&indirdep->ir_writehd)) != 0) - cancel_allocindir(aip, inodedep, freeblks); + cancel_allocindir(aip, NULL, freeblks, 0); while ((aip = LIST_FIRST(&indirdep->ir_completehd)) != 0) - cancel_allocindir(aip, inodedep, freeblks); - bcopy(bp->b_data, indirdep->ir_savebp->b_data, bp->b_bcount); + cancel_allocindir(aip, NULL, freeblks, 0); + /* + * If there are pending partial truncations we need to keep the + * old block copy around until they complete. This is because + * the current b_data is not a perfect superset of the available + * blocks. + */ + if (TAILQ_EMPTY(&indirdep->ir_trunc)) + bcopy(bp->b_data, indirdep->ir_savebp->b_data, bp->b_bcount); + else + bcopy(bp->b_data, indirdep->ir_saveddata, bp->b_bcount); WORKLIST_REMOVE(&indirdep->ir_list); WORKLIST_INSERT(&indirdep->ir_savebp->b_dep, &indirdep->ir_list); - indirdep->ir_savebp = NULL; + indirdep->ir_bp = NULL; + indirdep->ir_freeblks = freeblks; } /* @@ -8952,10 +9641,8 @@ free_indirdep(indirdep) struct indirdep *indirdep; { - KASSERT(LIST_EMPTY(&indirdep->ir_jwork), - ("free_indirdep: Journal work not empty.")); - KASSERT(LIST_EMPTY(&indirdep->ir_jnewblkhd), - ("free_indirdep: Journal new block list not empty.")); + KASSERT(TAILQ_EMPTY(&indirdep->ir_trunc), + ("free_indirdep: Indir trunc list not empty.")); KASSERT(LIST_EMPTY(&indirdep->ir_completehd), ("free_indirdep: Complete head not empty.")); KASSERT(LIST_EMPTY(&indirdep->ir_writehd), @@ -8964,10 +9651,8 @@ free_indirdep(indirdep) ("free_indirdep: done head not empty.")); KASSERT(LIST_EMPTY(&indirdep->ir_deplisthd), ("free_indirdep: deplist head not empty.")); - KASSERT(indirdep->ir_savebp == NULL, - ("free_indirdep: %p ir_savebp != NULL", indirdep)); - KASSERT((indirdep->ir_state & ONDEPLIST) == 0, - ("free_indirdep: %p still on deplist.", indirdep)); + KASSERT((indirdep->ir_state & DEPCOMPLETE), + ("free_indirdep: %p still on newblk list.", indirdep)); if (indirdep->ir_state & ONWORKLIST) WORKLIST_REMOVE(&indirdep->ir_list); WORKITEM_FREE(indirdep, D_INDIRDEP); @@ -8984,6 +9669,7 @@ initiate_write_indirdep(indirdep, bp) struct buf *bp; { + indirdep->ir_state |= IOSTARTED; if (indirdep->ir_state & GOINGAWAY) panic("disk_io_initiation: indirdep gone"); @@ -8991,15 +9677,18 @@ initiate_write_indirdep(indirdep, bp) * If there are no remaining dependencies, this will be writing * the real pointers. */ - if (LIST_EMPTY(&indirdep->ir_deplisthd)) + if (LIST_EMPTY(&indirdep->ir_deplisthd) && + TAILQ_EMPTY(&indirdep->ir_trunc)) return; /* * Replace up-to-date version with safe version. */ - FREE_LOCK(&lk); - indirdep->ir_saveddata = malloc(bp->b_bcount, M_INDIRDEP, - M_SOFTDEP_FLAGS); - ACQUIRE_LOCK(&lk); + if (indirdep->ir_saveddata == NULL) { + FREE_LOCK(&lk); + indirdep->ir_saveddata = malloc(bp->b_bcount, M_INDIRDEP, + M_SOFTDEP_FLAGS); + ACQUIRE_LOCK(&lk); + } indirdep->ir_state &= ~ATTACHED; indirdep->ir_state |= UNDONE; bcopy(bp->b_data, indirdep->ir_saveddata, bp->b_bcount); @@ -9066,11 +9755,11 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) int frags; struct workhead *wkhd; { + struct bmsafemap *bmsafemap; struct jnewblk *jnewblk; - struct worklist *wk, *wkn; + struct worklist *wk; + struct fs *fs; #ifdef SUJ_DEBUG - struct bmsafemap *bmsafemap; - struct fs *fs; uint8_t *blksfree; struct cg *cgp; ufs2_daddr_t jstart; @@ -9081,25 +9770,29 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) #endif ACQUIRE_LOCK(&lk); + /* Lookup the bmsafemap so we track when it is dirty. */ + fs = VFSTOUFS(mp)->um_fs; + bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno)); /* * Detach any jnewblks which have been canceled. They must linger * until the bitmap is cleared again by ffs_blkfree() to prevent * an unjournaled allocation from hitting the disk. */ if (wkhd) { - LIST_FOREACH_SAFE(wk, wkhd, wk_list, wkn) { - if (wk->wk_type != D_JNEWBLK) + while ((wk = LIST_FIRST(wkhd)) != NULL) { + WORKLIST_REMOVE(wk); + if (wk->wk_type != D_JNEWBLK) { + WORKLIST_INSERT(&bmsafemap->sm_freehd, wk); continue; + } jnewblk = WK_JNEWBLK(wk); KASSERT(jnewblk->jn_state & GOINGAWAY, ("softdep_setup_blkfree: jnewblk not canceled.")); - WORKLIST_REMOVE(wk); #ifdef SUJ_DEBUG /* * Assert that this block is free in the bitmap * before we discard the jnewblk. */ - fs = VFSTOUFS(mp)->um_fs; cgp = (struct cg *)bp->b_data; blksfree = cg_blksfree(cgp); bno = dtogd(fs, jnewblk->jn_blkno); @@ -9117,12 +9810,6 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) wk->wk_state |= COMPLETE | ATTACHED; free_jnewblk(jnewblk); } - /* - * The buf must be locked by the caller otherwise these could - * be added while it's being written and the write would - * complete them before they made it to disk. - */ - jwork_move(&bp->b_dep, wkhd); } #ifdef SUJ_DEBUG @@ -9242,6 +9929,8 @@ initiate_write_bmsafemap(bmsafemap, bp) inodedep, id_deps); LIST_SWAP(&bmsafemap->sm_newblkhd, &bmsafemap->sm_newblkwr, newblk, nb_deps); + LIST_SWAP(&bmsafemap->sm_freehd, &bmsafemap->sm_freewr, worklist, + wk_list); } /* @@ -9260,6 +9949,7 @@ softdep_disk_write_complete(bp) struct worklist *wk; struct worklist *owk; struct workhead reattach; + struct freeblks *freeblks; struct buf *sbp; /* @@ -9277,6 +9967,7 @@ softdep_disk_write_complete(bp) ACQUIRE_LOCK(&lk); while ((wk = LIST_FIRST(&bp->b_dep)) != NULL) { WORKLIST_REMOVE(wk); + dep_write[wk->wk_type]++; if (wk == owk) panic("duplicate worklist: %p\n", wk); owk = wk; @@ -9318,7 +10009,9 @@ softdep_disk_write_complete(bp) case D_FREEBLKS: wk->wk_state |= COMPLETE; - if ((wk->wk_state & ALLCOMPLETE) == ALLCOMPLETE) + freeblks = WK_FREEBLKS(wk); + if ((wk->wk_state & ALLCOMPLETE) == ALLCOMPLETE && + LIST_EMPTY(&freeblks->fb_jfreeblkhd)) add_to_worklist(wk, 1); continue; @@ -9326,10 +10019,6 @@ softdep_disk_write_complete(bp) handle_written_freework(WK_FREEWORK(wk)); break; - case D_FREEDEP: - free_freedep(WK_FREEDEP(wk)); - continue; - case D_JSEGDEP: free_jsegdep(WK_JSEGDEP(wk)); continue; @@ -9459,7 +10148,11 @@ handle_allocindir_partdone(aip) return; indirdep = aip->ai_indirdep; LIST_REMOVE(aip, ai_next); - if (indirdep->ir_state & UNDONE) { + /* + * Don't set a pointer while the buffer is undergoing IO or while + * we have active truncations. + */ + if (indirdep->ir_state & UNDONE || !TAILQ_EMPTY(&indirdep->ir_trunc)) { LIST_INSERT_HEAD(&indirdep->ir_donehd, aip, ai_next); return; } @@ -9490,6 +10183,12 @@ handle_jwork(wkhd) case D_JSEGDEP: free_jsegdep(WK_JSEGDEP(wk)); continue; + case D_FREEDEP: + free_freedep(WK_FREEDEP(wk)); + continue; + case D_FREEWORK: + handle_written_freework(WK_FREEWORK(wk)); + continue; default: panic("handle_jwork: Unknown type %s\n", TYPENAME(wk->wk_type)); @@ -9852,21 +10551,26 @@ handle_written_indirdep(indirdep, bp, bpp) struct buf **bpp; { struct allocindir *aip; + struct buf *sbp; int chgs; if (indirdep->ir_state & GOINGAWAY) - panic("disk_write_complete: indirdep gone"); + panic("handle_written_indirdep: indirdep gone"); + if ((indirdep->ir_state & IOSTARTED) == 0) + panic("handle_written_indirdep: IO not started"); chgs = 0; /* * If there were rollbacks revert them here. */ if (indirdep->ir_saveddata) { bcopy(indirdep->ir_saveddata, bp->b_data, bp->b_bcount); - free(indirdep->ir_saveddata, M_INDIRDEP); - indirdep->ir_saveddata = 0; + if (TAILQ_EMPTY(&indirdep->ir_trunc)) { + free(indirdep->ir_saveddata, M_INDIRDEP); + indirdep->ir_saveddata = 0; + } chgs = 1; } - indirdep->ir_state &= ~UNDONE; + indirdep->ir_state &= ~(UNDONE | IOSTARTED); indirdep->ir_state |= ATTACHED; /* * Move allocindirs with written pointers to the completehd if @@ -9878,6 +10582,7 @@ handle_written_indirdep(indirdep, bp, bpp) if ((indirdep->ir_state & DEPCOMPLETE) == 0) { LIST_INSERT_HEAD(&indirdep->ir_completehd, aip, ai_next); + newblk_freefrag(&aip->ai_block); continue; } free_newblk(&aip->ai_block); @@ -9886,50 +10591,42 @@ handle_written_indirdep(indirdep, bp, bpp) * Move allocindirs that have finished dependency processing from * the done list to the write list after updating the pointers. */ - while ((aip = LIST_FIRST(&indirdep->ir_donehd)) != 0) { - handle_allocindir_partdone(aip); - if (aip == LIST_FIRST(&indirdep->ir_donehd)) - panic("disk_write_complete: not gone"); - chgs = 1; + if (TAILQ_EMPTY(&indirdep->ir_trunc)) { + while ((aip = LIST_FIRST(&indirdep->ir_donehd)) != 0) { + handle_allocindir_partdone(aip); + if (aip == LIST_FIRST(&indirdep->ir_donehd)) + panic("disk_write_complete: not gone"); + chgs = 1; + } } /* - * If this indirdep has been detached from its newblk during - * I/O we need to keep this dep attached to the buffer so - * deallocate_dependencies can find it and properly resolve - * any outstanding dependencies. + * Preserve the indirdep if there were any changes or if it is not + * yet valid on disk. */ - if ((indirdep->ir_state & (ONDEPLIST | DEPCOMPLETE)) == 0) - chgs = 1; - if ((bp->b_flags & B_DELWRI) == 0) + if (chgs) { stat_indir_blk_ptrs++; + bdirty(bp); + return (1); + } /* * If there were no changes we can discard the savedbp and detach * ourselves from the buf. We are only carrying completed pointers * in this case. */ - if (chgs == 0) { - struct buf *sbp; - - sbp = indirdep->ir_savebp; - sbp->b_flags |= B_INVAL | B_NOCACHE; - indirdep->ir_savebp = NULL; - if (*bpp != NULL) - panic("handle_written_indirdep: bp already exists."); - *bpp = sbp; - } else - bdirty(bp); + sbp = indirdep->ir_savebp; + sbp->b_flags |= B_INVAL | B_NOCACHE; + indirdep->ir_savebp = NULL; + indirdep->ir_bp = NULL; + if (*bpp != NULL) + panic("handle_written_indirdep: bp already exists."); + *bpp = sbp; /* - * If there are no fresh dependencies and none waiting on writes - * we can free the indirdep. + * The indirdep may not be freed until its parent points at it. */ - if ((indirdep->ir_state & DEPCOMPLETE) && chgs == 0) { - if (indirdep->ir_state & ONDEPLIST) - LIST_REMOVE(indirdep, ir_next); + if (indirdep->ir_state & DEPCOMPLETE) free_indirdep(indirdep); - return (0); - } - return (chgs); + return (0); } /* @@ -9974,6 +10671,7 @@ handle_written_bmsafemap(bmsafemap, bp) struct inodedep *inodedep; struct jaddref *jaddref, *jatmp; struct jnewblk *jnewblk, *jntmp; + struct ufsmount *ump; uint8_t *inosused; uint8_t *blksfree; struct cg *cgp; @@ -9985,9 +10683,15 @@ handle_written_bmsafemap(bmsafemap, bp) if ((bmsafemap->sm_state & IOSTARTED) == 0) panic("initiate_write_bmsafemap: Not started\n"); + ump = VFSTOUFS(bmsafemap->sm_list.wk_mp); chgs = 0; bmsafemap->sm_state &= ~IOSTARTED; /* + * Release journal work that was waiting on the write. + */ + handle_jwork(&bmsafemap->sm_freewr); + + /* * Restore unwritten inode allocation pending jaddref writes. */ if (!LIST_EMPTY(&bmsafemap->sm_jaddrefhd)) { @@ -10063,16 +10767,17 @@ handle_written_bmsafemap(bmsafemap, bp) LIST_REMOVE(inodedep, id_deps); inodedep->id_bmsafemap = NULL; } - if (LIST_EMPTY(&bmsafemap->sm_jaddrefhd) && + LIST_REMOVE(bmsafemap, sm_next); + if (chgs == 0 && LIST_EMPTY(&bmsafemap->sm_jaddrefhd) && LIST_EMPTY(&bmsafemap->sm_jnewblkhd) && LIST_EMPTY(&bmsafemap->sm_newblkhd) && - LIST_EMPTY(&bmsafemap->sm_inodedephd)) { - if (chgs) - bdirty(bp); + LIST_EMPTY(&bmsafemap->sm_inodedephd) && + LIST_EMPTY(&bmsafemap->sm_freehd)) { LIST_REMOVE(bmsafemap, sm_hash); WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); return (0); } + LIST_INSERT_HEAD(&ump->softdep_dirtycg, bmsafemap, sm_next); bdirty(bp); return (1); } @@ -10119,17 +10824,19 @@ free_pagedep(pagedep) { int i; - if (pagedep->pd_state & (NEWBLOCK | ONWORKLIST)) + if (pagedep->pd_state & NEWBLOCK) return; + if (!LIST_EMPTY(&pagedep->pd_dirremhd)) + return; for (i = 0; i < DAHASHSZ; i++) if (!LIST_EMPTY(&pagedep->pd_diraddhd[i])) return; + if (!LIST_EMPTY(&pagedep->pd_pendinghd)) + return; if (!LIST_EMPTY(&pagedep->pd_jmvrefhd)) return; - if (!LIST_EMPTY(&pagedep->pd_dirremhd)) - return; - if (!LIST_EMPTY(&pagedep->pd_pendinghd)) - return; + if (pagedep->pd_state & ONWORKLIST) + WORKLIST_REMOVE(&pagedep->pd_list); LIST_REMOVE(pagedep, pd_hash); WORKITEM_FREE(pagedep, D_PAGEDEP); } @@ -10217,11 +10924,7 @@ handle_written_filepage(pagedep, bp) * Otherwise it will remain to track any new entries on * the page in case they are fsync'ed. */ - if ((pagedep->pd_state & NEWBLOCK) == 0 && - LIST_EMPTY(&pagedep->pd_jmvrefhd)) { - LIST_REMOVE(pagedep, pd_hash); - WORKITEM_FREE(pagedep, D_PAGEDEP); - } + free_pagedep(pagedep); return (0); } @@ -10655,6 +11358,44 @@ restart: BO_UNLOCK(bo); } +static void +sync_cgs(mp, waitfor) + struct mount *mp; + int waitfor; +{ + struct bmsafemap *bmsafemap; + struct bmsafemap *sentinal; + struct ufsmount *ump; + struct buf *bp; + + sentinal = malloc(sizeof(*sentinal), M_BMSAFEMAP, M_ZERO | M_WAITOK); + sentinal->sm_cg = -1; + ump = VFSTOUFS(mp); + ACQUIRE_LOCK(&lk); + LIST_INSERT_HEAD(&ump->softdep_dirtycg, sentinal, sm_next); + for (bmsafemap = LIST_NEXT(sentinal, sm_next); bmsafemap != NULL; + bmsafemap = LIST_NEXT(sentinal, sm_next)) { + /* Skip sentinals and cgs with no work to release. */ + if (bmsafemap->sm_cg == -1 || + LIST_EMPTY(&bmsafemap->sm_freehd)) { + LIST_REMOVE(sentinal, sm_next); + LIST_INSERT_AFTER(bmsafemap, sentinal, sm_next); + continue; + } + bp = getdirtybuf(bmsafemap->sm_buf, &lk, waitfor); + if (bp == NULL) + continue; + LIST_REMOVE(sentinal, sm_next); + LIST_INSERT_AFTER(bmsafemap, sentinal, sm_next); + FREE_LOCK(&lk); + bwrite(bp); + ACQUIRE_LOCK(&lk); + } + LIST_REMOVE(sentinal, sm_next); + FREE_LOCK(&lk); + free(sentinal, M_BMSAFEMAP); +} + /* * This routine is called when we are trying to synchronously flush a * file. This routine must eliminate any filesystem metadata dependencies @@ -10664,6 +11405,8 @@ restart: int softdep_sync_metadata(struct vnode *vp) { + struct indirdep *indirdep; + struct freework *freework; struct pagedep *pagedep; struct allocindir *aip; struct newblk *newblk; @@ -10678,7 +11421,8 @@ softdep_sync_metadata(struct vnode *vp) * Ensure that any direct block dependencies have been cleared. */ ACQUIRE_LOCK(&lk); - if ((error = flush_inodedep_deps(vp->v_mount, VTOI(vp)->i_number))) { + if ((error = flush_inodedep_deps(vp, vp->v_mount, + VTOI(vp)->i_number))) { FREE_LOCK(&lk); return (error); } @@ -10754,9 +11498,45 @@ loop: case D_INDIRDEP: restart: + indirdep = WK_INDIRDEP(wk); + TAILQ_FOREACH(freework, &indirdep->ir_trunc, fw_next) { + /* + * If the freework is on a worklist it is + * simply waiting for softdep flush to + * execute it. + */ + if (freework->fw_state & ONWORKLIST) { + if (freework->fw_state & ONDEPLIST) + WORKLIST_REMOVE( + &freework->fw_list); + else + remove_from_worklist( + &freework->fw_list); + freework->fw_state &= ~ONDEPLIST; + } else + freework = NULL; + /* + * Release the buf so that freework_freeblock + * has a chance to succeed. + */ + FREE_LOCK(&lk); + BUF_NOREC(bp); + bqrelse(bp); + if (freework) { + ACQUIRE_LOCK(&lk); + handle_workitem_indirblk(freework); + FREE_LOCK(&lk); + goto top; + } + /* + * We may need to flush cgs for the freework + * to finish. + */ + sync_cgs(vp->v_mount, MNT_WAIT); + goto top; + } - LIST_FOREACH(aip, - &WK_INDIRDEP(wk)->ir_deplisthd, ai_next) { + LIST_FOREACH(aip, &indirdep->ir_deplisthd, ai_next) { newblk = (struct newblk *)aip; if (newblk->nb_jnewblk != NULL) { stat_jwait_newblk++; @@ -10799,6 +11579,9 @@ loop: } continue; + case D_FREEWORK: + continue; + default: panic("softdep_sync_metadata: Unknown type %s", TYPENAME(wk->wk_type)); @@ -10851,11 +11634,58 @@ loop: } /* + * Make sure that all truncations have been started so that if we + * discover any lingering dependencies on indirdeps we can successfully + * flush them. + */ +static int +flush_trunclist(vp, inodedep, waitfor, errorp) + struct vnode *vp; + struct inodedep *inodedep; + int waitfor; + int *errorp; +{ + struct freeblks *freeblks; + + TAILQ_FOREACH(freeblks, &inodedep->id_freeblklst, fb_next) { + if (!LIST_EMPTY(&freeblks->fb_jfreeblkhd)) { + stat_jwait_freeblks++; + jwait(&LIST_FIRST(&freeblks->fb_jfreeblkhd)->jf_list); + return (1); + } + /* Freeblks is waiting on a inode write. */ + if ((freeblks->fb_state & COMPLETE) == 0) { + FREE_LOCK(&lk); + ffs_update(vp, 1); + goto restart; + } + /* + * If the truncation is complete it may be waiting for the vnode + * lock to update i_blocks. It may also simply be waiting on + * a busy softdep thread to start truncation. + */ + if ((freeblks->fb_state & (ONWORKLIST | ALLCOMPLETE)) == + (ONWORKLIST | ALLCOMPLETE)) { + remove_from_worklist(&freeblks->fb_list); + FREE_LOCK(&lk); + handle_workitem_freeblocks(freeblks, 0); + goto restart; + } + } + return (0); + +restart: + ACQUIRE_LOCK(&lk); + return (1); +} + +/* * Flush the dependencies associated with an inodedep. * Called with splbio blocked. */ static int -flush_inodedep_deps(mp, ino) +flush_inodedep_deps(vp, mp, ino) + struct vnode *vp; struct mount *mp; ino_t ino; { @@ -10895,7 +11725,8 @@ restart: if (flush_deplist(&inodedep->id_inoupdt, waitfor, &error) || flush_deplist(&inodedep->id_newinoupdt, waitfor, &error) || flush_deplist(&inodedep->id_extupdt, waitfor, &error) || - flush_deplist(&inodedep->id_newextupdt, waitfor, &error)) + flush_deplist(&inodedep->id_newextupdt, waitfor, &error) || + flush_trunclist(vp, inodedep, waitfor, &error)) continue; /* * If pass2, we are done, otherwise do pass 2. @@ -11338,6 +12169,7 @@ retry: UFS_UNLOCK(ump); ACQUIRE_LOCK(&lk); process_removes(vp); + process_truncates(vp); if (ump->softdep_on_worklist > 0 && process_worklist_item(UFSTOVFS(ump), LK_NOWAIT) != -1) { stat_worklist_push += 1; @@ -11363,24 +12195,14 @@ retry: UFS_UNLOCK(ump); MNT_ILOCK(mp); MNT_VNODE_FOREACH(lvp, mp, mvp) { - UFS_LOCK(ump); - if (ump->softdep_on_worklist > 0) { - UFS_UNLOCK(ump); - MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp); - MNT_IUNLOCK(mp); - UFS_LOCK(ump); - stat_cleanup_retries += 1; - goto retry; - } - UFS_UNLOCK(ump); VI_LOCK(lvp); - if (TAILQ_FIRST(&lvp->v_bufobj.bo_dirty.bv_hd) == 0 || - VOP_ISLOCKED(lvp) != 0) { + if (TAILQ_FIRST(&lvp->v_bufobj.bo_dirty.bv_hd) == 0) { VI_UNLOCK(lvp); continue; } MNT_IUNLOCK(mp); - if (vget(lvp, LK_EXCLUSIVE | LK_INTERLOCK, curthread)) { + if (vget(lvp, LK_EXCLUSIVE | LK_INTERLOCK | LK_NOWAIT, + curthread)) { MNT_ILOCK(mp); continue; } @@ -11394,8 +12216,17 @@ retry: MNT_ILOCK(mp); } MNT_IUNLOCK(mp); + lvp = ump->um_devvp; + if (vn_lock(lvp, LK_EXCLUSIVE | LK_NOWAIT) == 0) { + VOP_FSYNC(lvp, MNT_NOWAIT, curthread); + VOP_UNLOCK(lvp, 0); + } + UFS_LOCK(ump); + if (ump->softdep_on_worklist > 0) { + stat_cleanup_retries += 1; + goto retry; + } stat_cleanup_failures += 1; - UFS_LOCK(ump); } if (time_second - starttime > stat_cleanup_high_delay) stat_cleanup_high_delay = time_second - starttime; @@ -11664,6 +12495,7 @@ softdep_count_dependencies(bp, wantcount) { struct worklist *wk; struct bmsafemap *bmsafemap; + struct freework *freework; struct inodedep *inodedep; struct indirdep *indirdep; struct freeblks *freeblks; @@ -11711,6 +12543,13 @@ softdep_count_dependencies(bp, wantcount) case D_INDIRDEP: indirdep = WK_INDIRDEP(wk); + TAILQ_FOREACH(freework, &indirdep->ir_trunc, fw_next) { + /* indirect truncation dependency */ + retval += 1; + if (!wantcount) + goto out; + } + LIST_FOREACH(aip, &indirdep->ir_deplisthd, ai_next) { /* indirect block pointer dependency */ retval += 1; Index: /usr/src/sys/ufs/ffs/ffs_alloc.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_alloc.c (revision 221878) +++ /usr/src/sys/ufs/ffs/ffs_alloc.c (working copy) @@ -217,7 +217,7 @@ nospace: (void) chkdq(ip, -btodb(size), cred, FORCE); UFS_LOCK(ump); #endif - if (reclaimed == 0) { + if (reclaimed == 0 && (flags & IO_BUFLOCKED) == 0) { reclaimed = 1; softdep_request_cleanup(fs, ITOV(ip), cred, FLUSH_BLOCKS_WAIT); goto retry; @@ -418,15 +418,15 @@ nospace: /* * no space available */ - if (reclaimed == 0) { + if (reclaimed == 0 && (flags & IO_BUFLOCKED) == 0) { reclaimed = 1; - softdep_request_cleanup(fs, vp, cred, FLUSH_BLOCKS_WAIT); UFS_UNLOCK(ump); if (bp) { brelse(bp); bp = NULL; } UFS_LOCK(ump); + softdep_request_cleanup(fs, vp, cred, FLUSH_BLOCKS_WAIT); goto retry; } UFS_UNLOCK(ump); Index: /usr/src/sys/ufs/ffs/ffs_extern.h =================================================================== --- /usr/src/sys/ufs/ffs/ffs_extern.h (revision 221878) +++ /usr/src/sys/ufs/ffs/ffs_extern.h (working copy) @@ -107,7 +107,6 @@ extern struct vop_vector ffs_fifoops2; int softdep_check_suspend(struct mount *, struct vnode *, int, int, int, int); -int softdep_complete_trunc(struct vnode *, void *); void softdep_get_depcounts(struct mount *, int *, int *); void softdep_initialize(void); void softdep_uninitialize(void); @@ -139,7 +138,6 @@ void softdep_setup_blkfree(struct mount *, struct void softdep_setup_inofree(struct mount *, struct buf *, ino_t, struct workhead *); void softdep_setup_sbupdate(struct ufsmount *, struct fs *, struct buf *); -void *softdep_setup_trunc(struct vnode *vp, off_t length, int flags); void softdep_fsync_mountdev(struct vnode *); int softdep_sync_metadata(struct vnode *); int softdep_process_worklist(struct mount *, int); @@ -147,7 +145,9 @@ int softdep_fsync(struct vnode *); int softdep_waitidle(struct mount *); int softdep_prealloc(struct vnode *, int); int softdep_journal_lookup(struct mount *, struct vnode **); +void softdep_journal_freeblocks(struct inode *, struct ucred *, off_t, int); + /* * Things to request flushing in softdep_request_cleanup() */ Index: /usr/src/sys/ufs/ffs/softdep.h =================================================================== --- /usr/src/sys/ufs/ffs/softdep.h (revision 221878) +++ /usr/src/sys/ufs/ffs/softdep.h (working copy) @@ -127,7 +127,7 @@ #define DIRCHG 0x000080 /* diradd, dirrem only */ #define GOINGAWAY 0x000100 /* indirdep, jremref only */ #define IOSTARTED 0x000200 /* inodedep, pagedep, bmsafemap only */ -#define UNUSED400 0x000400 /* currently available. */ +#define DELAYEDFREE 0x000400 /* allocindirect free delayed. */ #define NEWBLOCK 0x000800 /* pagedep, jaddref only */ #define INPROGRESS 0x001000 /* dirrem, freeblks, freefrag, freefile only */ #define UFS1FMT 0x002000 /* indirdep only */ @@ -215,8 +215,10 @@ LIST_HEAD(jmvrefhd, jmvref); LIST_HEAD(jnewblkhd, jnewblk); LIST_HEAD(jfreeblkhd, jfreeblk); LIST_HEAD(freeworkhd, freework); +TAILQ_HEAD(freeworklst, freework); TAILQ_HEAD(jseglst, jseg); TAILQ_HEAD(inoreflst, inoref); +TAILQ_HEAD(freeblklst, freeblks); /* * The "pagedep" structure tracks the various dependencies related to @@ -321,6 +323,7 @@ struct inodedep { struct allocdirectlst id_newinoupdt; /* updates when inode written */ struct allocdirectlst id_extupdt; /* extdata updates pre-inode write */ struct allocdirectlst id_newextupdt; /* extdata updates at ino write */ + struct freeblklst id_freeblklst; /* List of partial truncates. */ union { struct ufs1_dinode *idu_savedino1; /* saved ufs1_dinode contents */ struct ufs2_dinode *idu_savedino2; /* saved ufs2_dinode contents */ @@ -342,8 +345,9 @@ struct inodedep { struct bmsafemap { struct worklist sm_list; /* cylgrp buffer */ # define sm_state sm_list.wk_state + LIST_ENTRY(bmsafemap) sm_hash; /* Hash links. */ + LIST_ENTRY(bmsafemap) sm_next; /* Mount list. */ int sm_cg; - LIST_ENTRY(bmsafemap) sm_hash; /* Hash links. */ struct buf *sm_buf; /* associated buffer */ struct allocdirecthd sm_allocdirecthd; /* allocdirect deps */ struct allocdirecthd sm_allocdirectwr; /* writing allocdirect deps */ @@ -355,6 +359,8 @@ struct bmsafemap { struct newblkhd sm_newblkwr; /* writing newblk deps */ struct jaddrefhd sm_jaddrefhd; /* Pending inode allocations. */ struct jnewblkhd sm_jnewblkhd; /* Pending block allocations. */ + struct workhead sm_freehd; /* Freedep deps. */ + struct workhead sm_freewr; /* Written freedeps. */ }; /* @@ -442,14 +448,15 @@ struct indirdep { struct worklist ir_list; /* buffer holding indirect block */ # define ir_state ir_list.wk_state /* indirect block pointer state */ LIST_ENTRY(indirdep) ir_next; /* alloc{direct,indir} list */ + TAILQ_HEAD(, freework) ir_trunc; /* List of truncations. */ caddr_t ir_saveddata; /* buffer cache contents */ struct buf *ir_savebp; /* buffer holding safe copy */ + struct buf *ir_bp; /* buffer holding live copy */ struct allocindirhd ir_completehd; /* waiting for indirdep complete */ struct allocindirhd ir_writehd; /* Waiting for the pointer write. */ struct allocindirhd ir_donehd; /* done waiting to update safecopy */ struct allocindirhd ir_deplisthd; /* allocindir deps for this block */ - struct jnewblkhd ir_jnewblkhd; /* Canceled block allocations. */ - struct workhead ir_jwork; /* Journal work pending. */ + struct freeblks *ir_freeblks; /* Freeblks that frees this indir. */ }; /* @@ -471,6 +478,7 @@ struct allocindir { LIST_ENTRY(allocindir) ai_next; /* indirdep's list of allocindir's */ struct indirdep *ai_indirdep; /* address of associated indirdep */ ufs2_daddr_t ai_oldblkno; /* old value of block pointer */ + ufs_lbn_t ai_lbn; /* Logical block number. */ int ai_offset; /* Pointer offset in parent. */ }; #define ai_newblkno ai_block.nb_newblkno @@ -516,13 +524,18 @@ struct freefrag { struct freeblks { struct worklist fb_list; /* id_inowait or delayed worklist */ # define fb_state fb_list.wk_state /* inode and dirty block state */ + TAILQ_ENTRY(freeblks) fb_next; /* List of inode truncates. */ struct jfreeblkhd fb_jfreeblkhd; /* Journal entries pending */ struct workhead fb_freeworkhd; /* Work items pending */ struct workhead fb_jwork; /* Journal work pending */ - ino_t fb_previousinum; /* inode of previous owner of blocks */ + struct jtrunc *fb_jtrunc; /* Journal truncation record. */ + struct vnode *fb_devvp; /* filesystem device vnode */ + uint64_t fb_modrev; /* Inode revision at start of trunc. */ + off_t fb_len; /* Length we're truncating to. */ + ufs2_daddr_t fb_chkcnt; /* Expected blks released. */ + ufs2_daddr_t fb_freecnt; /* Actual blocks released. */ + ino_t fb_inum; /* inode owner of blocks */ uid_t fb_uid; /* uid of previous owner of blocks */ - struct vnode *fb_devvp; /* filesystem device vnode */ - ufs2_daddr_t fb_chkcnt; /* used to check cnt of blks released */ int fb_ref; /* Children outstanding. */ }; @@ -538,16 +551,18 @@ struct freeblks { struct freework { struct worklist fw_list; /* Delayed worklist. */ # define fw_state fw_list.wk_state - LIST_ENTRY(freework) fw_next; /* For seg journal list. */ - struct jnewblk *fw_jnewblk; /* Journal entry to cancel. */ + LIST_ENTRY(freework) fw_segs; /* Seg list. */ + TAILQ_ENTRY(freework) fw_next; /* Hash/Trunc list. */ + struct jnewblk *fw_jnewblk; /* Journal entry to cancel. */ struct freeblks *fw_freeblks; /* Root of operation. */ struct freework *fw_parent; /* Parent indirect. */ + struct indirdep *fw_indir; /* indirect block. */ ufs2_daddr_t fw_blkno; /* Our block #. */ ufs_lbn_t fw_lbn; /* Original lbn before free. */ - int fw_frags; /* Number of frags. */ - int fw_ref; /* Number of children out. */ - int fw_off; /* Current working position. */ - struct workhead fw_jwork; /* Journal work pending. */ + uint16_t fw_frags; /* Number of frags. */ + uint16_t fw_ref; /* Number of children out. */ + uint16_t fw_off; /* Current working position. */ + uint16_t fw_start; /* Start of partial truncate. */ }; /* @@ -674,6 +689,7 @@ struct dirrem { LIST_ENTRY(dirrem) dm_inonext; /* inodedep's list of dirrem's */ struct jremrefhd dm_jremrefhd; /* Pending remove reference deps. */ ino_t dm_oldinum; /* inum of the removed dir entry */ + doff_t dm_offset; /* offset of removed dir entry in blk */ union { struct pagedep *dmu_pagedep; /* pagedep dependency for remove */ ino_t dmu_dirinum; /* parent inode number (for rmdir) */ @@ -707,7 +723,7 @@ struct dirrem { */ struct newdirblk { struct worklist db_list; /* id_inowait or pg_newdirblk */ -# define db_state db_list.wk_state /* unused */ +# define db_state db_list.wk_state struct pagedep *db_pagedep; /* associated pagedep */ struct workhead db_mkdir; }; @@ -807,7 +823,6 @@ struct jnewblk { # define jn_state jn_list.wk_state struct jsegdep *jn_jsegdep; /* Will track our journal record. */ LIST_ENTRY(jnewblk) jn_deps; /* Jnewblks on sm_jnewblkhd. */ - LIST_ENTRY(jnewblk) jn_indirdeps; /* Jnewblks on ir_jnewblkhd. */ struct worklist *jn_dep; /* Dependency to ref completed seg. */ ino_t jn_ino; /* Ino to which allocated. */ ufs_lbn_t jn_lbn; /* Lbn to which allocated. */ @@ -831,6 +846,7 @@ struct jfreeblk { ufs_lbn_t jf_lbn; /* Lbn from which blocks freed. */ ufs2_daddr_t jf_blkno; /* Blkno being freed. */ int jf_frags; /* Number of frags being freed. */ + int jf_off; /* Offset into indir. */ }; /* @@ -850,14 +866,12 @@ struct jfreefrag { }; /* - * A "jtrunc" journals the intent to truncate an inode to a non-zero - * value. This is done synchronously prior to the synchronous partial - * truncation process. The jsegdep is not released until the truncation - * is complete and the truncated inode is fsync'd. + * A "jtrunc" journals the intent to truncate an inode's data or extent area. */ struct jtrunc { struct worklist jt_list; /* Linked to softdep_journal_pending. */ struct jsegdep *jt_jsegdep; /* Will track our journal record. */ + struct freeblks *jt_freeblks; /* The parent freeblks operation. */ ino_t jt_ino; /* Ino being truncated. */ off_t jt_size; /* Final file size. */ int jt_extsize; /* Final extent size. */ Index: /usr/src/sys/ufs/ffs/ffs_balloc.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_balloc.c (revision 221878) +++ /usr/src/sys/ufs/ffs/ffs_balloc.c (working copy) @@ -105,6 +105,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse ufs2_daddr_t *lbns_remfree, lbns[NIADDR + 1]; int unwindidx = -1; int saved_inbdflush; + int reclaimed; ip = VTOI(vp); dp = ip->i_din1; @@ -112,6 +113,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse ump = ip->i_ump; lbn = lblkno(fs, startoffset); size = blkoff(fs, startoffset) + size; + reclaimed = 0; if (size > fs->fs_bsize) panic("ffs_balloc_ufs1: blk too big"); *bpp = NULL; @@ -276,6 +278,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse /* * Fetch through the indirect blocks, allocating as necessary. */ +retry: for (i = 1;;) { error = bread(vp, indirs[i].in_lbn, (int)fs->fs_bsize, NOCRED, &bp); @@ -296,8 +299,15 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (pref == 0) pref = ffs_blkpref_ufs1(ip, lbn, 0, (ufs1_daddr_t *)0); if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, - flags, cred, &newb)) != 0) { + flags | IO_BUFLOCKED, cred, &newb)) != 0) { brelse(bp); + if (++reclaimed == 1) { + UFS_LOCK(ump); + softdep_request_cleanup(fs, vp, cred, + FLUSH_BLOCKS_WAIT); + UFS_UNLOCK(ump); + goto retry; + } goto fail; } nb = newb; @@ -349,10 +359,17 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (nb == 0) { UFS_LOCK(ump); pref = ffs_blkpref_ufs1(ip, lbn, indirs[i].in_off, &bap[0]); - error = ffs_alloc(ip, - lbn, pref, (int)fs->fs_bsize, flags, cred, &newb); + error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, + flags | IO_BUFLOCKED, cred, &newb); if (error) { brelse(bp); + if (++reclaimed == 1) { + UFS_LOCK(ump); + softdep_request_cleanup(fs, vp, cred, + FLUSH_BLOCKS_WAIT); + UFS_UNLOCK(ump); + goto retry; + } goto fail; } nb = newb; @@ -506,6 +523,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse int deallocated, osize, nsize, num, i, error; int unwindidx = -1; int saved_inbdflush; + int reclaimed; ip = VTOI(vp); dp = ip->i_din2; @@ -513,6 +531,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse ump = ip->i_ump; lbn = lblkno(fs, startoffset); size = blkoff(fs, startoffset) + size; + reclaimed = 0; if (size > fs->fs_bsize) panic("ffs_balloc_ufs2: blk too big"); *bpp = NULL; @@ -787,6 +806,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse /* * Fetch through the indirect blocks, allocating as necessary. */ +retry: for (i = 1;;) { error = bread(vp, indirs[i].in_lbn, (int)fs->fs_bsize, NOCRED, &bp); @@ -807,8 +827,15 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (pref == 0) pref = ffs_blkpref_ufs2(ip, lbn, 0, (ufs2_daddr_t *)0); if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, - flags, cred, &newb)) != 0) { + flags | IO_BUFLOCKED, cred, &newb)) != 0) { brelse(bp); + if (++reclaimed == 1) { + UFS_LOCK(ump); + softdep_request_cleanup(fs, vp, cred, + FLUSH_BLOCKS_WAIT); + UFS_UNLOCK(ump); + goto retry; + } goto fail; } nb = newb; @@ -860,10 +887,17 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (nb == 0) { UFS_LOCK(ump); pref = ffs_blkpref_ufs2(ip, lbn, indirs[i].in_off, &bap[0]); - error = ffs_alloc(ip, - lbn, pref, (int)fs->fs_bsize, flags, cred, &newb); + error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, + flags | IO_BUFLOCKED, cred, &newb); if (error) { brelse(bp); + if (++reclaimed == 1) { + UFS_LOCK(ump); + softdep_request_cleanup(fs, vp, cred, + FLUSH_BLOCKS_WAIT); + UFS_UNLOCK(ump); + goto retry; + } goto fail; } nb = newb; Index: /usr/src/sys/ufs/ffs/ffs_inode.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_inode.c (revision 221878) +++ /usr/src/sys/ufs/ffs/ffs_inode.c (working copy) @@ -151,12 +151,12 @@ ffs_truncate(vp, length, flags, cred, td) ufs2_daddr_t bn, lbn, lastblock, lastiblock[NIADDR], indir_lbn[NIADDR]; ufs2_daddr_t oldblks[NDADDR + NIADDR], newblks[NDADDR + NIADDR]; ufs2_daddr_t count, blocksreleased = 0, datablocks; - void *cookie; struct bufobj *bo; struct fs *fs; struct buf *bp; struct ufsmount *ump; - int needextclean, softdepslowdown, extblocks; + int softdeptrunc, journaltrunc; + int needextclean, extblocks; int offset, size, level, nblocks; int i, error, allerror; off_t osize; @@ -165,7 +165,6 @@ ffs_truncate(vp, length, flags, cred, td) fs = ip->i_fs; ump = ip->i_ump; bo = &vp->v_bufobj; - cookie = NULL; ASSERT_VOP_LOCKED(vp, "ffs_truncate"); @@ -191,7 +190,10 @@ ffs_truncate(vp, length, flags, cred, td) */ allerror = 0; needextclean = 0; - softdepslowdown = DOINGSOFTDEP(vp) && softdep_slowdown(vp); + softdeptrunc = 0; + journaltrunc = DOINGSUJ(vp); + if (journaltrunc == 0 && DOINGSOFTDEP(vp) && length == 0) + softdeptrunc = !softdep_slowdown(vp); extblocks = 0; datablocks = DIP(ip, i_blocks); if (fs->fs_magic == FS_UFS2_MAGIC && ip->i_din2->di_extsize > 0) { @@ -199,19 +201,24 @@ ffs_truncate(vp, length, flags, cred, td) datablocks -= extblocks; } if ((flags & IO_EXT) && extblocks > 0) { - if (DOINGSOFTDEP(vp) && softdepslowdown == 0 && length == 0) { + if (softdeptrunc) { if ((flags & IO_NORMAL) == 0) { softdep_setup_freeblocks(ip, length, IO_EXT); return (0); } needextclean = 1; + } else if (journaltrunc) { + if ((flags & IO_NORMAL) == 0) { + softdep_journal_freeblocks(ip, cred, length, + IO_EXT); + return (0); + } + needextclean = 1; } else { if (length != 0) panic("ffs_truncate: partial trunc of extdata"); if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) return (error); - if (DOINGSUJ(vp)) - cookie = softdep_setup_trunc(vp, length, flags); osize = ip->i_din2->di_extsize; ip->i_din2->di_blocks -= extblocks; #ifdef QUOTA @@ -300,7 +307,7 @@ ffs_truncate(vp, length, flags, cred, td) goto out; } if (DOINGSOFTDEP(vp)) { - if (length > 0 || softdepslowdown) { + if (softdeptrunc == 0 && journaltrunc == 0) { /* * If a file is only partially truncated, then * we have to clean up the data structures @@ -312,27 +319,29 @@ ffs_truncate(vp, length, flags, cred, td) */ if ((error = ffs_syncvnode(vp, MNT_WAIT)) != 0) goto out; - /* - * We have to journal the truncation before we change - * any blocks so we don't leave the file partially - * truncated. - */ - if (DOINGSUJ(vp) && cookie == NULL) - cookie = softdep_setup_trunc(vp, length, flags); } else { #ifdef QUOTA - (void) chkdq(ip, -datablocks, NOCRED, 0); + /* XXX This is wrong for partial truncation. */ + if (length == 0) + (void) chkdq(ip, -datablocks, NOCRED, 0); #endif - softdep_setup_freeblocks(ip, length, needextclean ? - IO_EXT | IO_NORMAL : IO_NORMAL); + flags = IO_NORMAL | (needextclean ? IO_EXT: 0); + if (journaltrunc) + softdep_journal_freeblocks(ip, cred, length, + flags); + else + softdep_setup_freeblocks(ip, length, flags); ASSERT_VOP_LOCKED(vp, "ffs_truncate1"); - vinvalbuf(vp, needextclean ? 0 : V_NORMAL, 0, 0); + if (needextclean) + vinvalbuf(vp, V_ALT, 0, 0); + error = vtruncbuf(vp, cred, td, length, fs->fs_bsize); if (!needextclean) ffs_pages_remove(vp, 0, OFF_TO_IDX(lblktosize(fs, -extblocks))); - vnode_pager_setsize(vp, 0); - ip->i_flag |= IN_CHANGE | IN_UPDATE; - error = ffs_update(vp, 0); + if (journaltrunc == 0) { + ip->i_flag |= IN_CHANGE | IN_UPDATE; + error = ffs_update(vp, 0); + } goto out; } } @@ -411,13 +420,7 @@ ffs_truncate(vp, length, flags, cred, td) DIP_SET(ip, i_db[i], 0); } ip->i_flag |= IN_CHANGE | IN_UPDATE; - /* - * When doing softupdate journaling we must preserve the size along - * with the old pointers until they are freed or we might not - * know how many fragments remain. - */ - if (!DOINGSUJ(vp)) - allerror = ffs_update(vp, 1); + allerror = ffs_update(vp, 1); /* * Having written the new inode to disk, save its new configuration @@ -543,11 +546,6 @@ done: #endif error = allerror; out: - if (cookie) { - allerror = softdep_complete_trunc(vp, cookie); - if (allerror != 0 && error == 0) - error = allerror; - } return (error); } Index: /usr/src/sys/ufs/ffs/fs.h =================================================================== --- /usr/src/sys/ufs/ffs/fs.h (revision 221878) +++ /usr/src/sys/ufs/ffs/fs.h (working copy) @@ -715,7 +715,9 @@ struct jmvrec { /* * Block record. A set of frags or tree of blocks starting at an indirect are - * freed or a set of frags are allocated. + * freed or a set of frags are allocated. If indiroff is set, only a subset + * of the pointers in an indirect block are freed and the indirect itself + * is retained. */ struct jblkrec { uint32_t jb_op; @@ -724,7 +726,7 @@ struct jblkrec { ufs_lbn_t jb_lbn; uint16_t jb_frags; uint16_t jb_oldfrags; - uint32_t jb_unused; + uint32_t jb_indiroff; }; /* Index: /usr/src/sys/kern/vfs_bio.c =================================================================== --- /usr/src/sys/kern/vfs_bio.c (revision 221878) +++ /usr/src/sys/kern/vfs_bio.c (working copy) @@ -3999,10 +3999,11 @@ DB_SHOW_COMMAND(buffer, db_show_buffer) db_printf("b_flags = 0x%b\n", (u_int)bp->b_flags, PRINT_BUF_FLAGS); db_printf( "b_error = %d, b_bufsize = %ld, b_bcount = %ld, b_resid = %ld\n" - "b_bufobj = (%p), b_data = %p, b_blkno = %jd, b_dep = %p\n", + "b_bufobj = (%p), b_data = %p, b_blkno = %jd, b_lblkno = %jd, " + "b_dep = %p\n", bp->b_error, bp->b_bufsize, bp->b_bcount, bp->b_resid, bp->b_bufobj, bp->b_data, (intmax_t)bp->b_blkno, - bp->b_dep.lh_first); + (intmax_t)bp->b_lblkno, bp->b_dep.lh_first); if (bp->b_npages) { int i; db_printf("b_npages = %d, pages(OBJ, IDX, PA): ", bp->b_npages); Index: /usr/src/sys/kern/vfs_subr.c =================================================================== --- /usr/src/sys/kern/vfs_subr.c (revision 221878) +++ /usr/src/sys/kern/vfs_subr.c (working copy) @@ -1376,7 +1376,7 @@ restart: } } - if (length > 0) { + if (length > 0 && (vp->v_mount->mnt_kern_flag & MNTK_SUJ) == 0) { restartsync: TAILQ_FOREACH_SAFE(bp, &bo->bo_dirty.bv_hd, b_bobufs, nbp) { if (bp->b_lblkno > 0) Index: /usr/src/sys/sys/vnode.h =================================================================== --- /usr/src/sys/sys/vnode.h (revision 221878) +++ /usr/src/sys/sys/vnode.h (working copy) @@ -302,6 +302,7 @@ struct vattr { #define IO_EXT 0x0400 /* operate on external attributes */ #define IO_NORMAL 0x0800 /* operate on regular data */ #define IO_NOMACCHECK 0x1000 /* MAC checks unnecessary */ +#define IO_BUFLOCKED 0x2000 /* ffs flag; indir buf is locked */ #define IO_SEQMAX 0x7F /* seq heuristic max value */ #define IO_SEQSHIFT 16 /* seq heuristic in upper 16 bits */ -- Test scenario: suj17.sh