GENERIC HEAD from 2011-05-14 05:43:33 UTC, r221878M, vmcore.138 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 10:44:58 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 (1453 frags, 26299 blocks, 0.1% fragmentation) /dev/ad4s1f: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad4s1f: clean, 191395 free (4203 frags, 23399 blocks, 0.4% fragmentation) /dev/label/tmp: 301351 files, 26976673 used, 91337308 free (3132 frags, 11416772 blocks, 0.0% fragmentation) /dev/ad4s1d: 764516 files, 7656494 used, 2497705 free (226041 frags, 283958 blocks, 2.2% fragmentation) /dev/ad4s1e: 552971 files, 13974496 used, 11414021 free (56613 frags, 1419676 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 0xc74ca600 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,ef22a894,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d273,c74ca600,c0ebc0da,c6d61ec0,c0ebbd6c,...) at _witness_debugger+0x25 witness_checkorder(c74ca600,9,c0ebbd63,11c,0,...) at witness_checkorder+0x839 _sx_xlock(c74ca600,0,c0ebbd63,11c,c774515c,...) at _sx_xlock+0x85 ufsdirhash_acquire(e071cc40,ef22a9ec,104,e13b9b14,ef22a964,...) at ufsdirhash_acquire+0x48 ufsdirhash_add(c774515c,ef22a9ec,1b14,ef22a950,ef22a954,...) at ufsdirhash_add+0x13 ufs_direnter(c74ab6cc,c799c6cc,ef22a9ec,ef22abd0,e071d2c0,...) at ufs_direnter+0x749 ufs_mkdir(ef22abf8,c0ed9d15,0,0,ef22ab3c,...) at ufs_mkdir+0x916 VOP_MKDIR_APV(c0fbb360,ef22abf8,ef22abd0,ef22ab3c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c78225c0,ffffff9c,28404020,0,1c0,...) at kern_mkdirat+0x225 kern_mkdir(c78225c0,28404020,0,1c0,ef22ac7c,...) at kern_mkdir+0x2e mkdir(c78225c0,ef22acec,ef22ad28,c0e8babe,0,...) at mkdir+0x29 syscallenter(c78225c0,ef22ace4,ef22ace4,0,0,...) at syscallenter+0x263 syscall(ef22ad28) 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 0xc7a07724 ufs (ufs) @ kern/vfs_lookup.c:501 2nd 0xe07249c0 bufwait (bufwait) @ ufs/ffs/ffs_softdep.c:12664 3rd 0xc7a12b38 ufs (ufs) @ kern/vfs_subr.c:2134 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,2e706564,32313a63,d343636,a,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c09e0e4b,c0e8d28c,c6d5e2a0,c6d61e58,ef1a932c,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d28c,c7a12b38,c0e7c770,c6d61e58,c0e94e9b,...) at _witness_debugger+0x25 witness_checkorder(c7a12b38,9,c0e94e92,856,0,...) at witness_checkorder+0x839 __lockmgr_args(c7a12b38,80100,c7a12ba4,0,0,...) at __lockmgr_args+0x814 ffs_lock(ef1a9450,c09f23db,c0e941f7,80100,c7a12ae0,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0fbb360,ef1a9450,c7420670,c0fd6320,c7a12ae0,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c7a12ae0,80100,c0e94e92,856,4,...) at _vn_lock+0x78 vget(c7a12ae0,80100,c74205c0,50,0,...) at vget+0xbb vfs_hash_get(c7774b50,15ef44,80000,c74205c0,ef1a95a8,...) at vfs_hash_get+0xed ffs_vgetf(c7774b50,15ef44,80000,ef1a95a8,1,...) at ffs_vgetf+0x49 softdep_sync_metadata(c7a076cc,0,c0ebb859,144,0,...) at softdep_sync_metadata+0x10e2 ffs_syncvnode(c7a076cc,1,c7a077c4,c6d5e2a0,c115b5b8,...) at ffs_syncvnode+0x3e2 ffs_truncate(c7a076cc,200,0,880,c715b500,...) at ffs_truncate+0x8bb ufs_direnter(c7a076cc,c7a12ae0,ef1a9914,ef1a9ba4,0,...) at ufs_direnter+0x924 ufs_makeinode(ef1a9ba4,c0fbb860,ef1a9b00,ef1a9a5c,c0cf5c75,...) at ufs_makeinode+0x5c5 ufs_create(ef1a9b00,c0ed9edb,0,0,ef1a9b78,...) at ufs_create+0x30 VOP_CREATE_APV(c0fbb360,ef1a9b00,ef1a9ba4,ef1a9a98,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(ef1a9b78,ef1a9c2c,1b0,0,c715b500,...) at vn_open_cred+0x205 vn_open(ef1a9b78,ef1a9c2c,1b0,c74322a0,0,...) at vn_open+0x3b kern_openat(c74205c0,ffffff9c,28839f60,0,a03,...) at kern_openat+0x12f kern_open(c74205c0,28839f60,0,a02,1b0,...) at kern_open+0x35 open(c74205c0,ef1a9cec,ef1a9d28,c0e8babe,0,...) at open+0x30 syscallenter(c74205c0,ef1a9ce4,ef1a9ce4,0,0,...) at syscallenter+0x263 syscall(ef1a9d28) 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 0xc7749058 ufs (ufs) @ kern/vfs_mount.c:1193 2nd 0xc748c724 devfs (devfs) @ ufs/ffs/ffs_softdep.c:1729 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,37313a63,a0d3932,ef2bc900,c09f23db,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c09e0e4b,c0e8d273,c6d61e58,c6d61d88,ef2bca04,...) at kdb_backtrace+0x2a _witness_debugger(c0e8d273,c748c724,c0e74927,c6d61d88,c0eb8525,...) at _witness_debugger+0x25 witness_checkorder(c748c724,9,c0eb851c,6c1,c748c790,...) at witness_checkorder+0x839 __lockmgr_args(c748c724,80400,c748c790,0,0,...) at __lockmgr_args+0x814 vop_stdlock(ef2bcb24,4,c0e84007,80400,c748c6cc,...) at vop_stdlock+0x65 VOP_LOCK1_APV(c0f91100,ef2bcb24,c118efa8,c0fd6320,c748c6cc,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c748c6cc,80400,c0eb851c,6c1,c776a5a8,...) at _vn_lock+0x78 softdep_flushworklist(c776a5a8,ef2bcbd0,c747d000,574,0,...) at softdep_flushworklist+0x47 ffs_sync(c776a5a8,1,ef2bcc14,4ee,0,...) at ffs_sync+0x2fd dounmount(c776a5a8,8080000,c747d000,473,5b85c5ea,...) at dounmount+0x447 unmount(c747d000,ef2bccec,281766e5,1,0,...) at unmount+0x310 syscallenter(c747d000,ef2bcce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef2bcd28) 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 11:03:44 CEST 2011 FreeBSD/i386 (x4.osted.lan) (console) login: May 15 11:04:00 x4 su: pho to root on /dev/pts/1 interrupt total irq1: atkbd0 1 irq4: uart0 5347 irq6: fdc0 1 irq9: acpi0 1 irq14: ata0 14 irq16: ohci0 2 irq17: ohci1 ohci3 3 irq18: ohci2 ohci4 3 irq20: fwohci0 1 irq22: ahci0 298745 cpu0:timer 1286507 irq256: re0 16122 cpu1:timer 982847 cpu3:timer 972013 cpu2:timer 5529651 Total 9091264 KDB: stack backtrace: db_trace_self_wrapper(c0e89956,41d841,ecf96a40,c0cdc57e,80008d7d,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c0e7e1ea,8ab8c0,0,8ab8c0,0,...) at kdb_backtrace+0x2a watchdog_fire(1,0,c0e7e0b7,216,c7045b80,...) at watchdog_fire+0xa9 hardclock_anycpu(1,0,ecf96b10,c09b47fd,0,...) at hardclock_anycpu+0x262 handleevents(ecf96b30,c0a43199,c804bae0,80300,c0e94e92,856,14c2,537f11e0,70bf53c,5b46580) at handleevents+0x108 timercb(c11e6180,0,2,c0e7b9d4,c0eb851d,...) at timercb+0x29d lapic_handle_timer(ecf96b74) at lapic_handle_timer+0x83 Xtimerint() at Xtimerint+0x20 --- interrupt, eip = 0xc0a53fe2, esp = 0xecf96bb4, ebp = 0xecf96bbc --- strncmp(c0eb851c,c0e7b9d2,3,c7045b80,ecf96c30,...) at strncmp+0x32 fixup_filename(246,c6d5b450,c7045c30,c0e966a1,ecf96c10,...) at fixup_filename+0x2b witness_checkorder(c118efa8,9,c0eb851c,687,0,...) at witness_checkorder+0x68 _mtx_lock_flags(c118efa8,0,c0eb851c,687,8,...) at _mtx_lock_flags+0xc4 process_worklist_item(c118efa8,0,c0eb851c,5c5,c7045b80,...) at process_worklist_item+0x2f4 softdep_process_worklist(c776a2d4,0,c0eb851c,538,3e8,...) at softdep_process_worklist+0x83 softdep_flush(0,ecf96d28,c0e8036c,390,c73a42bc,...) at softdep_flush+0x2a0 fork_exit(c0bd8570,0,ecf96d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf96d60, ebp = 0 --- KDB: enter: watchdog timeout [ thread pid 18 tid 100075 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db> run pho db:0:pho> bt Tracing pid 18 tid 100075 td 0xc7045b80 kdb_enter(c0d29436,c0e19439,0,8ab8c0,0) at kdb_enter+0x3a watchdog_fire(1,0,c0e7e0b7,216,c7045b80,...) at watchdog_fire+0xbd hardclock_anycpu(1,0,ecf96b10,c09b47fd,0,...) at hardclock_anycpu+0x262 handleevents(ecf96b30,c0a43199,c804bae0,80300,c0e94e92,856,14c2,537f11e0,70bf53c,5b46580) at handleevents+0x108 timercb(c11e6180,0,2,c0e7b9d4,c0eb851d,...) at timercb+0x29d lapic_handle_timer(ecf96b74) at lapic_handle_timer+0x83 Xtimerint() at Xtimerint+0x20 --- interrupt, eip = 0xc0a53fe2, esp = 0xecf96bb4, ebp = 0xecf96bbc --- strncmp(c0eb851c,c0e7b9d2,3,c7045b80,ecf96c30,...) at strncmp+0x32 fixup_filename(246,c6d5b450,c7045c30,c0e966a1,ecf96c10,...) at fixup_filename+0x2b witness_checkorder(c118efa8,9,c0eb851c,687,0,...) at witness_checkorder+0x68 _mtx_lock_flags(c118efa8,0,c0eb851c,687,8,...) at _mtx_lock_flags+0xc4 process_worklist_item(c118efa8,0,c0eb851c,5c5,c7045b80,...) at process_worklist_item+0x2f4 softdep_process_worklist(c776a2d4,0,c0eb851c,538,3e8,...) at softdep_process_worklist+0x83 softdep_flush(0,ecf96d28,c0e8036c,390,c73a42bc,...) at softdep_flush+0x2a0 fork_exit(c0bd8570,0,ecf96d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xecf96d60, ebp = 0 --- db:0:bt> show allpcpu Current CPU: 2 cpuid = 0 dynamic pcpu = 0x44e580 curthread = 0xc6ecc000: pid 13 "g_up" curpcb = 0xc6b4cd80 fpcurthread = none idlethread = 0xc6dbf000: tid 100006 "idle: cpu0" APIC ID = 0 currentldt = 0x50 spin locks held: cpuid = 1 dynamic pcpu = 0x5b43580 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 = 0x5b46580 curthread = 0xc7045b80: pid 18 "softdepflush" curpcb = 0xecf96d80 fpcurthread = none idlethread = 0xc6dbf5c0: tid 100004 "idle: cpu2" APIC ID = 2 currentldt = 0x50 spin locks held: cpuid = 3 dynamic pcpu = 0x5b49580 curthread = 0xc6dbf8a0: pid 11 "idle: cpu3" curpcb = 0xc6b2ad80 fpcurthread = none idlethread = 0xc6dbf8a0: tid 100003 "idle: cpu3" APIC ID = 3 currentldt = 0x50 spin locks held: db:0:allpcpu> show alllocks Process 9684 (sshd) thread 0xc7d895c0 (100193) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7a0108c) locked @ kern/uipc_sockbuf.c:148 Process 2308 (suj17) thread 0xc7db22e0 (100189) exclusive lockmgr ufs (ufs) r = 0 (0xc7de6df0) locked @ kern/vfs_vnops.c:655 Process 2307 (suj17) thread 0xc7d8a000 (100161) exclusive lockmgr ufs (ufs) r = 0 (0xc804b9dc) locked @ kern/vfs_vnops.c:655 Process 2306 (suj17) thread 0xc7db2b80 (100186) exclusive lockmgr ufs (ufs) r = 0 (0xc7826c94) locked @ kern/vfs_vnops.c:655 Process 2305 (suj17) thread 0xc7db3000 (100185) exclusive lockmgr ufs (ufs) r = 0 (0xc804bc94) locked @ kern/vfs_vnops.c:655 Process 2304 (suj17) thread 0xc7d8a5c0 (100159) exclusive lockmgr bufwait (bufwait) r = 0 (0xe0793840) locked @ kern/vfs_bio.c:1911 exclusive lockmgr bufwait (bufwait) r = 0 (0xe0760540) locked @ kern/vfs_bio.c:2658 exclusive lockmgr ufs (ufs) r = 0 (0xc804bb38) locked @ kern/vfs_vnops.c:655 Process 2303 (suj17) thread 0xc77fe2e0 (100095) exclusive lockmgr ufs (ufs) r = 0 (0xc7e6edf0) locked @ kern/vfs_vnops.c:655 Process 2244 (sshd) thread 0xc747c8a0 (100138) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7a0056c) locked @ kern/uipc_sockbuf.c:148 Process 2224 (tail) thread 0xc78205c0 (100165) shared lockmgr ufs (ufs) r = 0 (0xc77ea724) locked @ kern/vfs_subr.c:2134 Process 2217 (sshd) thread 0xc78222e0 (100114) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc79f422c) locked @ kern/uipc_sockbuf.c:148 Process 2216 (sshd) thread 0xc7db48a0 (100177) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc781256c) locked @ kern/uipc_sockbuf.c:148 Process 2215 (sshd) thread 0xc77fd2e0 (100100) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc7b0d08c) locked @ kern/uipc_sockbuf.c:148 Process 1708 (syslogd) thread 0xc75078a0 (100119) exclusive lockmgr ufs (ufs) r = 0 (0xc799ddf0) locked @ kern/vfs_syscalls.c:3515 Process 17 (syncer) thread 0xc7170000 (100074) exclusive lockmgr ufs (ufs) r = 0 (0xc803e310) locked @ kern/vfs_subr.c:2134 exclusive lockmgr syncer (syncer) r = 0 (0xc803e058) locked @ kern/vfs_subr.c:1734 db:0:alllocks> show lockedvnods Locked vnodes 0xc77ea6cc: tag ufs, type VDIR usecount 1, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc7451330 ref 0 pages 1 lock type ufs: SHARED (count 1) #0 0xc09903f5 at __lockmgr_args+0x5a5 #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a4318b at vget+0xbb #5 0xc0a2d90b at cache_lookup+0x67b #6 0xc0a2daed at vfs_cache_lookup+0xad #7 0xc0cf5e25 at VOP_LOOKUP_APV+0xe5 #8 0xc0a3547b at lookup+0x67b #9 0xc0a362e2 at namei+0x592 #10 0xc0a475f2 at kern_statat_vnhook+0x72 #11 0xc0a4774c at kern_statat+0x3c #12 0xc0a47896 at kern_stat+0x36 #13 0xc0a4793f at stat+0x2f #14 0xc09eada3 at syscallenter+0x263 #15 0xc0cd24ff at syscall+0x4f #16 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 6052864, on dev ada0s1e 0xc799dd98: tag ufs, type VREG usecount 2, writecount 1, refcount 5 mountedhere 0 flags () v_object 0xc7823908 ref 0 pages 8 lock type ufs: EXCL by thread 0xc75078a0 (pid 1708) with shared waiters pending #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a4c8e6 at fsync+0x106 #5 0xc09eada3 at syscallenter+0x263 #6 0xc0cd24ff at syscall+0x4f #7 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 6052868, on dev ada0s1e 0xc803e2b8: tag ufs, type VDIR usecount 9, writecount 0, refcount 14 mountedhere 0 flags (VV_ROOT) v_object 0xc78363b8 ref 0 pages 1 lock type ufs: EXCL by thread 0xc7170000 (pid 17) with shared waiters pending #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a4318b at vget+0xbb #5 0xc0bdc2a6 at ffs_sync+0x216 #6 0xc0a45a7f at sync_fsync+0x18f #7 0xc0cf34d5 at VOP_FSYNC_APV+0xc5 #8 0xc0a428bb at sync_vnode+0x16b #9 0xc0a42c12 at sched_sync+0x282 #10 0xc097bbc8 at fork_exit+0xb8 #11 0xc0cbb9d4 at fork_trampoline+0x8 ino 2, on dev md5a 0xc803e000: tag syncer, type VNON usecount 1, writecount 0, refcount 2 mountedhere 0 flags () lock type syncer: EXCL by thread 0xc7170000 (pid 17) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0a300c5 at vop_stdlock+0x65 #2 0xc0cf4ca5 at VOP_LOCK1_APV+0xb5 #3 0xc0a50048 at _vn_lock+0x78 #4 0xc0a42892 at sync_vnode+0x142 #5 0xc0a42c12 at sched_sync+0x282 #6 0xc097bbc8 at fork_exit+0xb8 #7 0xc0cbb9d4 at fork_trampoline+0x8 0xc7e6ed98: tag ufs, type VREG usecount 1, writecount 1, refcount 75 mountedhere 0 flags () v_object 0xc7e8b880 ref 0 pages 292 lock type ufs: EXCL by thread 0xc77fe2e0 (pid 2303) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 5, on dev md5a 0xc804bc3c: tag ufs, type VREG usecount 1, writecount 1, refcount 298 mountedhere 0 flags () v_object 0xc7cb3440 ref 0 pages 1184 lock type ufs: EXCL by thread 0xc7db3000 (pid 2305) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 6, on dev md5a 0xc804bae0: tag ufs, type VREG usecount 1, writecount 1, refcount 188 mountedhere 0 flags () v_object 0xc7e8b110 ref 0 pages 744 lock type ufs: EXCL by thread 0xc7d8a5c0 (pid 2304) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 7, on dev md5a 0xc7826c3c: tag ufs, type VREG usecount 1, writecount 1, refcount 481 mountedhere 0 flags () v_object 0xc7af9d48 ref 0 pages 1916 lock type ufs: EXCL by thread 0xc7db2b80 (pid 2306) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 8, on dev md5a 0xc804b984: tag ufs, type VREG usecount 1, writecount 1, refcount 98 mountedhere 0 flags () v_object 0xc7b06a18 ref 0 pages 384 lock type ufs: EXCL by thread 0xc7d8a000 (pid 2307) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 9, on dev md5a 0xc7de6d98: tag ufs, type VREG usecount 1, writecount 1, refcount 86 mountedhere 0 flags () v_object 0xc7e59cc0 ref 0 pages 336 lock type ufs: EXCL by thread 0xc7db22e0 (pid 2308) #0 0xc0990a4e at __lockmgr_args+0xbfe #1 0xc0be0d81 at ffs_lock+0xa1 #2 0xc0cf4ca5 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 0xc0cd24ff at syscall+0x4f #9 0xc0cbb9c1 at Xint0x80_syscall+0x21 ino 11, on dev md5a db:0:lockedvnods> show mount 0xc73f5b50 /dev/ad4s1a on / (ufs) 0xc73f6000 devfs on /dev (devfs) 0xc73f587c /dev/ad4s1f on /home (ufs) 0xc7775000 /dev/ad4s1d on /usr (ufs) 0xc7774b50 /dev/ad4s1e on /var (ufs) 0xc777487c procfs on /proc (procfs) 0xc77745a8 linprocfs on /usr/compat/linux/proc (linprocfs) 0xc77742d4 /dev/label/tmp on /tmp (ufs) 0xc776a2d4 /dev/md5a on /mnt (ufs) More info: show mount db:0:mount> ps pid ppid pgrp uid state wmesg wchan cmd 9802 2227 2225 1001 S nanslp 0xc1012904 sleep 9724 9687 9724 1001 D+ ufs 0xc803e310 ls 9687 9686 9687 1001 Ss+ ttyin 0xc7e5fa70 bash 9686 9684 9684 1001 S select 0xc73ea224 sshd 9684 2080 9684 0 Ss sbwait 0xc7a010b8 sshd 3685 3684 2125 0 D ufs 0xc803e310 ls 3684 2125 2125 0 S wait 0xc776c834 sh 2308 2302 2301 1001 D+ getblk 0xe0760540 suj17 2307 2302 2301 1001 D+ getblk 0xe0760540 suj17 2306 2302 2301 1001 D+ getblk 0xe0760540 suj17 2305 2302 2301 1001 D+ getblk 0xe0760540 suj17 2304 2302 2301 1001 RL+ suj17 2303 2302 2301 1001 D+ getblk 0xe0760540 suj17 2302 2301 2301 1001 S+ wait 0xc7d91af0 suj17 2301 2300 2301 1001 S+ wait 0xc776daf0 bash 2300 2276 2276 0 S+ wait 0xc7d91000 su 2295 0 0 0 DL mdwait 0xc7348000 [md5] 2276 2272 2276 0 S+ wait 0xc7501af0 sh 2272 2268 2272 0 S+ wait 0xc741e000 bash 2268 2252 2268 0 S+ pause 0xc790388c csh 2252 2247 2252 1001 S+ wait 0xc776b834 su 2247 2246 2247 1001 Ss+ wait 0xc7d90af0 bash 2246 2244 2244 1001 S select 0xc70168e4 sshd 2244 2080 2244 0 Ss sbwait 0xc7a00598 sshd 2228 2225 2225 1001 S piperd 0xc7901620 awk 2227 2225 2225 1001 S wait 0xc776d000 sh 2226 2221 2226 1001 Ss+ select 0xc716c2e4 top 2225 2223 2225 1001 Ss wait 0xc776caf0 sh 2224 2222 2224 1001 Ds ufs 0xc799ddf0 tail 2223 2216 2216 1001 S select 0xc7016364 sshd 2222 2217 2217 1001 S select 0xc790e2a4 sshd 2221 2215 2215 1001 S select 0xc7423ce4 sshd 2217 2080 2217 0 Ss sbwait 0xc79f4258 sshd 2216 2080 2216 0 Ss sbwait 0xc7812598 sshd 2215 2080 2215 0 Ss sbwait 0xc7b0d0b8 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 0xc73eace4 inetd 2125 1 2125 0 Ss wait 0xc77f7578 watchdogd 2100 1 2100 0 Ss nanslp 0xc1012904 cron 2092 1 2092 25 Ss pause 0xc7af6058 sendmail 2088 1 2088 0 Ss select 0xc73ead24 sendmail 2080 1 2080 0 Ss select 0xc70218a4 sshd 2020 1 2020 0 Ss select 0xc73eada4 moused 1960 1 1960 0 Ss select 0xc790e2e4 ntpd 1842 1841 1841 0 S (threaded) nfsd 100131 S rpcsvc 0xc79fad10 nfsd: service 100130 S rpcsvc 0xc6f7f350 nfsd: service 100129 S rpcsvc 0xc79f9850 nfsd: service 100088 S rpcsvc 0xc6f7f490 nfsd: master 1841 1 1841 0 Ss select 0xc73eade4 nfsd 1832 1 1832 0 Ss select 0xc73eae24 mountd 1733 1 1733 0 Ss select 0xc716c9e4 rpcbind 1708 1 1708 0 Ds getbuf 0xe08a1dfc syslogd 1507 1 1507 0 Ss select 0xc73eae64 devd 18 0 0 0 RL CPU 2 [softdepflush] 17 0 0 0 DL getblk 0xe0760540 [syncer] 16 0 0 0 DL vlruwt 0xc73a4834 [vnlru] 9 0 0 0 DL psleep 0xc1188728 [bufdaemon] 8 0 0 0 DL pgzero 0xc1190e5c [pagezero] 7 0 0 0 DL psleep 0xc1190a48 [vmdaemon] 6 0 0 0 DL psleep 0xc1190a10 [pagedaemon] 5 0 0 0 DL ccb_scan 0xc0fd77d4 [xpt_thrd] 4 0 0 0 DL waiting_ 0xc118a558 [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 - 0xc1011704 [yarrow] 13 0 0 0 RL (threaded) [geom] 100015 D - 0xc100f348 [g_down] 100014 Run CPU 0 [g_up] 100013 D - 0xc100f33c [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 Run CPU 3 [idle: cpu3] 1 0 1 0 SLs wait 0xc6dbdaf0 [init] 10 0 0 0 DL audit_wo 0xc118e780 [audit] 0 0 0 0 DLs (threaded) [kernel] 100076 D - 0xc71853c0 [mca taskq] 100066 D - 0xc1011704 [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 0xc100f420 [swapper] db:0:ps> allt Tracing command sleep pid 9802 tid 100206 td 0xc8a162e0 sched_switch(c8a162e0,0,104,191,d182388d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c8a162e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(2711,c09e7470,c8a162e0,0,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c1012904,6c,c0e86f77,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c1012904,0,16c,c0e86f77,2711,...) at _sleep+0x328 kern_nanosleep(c8a162e0,ef3d0c34,ef3d0c3c,a,0,...) at kern_nanosleep+0xc1 nanosleep(c8a162e0,ef3d0cec,ef3d0d28,c0e8babe,0,...) at nanosleep+0x6f syscallenter(c8a162e0,ef3d0ce4,ef3d0ce4,0,0,...) at syscallenter+0x263 syscall(ef3d0d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28165b67, esp = 0xbfbfec5c, ebp = 0xbfbfeca8 --- Tracing command ls pid 9724 tid 100098 td 0xc77fd8a0 sched_switch(c77fd8a0,0,104,191,31870aaf,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c77fd8a0,0,c0e8b180,268,c803e310,...) at sleepq_switch+0x162 sleepq_wait(c803e310,60,c0e7c770,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c803e310,200100,c803e37c,0,0,...) at __lockmgr_args+0x4cf ffs_lock(ef1ed8b0,c09f23db,c0e941f7,200100,c803e2b8,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0fbb360,ef1ed8b0,c77fd950,c0fd6320,c803e2b8,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c803e2b8,200100,c0e94e92,856,4,...) at _vn_lock+0x78 vget(c803e2b8,200100,c77fd8a0,50,0,...) at vget+0xbb vfs_hash_get(c776a2d4,2,200000,c77fd8a0,ef1ed9c4,...) at vfs_hash_get+0xed ffs_vgetf(c776a2d4,2,200000,ef1ed9c4,0,...) at ffs_vgetf+0x49 ffs_vget(c776a2d4,2,200000,ef1ed9c4,ef1edb2c,...) at ffs_vget+0x2e ufs_root(c776a2d4,200000,ef1eda30,1f5,ef1edb44,...) at ufs_root+0x28 lookup(ef1edb2c,c0e942dd,ee,c9,c77f6578,...) at lookup+0x9a1 namei(ef1edb2c,ef1edc2c,c0c0085e,c3897f50,0,...) at namei+0x592 kern_statat_vnhook(c77fd8a0,200,ffffff9c,2842e2f8,0,...) at kern_statat_vnhook+0x72 kern_statat(c77fd8a0,200,ffffff9c,2842e2f8,0,...) at kern_statat+0x3c kern_lstat(c77fd8a0,2842e2f8,0,ef1edbe8,ef1edc24,...) at kern_lstat+0x36 lstat(c77fd8a0,ef1edcec,2851b004,1,0,...) at lstat+0x2f syscallenter(c77fd8a0,ef1edce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef1edd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (190, FreeBSD ELF32, lstat), eip = 0x281c8603, esp = 0xbfbfe3cc, ebp = 0xbfbfe458 --- Tracing command bash pid 9687 tid 100101 td 0xc7508b80 sched_switch(c7508b80,0,104,191,5773f62,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7508b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7e5fa04,0,c0e84007,c7508b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7e5fa70,0,ef1f6ad8,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7e5fa70,c7e5fa04,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7e5fa00,c7e5fa70,ef1f6c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7e5fa00,ef1f6c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c8ac9800,ef1f6c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7cb2380,ef1f6c28,c8b0c400,0,c7508b80,...) at devfs_read_f+0x7e dofileread(ef1f6c28,ffffffff,ffffffff,0,c7cb2380,...) at dofileread+0x9e kern_readv(c7508b80,0,ef1f6c28,ef1f6c48,1,...) at kern_readv+0x58 read(c7508b80,ef1f6cec,ef1f6d28,c0e8babe,0,...) at read+0x4f syscallenter(c7508b80,ef1f6ce4,ef1f6ce4,0,0,...) at syscallenter+0x263 syscall(ef1f6d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x28354623, esp = 0xbfbfdfcc, ebp = 0xbfbfdff8 --- Tracing command sshd pid 9686 tid 100181 td 0xc7db3b80 sched_switch(c7db3b80,0,104,191,579bd32,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7db3b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73ea210,0,c0e84007,c7db3b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73ea224,0,ef37fa4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73ea224,c73ea210,c0e8d785,627,c8b0b428,...) at _cv_wait_sig+0x243 seltdwait(c8b0b428,58,c8a8fd00,c7db3b80,246,...) at seltdwait+0xa2 kern_select(c7db3b80,c,288060b8,288060dc,0,0,20,c8037834,c8037834) at kern_select+0x504 select(c7db3b80,ef37fcec,ef37fd28,c0e8babe,0,...) at select+0x66 syscallenter(c7db3b80,ef37fce4,ef37fce4,0,0,...) at syscallenter+0x263 syscall(ef37fd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 9684 tid 100193 td 0xc7d895c0 sched_switch(c7d895c0,0,104,191,7cdf82fb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c7d895c0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7a010b8,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7a010b8,c7a01078,168,c0e915e1,0) at _sleep+0x35c sbwait(c7a01054,4,c0e916b9,5ec,c7a01078,...) at sbwait+0x76 soreceive_generic(c7a01000,0,ef3a9c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7a01000,0,ef3a9c28,0,0,0) at soreceive+0x38 soo_read(c8b0bce8,ef3a9c28,c7490d80,0,c7d895c0,...) at soo_read+0x4e dofileread(ef3a9c28,ffffffff,ffffffff,0,c8b0bce8,...) at dofileread+0x9e kern_readv(c7d895c0,5,ef3a9c28,ef3a9c48,1,...) at kern_readv+0x58 read(c7d895c0,ef3a9cec,ef3a9d28,c0e8babe,0,...) at read+0x4f syscallenter(c7d895c0,ef3a9ce4,ef3a9ce4,0,0,...) at syscallenter+0x263 syscall(ef3a9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command ls pid 3685 tid 100110 td 0xc75098a0 sched_switch(c75098a0,0,104,191,432fa8c,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c75098a0,0,c0e8b180,268,c803e310,...) at sleepq_switch+0x162 sleepq_wait(c803e310,60,c0e7c770,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c803e310,200100,c803e37c,0,0,...) at __lockmgr_args+0x4cf ffs_lock(ef21f8b0,c09f23db,c0e941f7,200100,c803e2b8,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0fbb360,ef21f8b0,c7509950,c0fd6320,c803e2b8,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c803e2b8,200100,c0e94e92,856,4,...) at _vn_lock+0x78 vget(c803e2b8,200100,c75098a0,50,0,...) at vget+0xbb vfs_hash_get(c776a2d4,2,200000,c75098a0,ef21f9c4,...) at vfs_hash_get+0xed ffs_vgetf(c776a2d4,2,200000,ef21f9c4,0,...) at ffs_vgetf+0x49 ffs_vget(c776a2d4,2,200000,ef21f9c4,ef21fb2c,...) at ffs_vget+0x2e ufs_root(c776a2d4,200000,ef21fa30,1f5,ef21fb44,...) at ufs_root+0x28 lookup(ef21fb2c,c0e942dd,ee,c9,c781b000,...) at lookup+0x9a1 namei(ef21fb2c,ef21facc,60,0,c75098a0,...) at namei+0x592 kern_statat_vnhook(c75098a0,200,ffffff9c,2841d3b8,0,...) at kern_statat_vnhook+0x72 kern_statat(c75098a0,200,ffffff9c,2841d3b8,0,...) at kern_statat+0x3c kern_lstat(c75098a0,2841d3b8,0,ef21fbe8,500ff00,...) at kern_lstat+0x36 lstat(c75098a0,ef21fcec,ef21fd28,c0e8babe,0,...) at lstat+0x2f syscallenter(c75098a0,ef21fce4,ef21fce4,0,0,...) at syscallenter+0x263 syscall(ef21fd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (190, FreeBSD ELF32, lstat), eip = 0x281c8603, esp = 0xbfbfe5dc, ebp = 0xbfbfe668 --- Tracing command sh pid 3684 tid 100153 td 0xc7afb2e0 sched_switch(c7afb2e0,0,104,191,3e7ae68,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7afb2e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c776c834,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c776c834,c776c8bc,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7afb2e0,ffffffff,ef30dc44,2,0,...) at kern_wait+0xbe6 wait4(c7afb2e0,ef30dcec,2820ed08,1,0,...) at wait4+0x3b syscallenter(c7afb2e0,ef30dce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef30dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfeb1c, ebp = 0xbfbfeb38 --- Tracing command suj17 pid 2308 tid 100189 td 0xc7db22e0 sched_switch(c7db22e0,0,104,191,74d36bbc,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7db22e0,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,c715b800,...) at bread+0x4c softdep_journal_freeblocks(c7dfebc8,c715b800,a74869,0,800,...) at softdep_journal_freeblocks+0xbaf ffs_truncate(c7de6d98,a74869,0,800,c715b800,...) at ffs_truncate+0x94e ufs_setattr(ef39dbf0,c0ed9e54,c7de6d98,ef39db88,c7de6d98,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef39dbf0,c7de6d98,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c7447a10,a74869,0,c715b800,c7db22e0,...) at vn_truncate+0x145 kern_ftruncate(c7db22e0,3,a74869,0,ef39dc7c,...) at kern_ftruncate+0xe7 ftruncate(c7db22e0,ef39dcec,ef39dd28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c7db22e0,ef39dce4,ef39dce4,0,c101f580,...) at syscallenter+0x263 syscall(ef39dd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2307 tid 100161 td 0xc7d8a000 sched_switch(c7d8a000,0,104,191,753faefa,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7d8a000,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,0,...) at bread+0x4c ffs_update(c804b984,1,0,1,c715b800,...) at ffs_update+0x172 ffs_truncate(c804b984,5994ae3,0,800,c715b800,...) at ffs_truncate+0x886 ufs_setattr(ef325bf0,c0ed9e54,c804b984,ef325b88,c804b984,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef325bf0,c804b984,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74a2e70,5994ae3,0,c715b800,c7d8a000,...) at vn_truncate+0x145 kern_ftruncate(c7d8a000,3,5994ae3,0,ef325c7c,...) at kern_ftruncate+0xe7 ftruncate(c7d8a000,ef325cec,ef325d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c7d8a000,ef325ce4,ef325ce4,0,c1020280,...) at syscallenter+0x263 syscall(ef325d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2306 tid 100186 td 0xc7db2b80 sched_switch(c7db2b80,0,104,191,7421feee,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7db2b80,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,c715b800,...) at bread+0x4c softdep_journal_freeblocks(c803c984,c715b800,355d7e1,0,800,...) at softdep_journal_freeblocks+0xbaf ffs_truncate(c7826c3c,355d7e1,0,800,c715b800,...) at ffs_truncate+0x94e ufs_setattr(ef393bf0,c0ed9e54,c7826c3c,ef393b88,c7826c3c,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef393bf0,c7826c3c,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74a2038,355d7e1,0,c715b800,c7db2b80,...) at vn_truncate+0x145 kern_ftruncate(c7db2b80,3,355d7e1,0,ef393c7c,...) at kern_ftruncate+0xe7 ftruncate(c7db2b80,ef393cec,c09cd77d,c1020b38,0,...) at ftruncate+0x28 syscallenter(c7db2b80,ef393ce4,ef393cc0,c09cfe08,c1020900,...) at syscallenter+0x263 syscall(ef393d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2305 tid 100185 td 0xc7db3000 sched_switch(c7db3000,0,104,191,746b232d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7db3000,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,c715b800,...) at bread+0x4c softdep_journal_freeblocks(c804db54,c715b800,2752e1f,0,800,...) at softdep_journal_freeblocks+0xbaf ffs_truncate(c804bc3c,2752e1f,0,800,c715b800,...) at ffs_truncate+0x94e ufs_setattr(ef38fbf0,c0ed9e54,c804bc3c,ef38fb88,c804bc3c,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef38fbf0,c804bc3c,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c7432888,2752e1f,0,c715b800,c7db3000,...) at vn_truncate+0x145 kern_ftruncate(c7db3000,3,2752e1f,0,ef38fc7c,...) at kern_ftruncate+0xe7 ftruncate(c7db3000,ef38fcec,ef38fd28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c7db3000,ef38fce4,ef38fce4,0,c1020900,...) at syscallenter+0x263 syscall(ef38fd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2304 tid 100159 td 0xc7d8a5c0 sched_switch(c7d8a5c0,0,602,18c,73ae447e,...) at sched_switch+0x3bc mi_switch(602,0,c0e8627f,cd,8,...) at mi_switch+0x219 critical_exit(c7d8a5c0,0,2,c7d8a5c0,e25fc000,...) at critical_exit+0xa8 ipi_bitmap_handler(8,28,28,e2600000,e25fc000,...) at ipi_bitmap_handler+0x82 Xipi_intr_bitmap_handler() at Xipi_intr_bitmap_handler+0x2f --- interrupt, eip = 0xc0cc54ab, esp = 0xef31f464, ebp = 0xef31f468 --- spinlock_exit(c102e054,4,c0e84007,109) at spinlock_exit+0x2b _mtx_unlock_spin_flags(c102e054,0,c0ed1f01,4be,f6) at _mtx_unlock_spin_flags+0xf4 smp_tlb_shootdown(ef31f4d4,c0cc9d6f,e25fc000,e2600000,c6d757b8,...) at smp_tlb_shootdown+0xc0 smp_invlpg_range(e25fc000,e2600000,c6d757b8,0,e2600000,...) at smp_invlpg_range+0x1c pmap_invalidate_range(c11b0540,e25fc000,e2600000) at pmap_invalidate_range+0x4f pmap_qremove(e25fc000,4,ef31f540,246,0,...) at pmap_qremove+0x54 allocbuf(e07937e0,0,c0a256b5,c6d757b8,0,...) at allocbuf+0x18d brelse(e07937e0,e07937e0,df,e07937e0,e25feac0,...) at brelse+0x172 bufwrite(e07937e0,0,c0ebb24c,767,0) at bufwrite+0x16f ffs_bufwrite(e07937e0,0,c0eb851c,c25,c09f3266,...) at ffs_bufwrite+0x290 softdep_process_journal(c0eb851c,2335,0,c7d8a5c0,e07604e0,...) at softdep_process_journal+0x7a8 jwait(c118efa8,0,c0eb851c,2335,c803e668,...) at jwait+0x2a softdep_disk_io_initiation(e07604e0,3,e07604e0,0,0,...) at softdep_disk_io_initiation+0x1817 ffs_geom_strategy(c803e668,e07604e0,df,e07604e0,c804dae0,...) at ffs_geom_strategy+0x14f bufwrite(e07604e0,0,c0ebb24c,767,0) at bufwrite+0x159 ffs_bufwrite(e07604e0,c8046000,100,4000,0,...) at ffs_bufwrite+0x290 ffs_update(c804bae0,1,0,1,c715b800,...) at ffs_update+0x28c ffs_truncate(c804bae0,36e84ea,0,800,c715b800,...) at ffs_truncate+0x886 ufs_setattr(ef31fbf0,c0ed9e54,c804bae0,ef31fb88,c804bae0,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef31fbf0,c804bae0,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74470a8,36e84ea,0,c715b800,c7d8a5c0,...) at vn_truncate+0x145 kern_ftruncate(c7d8a5c0,3,36e84ea,0,ef31fc7c,...) at kern_ftruncate+0xe7 ftruncate(c7d8a5c0,ef31fcec,c09cd78c,c10202b0,0,...) at ftruncate+0x28 syscallenter(c7d8a5c0,ef31fce4,ef31fcc0,c09cfe08,c1020280,...) at syscallenter+0x263 syscall(ef31fd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2303 tid 100095 td 0xc77fe2e0 sched_switch(c77fe2e0,0,104,191,74122c12,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c77fe2e0,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,c715b800,...) at bread+0x4c softdep_journal_freeblocks(c803c9f8,c715b800,32bd700,0,800,...) at softdep_journal_freeblocks+0xbaf ffs_truncate(c7e6ed98,32bd700,0,800,c715b800,...) at ffs_truncate+0x94e ufs_setattr(ef1e4bf0,c0ed9e54,c7e6ed98,ef1e4b88,c7e6ed98,...) at ufs_setattr+0x738 VOP_SETATTR_APV(c0fbb360,ef1e4bf0,c7e6ed98,28f,0,...) at VOP_SETATTR_APV+0xc5 vn_truncate(c74a2700,32bd700,0,c715b800,c77fe2e0,...) at vn_truncate+0x145 kern_ftruncate(c77fe2e0,3,32bd700,0,ef1e4c7c,...) at kern_ftruncate+0xe7 ftruncate(c77fe2e0,ef1e4cec,ef1e4d28,c0e8babe,0,...) at ftruncate+0x28 syscallenter(c77fe2e0,ef1e4ce4,ef1e4ce4,0,c101f580,...) at syscallenter+0x263 syscall(ef1e4d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (480, FreeBSD ELF32, ftruncate), eip = 0x28169e5b, esp = 0xbfbfe76c, ebp = 0xbfbfe798 --- Tracing command suj17 pid 2302 tid 100190 td 0xc7db2000 sched_switch(c7db2000,0,104,191,f0f5f85b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7db2000,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7d91af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7d91af0,c7d91b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7db2000,ffffffff,ef3a0c44,0,0,...) at kern_wait+0xbe6 wait4(c7db2000,ef3a0cec,28195d08,1,0,...) at wait4+0x3b syscallenter(c7db2000,ef3a0ce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef3a0d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x280f093b, esp = 0xbfbfe82c, ebp = 0xbfbfe848 --- Tracing command bash pid 2301 tid 100147 td 0xc7afc5c0 sched_switch(c7afc5c0,0,104,191,f095d415,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7afc5c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c776daf0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c776daf0,c776db78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7afc5c0,ffffffff,ef2fbc44,0,0,...) at kern_wait+0xbe6 wait4(c7afc5c0,ef2fbcec,28368d08,1,0,...) at wait4+0x3b syscallenter(c7afc5c0,ef2fbce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef2fbd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe3ec, ebp = 0xbfbfe408 --- Tracing command su pid 2300 tid 100162 td 0xc7822000 sched_switch(c7822000,0,104,191,efcc260a,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7822000,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7d91000,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7d91000,c7d91088,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7822000,8fd,ef328c44,2,0,...) at kern_wait+0xbe6 wait4(c7822000,ef328cec,281c8d08,1,0,...) at wait4+0x3b syscallenter(c7822000,ef328ce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef328d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2812393b, esp = 0xbfbfe32c, ebp = 0xbfbfe348 --- Tracing command md5 pid 2295 tid 100150 td 0xc7afbb80 sched_switch(c7afbb80,0,104,191,86e28c86,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c7afbb80,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,ef304d28,c0e8036c,390,c776d2bc,...) at md_kthread+0x11a fork_exit(c07276f0,c7348000,ef304d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xef304d60, ebp = 0 --- Tracing command sh pid 2276 tid 100117 td 0xc7508000 sched_switch(c7508000,0,104,191,ee81d3e2,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7508000,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7501af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7501af0,c7501b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7508000,ffffffff,ef24cc44,2,0,...) at kern_wait+0xbe6 wait4(c7508000,ef24ccec,ef24cd28,c0e8babe,0,...) at wait4+0x3b syscallenter(c7508000,ef24cce4,ef24cce4,0,0,...) at syscallenter+0x263 syscall(ef24cd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfe83c, ebp = 0xbfbfe858 --- Tracing command bash pid 2272 tid 100081 td 0xc7425000 sched_switch(c7425000,0,104,191,7f7104c3,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7425000,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c741e000,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c741e000,c741e088,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7425000,ffffffff,ef199c44,6,0,...) at kern_wait+0xbe6 wait4(c7425000,ef199cec,ef199d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c7425000,ef199ce4,ef199ce4,0,0,...) at syscallenter+0x263 syscall(ef199d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command csh pid 2268 tid 100132 td 0xc790fb80 sched_switch(c790fb80,0,104,191,3d6f3525,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,74,...) at mi_switch+0x219 sleepq_switch(c790fb80,0,c0e8b180,1a7,74,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c790388c,74,c0d20e4e,100,0,...) at sleepq_wait_sig+0x17 _sleep(c790388c,c79038bc,174,c0d20e4e,0,...) at _sleep+0x35c kern_sigsuspend(c790fb80,0,0,0,0,...) at kern_sigsuspend+0xba sigsuspend(c790fb80,ef297cec,ef297d28,c0e8babe,0,...) at sigsuspend+0x4d syscallenter(c790fb80,ef297ce4,ef297ce4,0,0,...) at syscallenter+0x263 syscall(ef297d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818ac8b, esp = 0xbfbfe59c, ebp = 0xbfbfe608 --- Tracing command su pid 2252 tid 100158 td 0xc7d8a8a0 sched_switch(c7d8a8a0,0,104,191,b0a8af81,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7d8a8a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c776b834,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c776b834,c776b8bc,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7d8a8a0,8dc,ef31cc44,2,0,...) at kern_wait+0xbe6 wait4(c7d8a8a0,ef31ccec,281c8d08,1,0,...) at wait4+0x3b syscallenter(c7d8a8a0,ef31cce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef31cd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2812393b, esp = 0xbfbfe5cc, ebp = 0xbfbfe5e8 --- Tracing command bash pid 2247 tid 100163 td 0xc7820b80 sched_switch(c7820b80,0,104,191,ab942cb9,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7820b80,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7d90af0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7d90af0,c7d90b78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7820b80,ffffffff,ef32bc44,6,0,...) at kern_wait+0xbe6 wait4(c7820b80,ef32bcec,ef32bd28,c0e8babe,0,...) at wait4+0x3b syscallenter(c7820b80,ef32bce4,ef32bce4,0,0,...) at syscallenter+0x263 syscall(ef32bd28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282c393b, esp = 0xbfbfe97c, ebp = 0xbfbfe998 --- Tracing command sshd pid 2246 tid 100164 td 0xc78208a0 sched_switch(c78208a0,0,104,191,8f415960,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c78208a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c70168d0,0,c0e84007,c78208a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c70168e4,0,ef32ea4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c70168e4,c70168d0,c0e8d785,627,c74a2428,...) at _cv_wait_sig+0x243 seltdwait(c74a2428,58,c749e380,c78208a0,246,...) at seltdwait+0xa2 kern_select(c78208a0,c,288060b8,288060dc,0,0,20,c7d90834,c7d90834) at kern_select+0x504 select(c78208a0,ef32ecec,ef32ed28,c0e8babe,0,...) at select+0x66 syscallenter(c78208a0,ef32ece4,ef32ece4,0,0,...) at syscallenter+0x263 syscall(ef32ed28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2244 tid 100138 td 0xc747c8a0 sched_switch(c747c8a0,0,104,191,859c50df,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c747c8a0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7a00598,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7a00598,c7a00558,168,c0e915e1,0) at _sleep+0x35c sbwait(c7a00534,4,c0e916b9,5ec,c7a00558,...) at sbwait+0x76 soreceive_generic(c7a004e0,0,ef2c2c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7a004e0,0,ef2c2c28,0,0,0) at soreceive+0x38 soo_read(c7432460,ef2c2c28,c7490080,0,c747c8a0,...) at soo_read+0x4e dofileread(ef2c2c28,ffffffff,ffffffff,0,c7432460,...) at dofileread+0x9e kern_readv(c747c8a0,5,ef2c2c28,ef2c2c48,1,...) at kern_readv+0x58 read(c747c8a0,ef2c2cec,ef2c2d28,c0e8babe,0,...) at read+0x4f syscallenter(c747c8a0,ef2c2ce4,ef2c2ce4,0,0,...) at syscallenter+0x263 syscall(ef2c2d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command awk pid 2228 tid 100135 td 0xc747d2e0 sched_switch(c747d2e0,0,104,191,d1413de4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c747d2e0,0,c0e8b180,1a7,5c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7901620,5c,c0e8d943,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7901620,c7901790,15c,c0e8d943,0,...) at _sleep+0x35c pipe_read(c7492b60,ef2b9c28,c7490500,0,c747d2e0,...) at pipe_read+0x417 dofileread(ef2b9c28,ffffffff,ffffffff,0,c7492b60,...) at dofileread+0x9e kern_readv(c747d2e0,0,ef2b9c28,ef2b9c48,1,...) at kern_readv+0x58 read(c747d2e0,ef2b9cec,ef2b9d80,ef2b9c88,0,...) at read+0x4f syscallenter(c747d2e0,ef2b9ce4,c0cd2a16,0,0,...) at syscallenter+0x263 syscall(ef2b9d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x281b8623, esp = 0xbfbfe93c, ebp = 0xbfbfe958 --- Tracing command sh pid 2227 tid 100151 td 0xc7afb8a0 sched_switch(c7afb8a0,0,104,191,d15541d6,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7afb8a0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c776d000,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c776d000,c776d088,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7afb8a0,ffffffff,ef307c44,2,0,...) at kern_wait+0xbe6 wait4(c7afb8a0,ef307cec,ef307d28,c0e8babe,0,...) at wait4+0x3b syscallenter(c7afb8a0,ef307ce4,ef307ce4,0,0,...) at syscallenter+0x263 syscall(ef307d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfe98c, ebp = 0xbfbfe9a8 --- Tracing command top pid 2226 tid 100103 td 0xc77fd000 sched_switch(c77fd000,0,104,191,7608c796,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77fd000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef204a14,c099890a,c716c2d0,0,c77fd000,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c716c2e4,0,ef204a4c,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c716c2e4,c716c2d0,3e9,627,c74475b0,...) at _cv_timedwait_sig+0x252 seltdwait(ef204bf8,ef204c00,c7490c80,c77fd000,35324830,...) at seltdwait+0x8a kern_select(c77fd000,2,bfbfebac,0,0,ef204c40,20,1,0) at kern_select+0x504 select(c77fd000,ef204cec,ef204d28,c0e8babe,0,...) at select+0x66 syscallenter(c77fd000,ef204ce4,ef204ce4,0,0,...) at syscallenter+0x263 syscall(ef204d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x281ee5a3, esp = 0xbfbfeb4c, ebp = 0xbfbfeca8 --- Tracing command sh pid 2225 tid 100152 td 0xc7afb5c0 sched_switch(c7afb5c0,0,104,191,7bcfa503,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c7afb5c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c776caf0,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c776caf0,c776cb78,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c7afb5c0,ffffffff,ef30ac44,2,0,...) at kern_wait+0xbe6 wait4(c7afb5c0,ef30acec,2820ed08,1,0,...) at wait4+0x3b syscallenter(c7afb5c0,ef30ace4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef30ad28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2816993b, esp = 0xbfbfeb3c, ebp = 0xbfbfeb58 --- Tracing command tail pid 2224 tid 100165 td 0xc78205c0 sched_switch(c78205c0,0,104,191,a18f8628,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c78205c0,0,c0e8b180,268,c799ddf0,...) at sleepq_switch+0x162 sleepq_wait(c799ddf0,60,c0e7c770,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c799ddf0,200100,c799de5c,0,0,...) at __lockmgr_args+0x4cf ffs_lock(ef3318e4,c09f23db,c0e937a9,200100,c799dd98,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0fbb360,ef3318e4,c7820670,c0fd6320,c799dd98,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c799dd98,200100,c0e94e92,856,0,...) at _vn_lock+0x78 vget(c799dd98,200100,c78205c0,244,0,...) at vget+0xbb cache_lookup(c77ea6cc,ef331b44,ef331b58,ef331b44,c749e980,...) at cache_lookup+0x67b vfs_cache_lookup(ef331a20,c0e95c03,c0fd5f60,200000,ef331b2c,...) at vfs_cache_lookup+0xad VOP_LOOKUP_APV(c0fbb360,ef331a20,ef331b58,30f,ef331b44,...) at VOP_LOOKUP_APV+0xe5 lookup(ef331b2c,c0e942dd,ee,c9,c7d90578,...) at lookup+0x67b namei(ef331b2c,c7a0ccf0,c7b08400,ef331be0,c097608e,...) at namei+0x592 kern_statat_vnhook(c78205c0,0,ffffff9c,28406020,0,...) at kern_statat_vnhook+0x72 kern_statat(c78205c0,0,ffffff9c,28406020,0,...) at kern_statat+0x3c kern_stat(c78205c0,28406020,0,ef331be8,c78205c0,...) at kern_stat+0x36 stat(c78205c0,ef331cec,c09cd78c,c101fc30,0,...) at stat+0x2f syscallenter(c78205c0,ef331ce4,ef331cc0,c09cfe08,c101fc00,...) at syscallenter+0x263 syscall(ef331d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (188, FreeBSD ELF32, stat), eip = 0x28175623, esp = 0xbfbfeb1c, ebp = 0xbfbfebd8 --- Tracing command sshd pid 2223 tid 100139 td 0xc747c5c0 sched_switch(c747c5c0,0,104,191,66b39c97,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747c5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7016350,0,c0e84007,c747c5c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7016364,0,ef2c5a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7016364,c7016350,c0e8d785,627,c7447000,...) at _cv_wait_sig+0x243 seltdwait(c7447000,58,c7416200,c747c5c0,f33,...) at seltdwait+0xa2 kern_select(c747c5c0,c,288060b8,288060dc,0,0,20,c7af6834,c7af6834) at kern_select+0x504 select(c747c5c0,ef2c5cec,ef2c5d28,c0e8babe,0,...) at select+0x66 syscallenter(c747c5c0,ef2c5ce4,ef2c5ce4,0,0,...) at syscallenter+0x263 syscall(ef2c5d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2222 tid 100091 td 0xc7172b80 sched_switch(c7172b80,0,104,191,a1905c47,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7172b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c790e290,0,c0e84007,c7172b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c790e2a4,0,ef1d8a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c790e2a4,c790e290,c0e8d785,627,c74a2c78,...) at _cv_wait_sig+0x243 seltdwait(c74a2c78,58,c715b480,c7172b80,246,...) at seltdwait+0xa2 kern_select(c7172b80,c,288060b8,288060dc,0,0,20,c77f7af0,c77f7af0) at kern_select+0x504 select(c7172b80,ef1d8cec,ef1d8d28,c0e8babe,0,...) at select+0x66 syscallenter(c7172b80,ef1d8ce4,ef1d8ce4,0,0,...) at syscallenter+0x263 syscall(ef1d8d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2221 tid 100154 td 0xc7afb000 sched_switch(c7afb000,0,104,191,760b5f52,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7afb000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7423cd0,0,c0e84007,c7afb000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7423ce4,0,ef310a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7423ce4,c7423cd0,c0e8d785,627,c74470e0,...) at _cv_wait_sig+0x243 seltdwait(c74470e0,58,c715b280,c7afb000,246,...) at seltdwait+0xa2 kern_select(c7afb000,a,288060b8,288060dc,0,0,20,c776c578,c776c578) at kern_select+0x504 select(c7afb000,ef310cec,ef310d28,c0e8babe,0,...) at select+0x66 syscallenter(c7afb000,ef310ce4,ef310ce4,0,0,...) at syscallenter+0x263 syscall(ef310d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (93, FreeBSD ELF32, select), eip = 0x284bd5a3, esp = 0xbfbfe19c, ebp = 0xbfbfe1e8 --- Tracing command sshd pid 2217 tid 100114 td 0xc78222e0 sched_switch(c78222e0,0,104,191,667870e3,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c78222e0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c79f4258,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c79f4258,c79f4218,168,c0e915e1,0) at _sleep+0x35c sbwait(c79f41f4,4,c0e916b9,5ec,c79f4218,...) at sbwait+0x76 soreceive_generic(c79f41a0,0,ef22ec28,0,0,...) at soreceive_generic+0x3f0 soreceive(c79f41a0,0,ef22ec28,0,0,0) at soreceive+0x38 soo_read(c7492658,ef22ec28,c749ee00,0,c78222e0,...) at soo_read+0x4e dofileread(ef22ec28,ffffffff,ffffffff,0,c7492658,...) at dofileread+0x9e kern_readv(c78222e0,5,ef22ec28,ef22ec48,1,...) at kern_readv+0x58 read(c78222e0,ef22ecec,ef22ed28,c0e8babe,0,...) at read+0x4f syscallenter(c78222e0,ef22ece4,ef22ece4,0,0,...) at syscallenter+0x263 syscall(ef22ed28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command sshd pid 2216 tid 100177 td 0xc7db48a0 sched_switch(c7db48a0,0,104,191,667b46e9,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c7db48a0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7812598,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7812598,c7812558,168,c0e915e1,0) at _sleep+0x35c sbwait(c7812534,4,c0e916b9,5ec,c7812558,...) at sbwait+0x76 soreceive_generic(c78124e0,0,ef356c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c78124e0,0,ef356c28,0,0,0) at soreceive+0x38 soo_read(c74a28f8,ef356c28,c7416c80,0,c7db48a0,...) at soo_read+0x4e dofileread(ef356c28,ffffffff,ffffffff,0,c74a28f8,...) at dofileread+0x9e kern_readv(c7db48a0,5,ef356c28,ef356c48,1,...) at kern_readv+0x58 read(c7db48a0,ef356cec,ef356d28,c0e8babe,0,...) at read+0x4f syscallenter(c7db48a0,ef356ce4,ef356ce4,0,0,...) at syscallenter+0x263 syscall(ef356d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (3, FreeBSD ELF32, read), eip = 0x284bd623, esp = 0xbfbfdd6c, ebp = 0xbfbfdda8 --- Tracing command sshd pid 2215 tid 100100 td 0xc77fd2e0 sched_switch(c77fd2e0,0,104,191,67e8c150,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,68,...) at mi_switch+0x219 sleepq_switch(c77fd2e0,0,c0e8b180,1a7,68,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7b0d0b8,68,c0e915e1,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7b0d0b8,c7b0d078,168,c0e915e1,0) at _sleep+0x35c sbwait(c7b0d054,4,c0e916b9,5ec,c7b0d078,...) at sbwait+0x76 soreceive_generic(c7b0d000,0,ef1f3c28,0,0,...) at soreceive_generic+0x3f0 soreceive(c7b0d000,0,ef1f3c28,0,0,0) at soreceive+0x38 soo_read(c7492738,ef1f3c28,c7416280,0,c77fd2e0,...) at soo_read+0x4e dofileread(ef1f3c28,ffffffff,ffffffff,0,c7492738,...) at dofileread+0x9e kern_readv(c77fd2e0,5,ef1f3c28,ef1f3c48,1,...) at kern_readv+0x58 read(c77fd2e0,ef1f3cec,288d8010,1,0,...) at read+0x4f syscallenter(c77fd2e0,ef1f3ce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef1f3d28) 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 100168 td 0xc781fb80 sched_switch(c781fb80,0,104,191,af4fea7b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781fb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781fb80,c781fb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182070,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182070,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182000,c7182070,ef33ac28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182000,ef33ac28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717b800,ef33ac28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7432a48,ef33ac28,c6d9ee80,0,c781fb80,...) at devfs_read_f+0x7e dofileread(ef33ac28,ffffffff,ffffffff,0,c7432a48,...) at dofileread+0x9e kern_readv(c781fb80,0,ef33ac28,ef33ac48,1,...) at kern_readv+0x58 read(c781fb80,ef33acec,ef33ad28,c0e8babe,0,...) at read+0x4f syscallenter(c781fb80,ef33ace4,ef33ace4,0,0,...) at syscallenter+0x263 syscall(ef33ad28) 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 100169 td 0xc781f8a0 sched_switch(c781f8a0,0,104,191,af253e1a,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781f8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781f8a0,c781f8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182270,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182270,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182200,c7182270,ef33dc28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182200,ef33dc28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717b900,ef33dc28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7492038,ef33dc28,c6d9ee80,0,c781f8a0,...) at devfs_read_f+0x7e dofileread(ef33dc28,ffffffff,ffffffff,0,c7492038,...) at dofileread+0x9e kern_readv(c781f8a0,0,ef33dc28,ef33dc48,1,...) at kern_readv+0x58 read(c781f8a0,ef33dcec,ef33dd28,c0e8babe,0,...) at read+0x4f syscallenter(c781f8a0,ef33dce4,ef33dce4,0,0,...) at syscallenter+0x263 syscall(ef33dd28) 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 100170 td 0xc781f5c0 sched_switch(c781f5c0,0,104,191,af1294e4,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781f5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781f5c0,c781f5c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7182470,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c7182470,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c7182400,c7182470,ef340c28,1,0,...) at tty_wait+0x71 ttydisc_read(c7182400,ef340c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717ba00,ef340c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74a2b60,ef340c28,c6d9ee80,0,c781f5c0,...) at devfs_read_f+0x7e dofileread(ef340c28,ffffffff,ffffffff,0,c74a2b60,...) at dofileread+0x9e kern_readv(c781f5c0,0,ef340c28,ef340c48,1,...) at kern_readv+0x58 read(c781f5c0,ef340cec,ef340d28,c0e8babe,0,...) at read+0x4f syscallenter(c781f5c0,ef340ce4,ef340ce4,0,0,...) at syscallenter+0x263 syscall(ef340d28) 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 100171 td 0xc781f2e0 sched_switch(c781f2e0,0,104,191,af1d730d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781f2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781f2e0,c781f2e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52070,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52070,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52000,c6f52070,ef344c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52000,ef344c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bb00,ef344c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7492b28,ef344c28,c6d9ee80,0,c781f2e0,...) at devfs_read_f+0x7e dofileread(ef344c28,ffffffff,ffffffff,0,c7492b28,...) at dofileread+0x9e kern_readv(c781f2e0,0,ef344c28,ef344c48,1,...) at kern_readv+0x58 read(c781f2e0,ef344cec,ef344d28,c0e8babe,0,...) at read+0x4f syscallenter(c781f2e0,ef344ce4,ef344ce4,0,0,...) at syscallenter+0x263 syscall(ef344d28) 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 100172 td 0xc781f000 sched_switch(c781f000,0,104,191,af401e6e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c781f000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c781f000,c781f000,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52270,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52270,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52200,c6f52270,ef347c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52200,ef347c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bc00,ef347c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74a28c0,ef347c28,c6d9ee80,0,c781f000,...) at devfs_read_f+0x7e dofileread(ef347c28,ffffffff,ffffffff,0,c74a28c0,...) at dofileread+0x9e kern_readv(c781f000,0,ef347c28,ef347c48,1,...) at kern_readv+0x58 read(c781f000,ef347cec,ef347d28,c0e8babe,0,...) at read+0x4f syscallenter(c781f000,ef347ce4,ef347ce4,0,0,...) at syscallenter+0x263 syscall(ef347d28) 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 100173 td 0xc77feb80 sched_switch(c77feb80,0,104,191,af308d2e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77feb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c77feb80,c77feb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52470,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52470,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52400,c6f52470,ef34ac28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52400,ef34ac28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717bd00,ef34ac28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7432ab8,ef34ac28,c6d9ee80,0,c77feb80,...) at devfs_read_f+0x7e dofileread(ef34ac28,ffffffff,ffffffff,0,c7432ab8,...) at dofileread+0x9e kern_readv(c77feb80,0,ef34ac28,ef34ac48,1,...) at kern_readv+0x58 read(c77feb80,ef34acec,ef34ad28,c0e8babe,0,...) at read+0x4f syscallenter(c77feb80,ef34ace4,ef34ace4,0,0,...) at syscallenter+0x263 syscall(ef34ad28) 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 100174 td 0xc77fe8a0 sched_switch(c77fe8a0,0,104,191,af2ba8ea,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77fe8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c77fe8a0,c77fe8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52670,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52670,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52600,c6f52670,ef34dc28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52600,ef34dc28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717be00,ef34dc28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74a2a80,ef34dc28,c6d9ee80,0,c77fe8a0,...) at devfs_read_f+0x7e dofileread(ef34dc28,ffffffff,ffffffff,0,c74a2a80,...) at dofileread+0x9e kern_readv(c77fe8a0,0,ef34dc28,ef34dc48,1,...) at kern_readv+0x58 read(c77fe8a0,ef34dcec,ef34dd28,c0e8babe,0,...) at read+0x4f syscallenter(c77fe8a0,ef34dce4,ef34dce4,0,0,...) at syscallenter+0x263 syscall(ef34dd28) 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 100115 td 0xc75085c0 sched_switch(c75085c0,0,104,191,af18b802,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c75085c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,c75085c0,c75085c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52870,0,c0e8fe52,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52870,c1010ff0,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52800,c6f52870,ef237c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52800,ef237c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c717c000,ef237c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c7492d20,ef237c28,c6d9ee80,0,c75085c0,...) at devfs_read_f+0x7e dofileread(ef237c28,ffffffff,ffffffff,0,c7492d20,...) at dofileread+0x9e kern_readv(c75085c0,0,ef237c28,ef237c48,1,...) at kern_readv+0x58 read(c75085c0,ef237cec,ef237d28,c0e8babe,0,...) at read+0x4f syscallenter(c75085c0,ef237ce4,ef237ce4,0,0,...) at syscallenter+0x263 syscall(ef237d28) 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 100176 td 0xc7db4b80 sched_switch(c7db4b80,0,104,191,b146d556,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7db4b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c6f52a04,0,c0e84007,c7db4b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c6f52a70,0,ef353ad8,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c6f52a70,c6f52a04,c0e8f7f0,514,0,...) at _cv_wait_sig+0x243 tty_wait(c6f52a00,c6f52a70,ef353c28,1,0,...) at tty_wait+0x71 ttydisc_read(c6f52a00,ef353c28,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c6da2800,ef353c28,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c74a27a8,ef353c28,c6d9ee80,0,c7db4b80,...) at devfs_read_f+0x7e dofileread(ef353c28,ffffffff,ffffffff,0,c74a27a8,...) at dofileread+0x9e kern_readv(c7db4b80,0,ef353c28,ef353c48,1,...) at kern_readv+0x58 read(c7db4b80,ef353cec,ef353d28,c0e8babe,0,...) at read+0x4f syscallenter(c7db4b80,ef353ce4,ef353ce4,0,0,...) at syscallenter+0x263 syscall(ef353d28) 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 100082 td 0xc7420b80 sched_switch(c7420b80,0,104,191,96cb135d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7420b80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73eacd0,0,c0e84007,c7420b80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73eace4,0,ef19da4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73eace4,c73eacd0,c0e8d785,627,c74a2ce8,...) at _cv_wait_sig+0x243 seltdwait(c74a2ce8,58,c6d9ee80,c7420b80,c09cfe08,...) at seltdwait+0xa2 kern_select(c7420b80,6,bfbfdfa0,0,0,0,20,c73a6af0,c73a6af0) at kern_select+0x504 select(c7420b80,ef19dcec,ef19dd28,c0e8babe,0,...) at select+0x66 syscallenter(c7420b80,ef19dce4,ef19dce4,0,74b,...) at syscallenter+0x263 syscall(ef19dd28) 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 100093 td 0xc71725c0 sched_switch(c71725c0,0,104,191,38b530b,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c71725c0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c77f7578,6c,c0e8df12,100,0,...) at sleepq_wait_sig+0x17 _sleep(c77f7578,c77f7600,16c,c0e8df12,0,...) at _sleep+0x35c kern_wait(c71725c0,e64,ef1dec44,0,0,...) at kern_wait+0xbe6 wait4(c71725c0,ef1decec,bfbfec4c,1,0,...) at wait4+0x3b syscallenter(c71725c0,ef1dece4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef1ded28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2811c93b, esp = 0xbfbfec3c, ebp = 0xbfbfece8 --- Tracing command cron pid 2100 tid 100094 td 0xc71722e0 sched_switch(c71722e0,0,104,191,b85cbcff,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,6c,...) at mi_switch+0x219 sleepq_switch(c71722e0,0,c0e8b180,1a7,6c,...) at sleepq_switch+0x162 sleepq_catch_signals(ea61,c09e7470,c71722e0,0,100,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c1012904,6c,c0e86f77,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c1012904,0,16c,c0e86f77,ea61,...) at _sleep+0x328 kern_nanosleep(c71722e0,ef1e1c34,ef1e1c3c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c71722e0,ef1e1cec,ef1e1d28,c0e8babe,0,...) at nanosleep+0x6f syscallenter(c71722e0,ef1e1ce4,ef1e1ce4,0,0,...) at syscallenter+0x263 syscall(ef1e1d28) 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 100142 td 0xc7aff5c0 sched_switch(c7aff5c0,0,104,191,624ab1a5,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,74,...) at mi_switch+0x219 sleepq_switch(c7aff5c0,0,c0e8b180,1a7,74,...) at sleepq_switch+0x162 sleepq_catch_signals(c0e8b180,160,0,100,100,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c7af6058,74,c0d20e4e,100,0,...) at sleepq_wait_sig+0x17 _sleep(c7af6058,c7af6088,174,c0d20e4e,0,...) at _sleep+0x35c kern_sigsuspend(c7aff5c0,0,0,0,0,...) at kern_sigsuspend+0xba sigsuspend(c7aff5c0,ef2cecec,ef2ced28,c0e8babe,0,...) at sigsuspend+0x4d syscallenter(c7aff5c0,ef2cece4,ef2cece4,0,0,...) at syscallenter+0x263 syscall(ef2ced28) 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 100140 td 0xc747c2e0 sched_switch(c747c2e0,0,104,191,1c5c602e,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747c2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef2c8a14,c099890a,c73ead10,0,c747c2e0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c73ead24,0,ef2c8a4c,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c73ead24,c73ead10,1389,627,c7432700,...) at _cv_timedwait_sig+0x252 seltdwait(ef2c8bf8,ef2c8c00,c7416e80,c747c2e0,ef2c8af8,...) at seltdwait+0x8a kern_select(c747c2e0,5,bfbfc510,0,0,ef2c8c40,20,5,0) at kern_select+0x504 select(c747c2e0,ef2c8cec,ef2c8d28,c0e8babe,0,...) at select+0x66 syscallenter(c747c2e0,ef2c8ce4,ef2c8ce4,0,0,...) at syscallenter+0x263 syscall(ef2c8d28) 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 100086 td 0xc747f8a0 sched_switch(c747f8a0,0,104,191,7ba59e6a,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747f8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c7021890,0,c0e84007,c747f8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c70218a4,0,ef1ada4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c70218a4,c7021890,c0e8d785,627,c74920e0,...) at _cv_wait_sig+0x243 seltdwait(c74920e0,58,c715b580,c747f8a0,f33,...) at seltdwait+0xa2 kern_select(c747f8a0,5,2880c0b0,0,0,0,20,c701eaf0,c701eaf0) at kern_select+0x504 select(c747f8a0,ef1adcec,2880d070,1,0,...) at select+0x66 syscallenter(c747f8a0,ef1adce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef1add28) 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 100133 td 0xc747d8a0 sched_switch(c747d8a0,0,104,191,d9ff79c0,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747d8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73ead90,0,c0e84007,c747d8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73eada4,0,ef2b3a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73eada4,c73ead90,c0e8d785,627,c7447af0,...) at _cv_wait_sig+0x243 seltdwait(c7447af0,58,c6d9ee80,c747d8a0,14,...) at seltdwait+0xa2 kern_select(c747d8a0,6,bfbfea04,0,0,0,20,c7af7af0,c7af7af0) at kern_select+0x504 select(c747d8a0,ef2b3cec,ef2b3d28,c0e8babe,0,...) at select+0x66 syscallenter(c747d8a0,ef2b3ce4,ef2b3ce4,0,0,...) at syscallenter+0x263 syscall(ef2b3d28) 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 100146 td 0xc7afc8a0 sched_switch(c7afc8a0,0,104,191,494f7209,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c7afc8a0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c790e2d0,0,c0e84007,c7afc8a0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c790e2e4,0,ef2daa4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c790e2e4,c790e2d0,c0e8d785,627,c7432118,...) at _cv_wait_sig+0x243 seltdwait(c7432118,58,c6d9ee80,c7afc8a0,0,...) at seltdwait+0xa2 kern_select(c7afc8a0,1c,bfbfece8,0,0,0,20,c79072bc,c79072bc) at kern_select+0x504 select(c7afc8a0,ef2dacec,ef2dad80,ef2dac88,0,...) at select+0x66 syscallenter(c7afc8a0,ef2dace4,c0cd2a16,fffffffe,246,...) at syscallenter+0x263 syscall(ef2dad28) 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 100131 td 0xc747db80 sched_switch(c747db80,0,104,191,6346700c,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747db80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef294be0,c099890a,c7196d80,0,c747db80,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c79fad10,0,ef294c18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c79fad10,c7196d80,1388,3b1,bfbfdcc4,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef294d14,c097bbc8,c7196d80,ef294d28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7196d80,ef294d28,c0e8036c,390,c701e834,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7196d80,ef294d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x804c12e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 1842 tid 100130 td 0xc747f000 sched_switch(c747f000,0,104,191,63eb57d3,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747f000,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef291be0,c099890a,c7196d80,0,c747f000,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c6f7f350,0,ef291c18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c6f7f350,c7196d80,1388,3b1,0,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef291d14,c097bbc8,c7196d80,ef291d28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7196d80,ef291d28,c0e8036c,390,c701e834,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7196d80,ef291d28) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x804c12e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 1842 tid 100129 td 0xc747f2e0 sched_switch(c747f2e0,0,104,191,662c0a0d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747f2e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef28ebe0,c099890a,c7196d80,0,c747f2e0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c79f9850,0,ef28ec18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c79f9850,c7196d80,1388,3b1,0,...) at _cv_timedwait_sig+0x252 svc_run_internal(ef28ed14,c097bbc8,c7196d80,ef28ed28,c0e8036c,...) at svc_run_internal+0x356 svc_thread_start(c7196d80,ef28ed28,c0e8036c,390,c701e834,...) at svc_thread_start+0x10 fork_exit(c0b8ad70,c7196d80,ef28ed28) 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 0xc747f5c0 sched_switch(c747f5c0,0,104,191,5fbc2ae6,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c747f5c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef1b6ab4,c099890a,c7196d80,0,c747f5c0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c6f7f490,0,ef1b6aec,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c6f7f490,c7196d80,1388,3b1,ef1b6b34,...) at _cv_timedwait_sig+0x252 svc_run_internal(c747f770,14,c0eb3d1a,c79e160f,ef1b6c10,...) at svc_run_internal+0x356 svc_run(c7196d80,0,c79e1a4f,1c2,0,...) at svc_run+0x7b nfssvc_nfsd(bfbfe870,ef1b6c10,c,c6d9ee80,ef1b6c24,...) at nfssvc_nfsd+0xb7 nfssvc_nfsserver(c747f5c0,ef1b6cec,c701e834,0,ef1b6c7c,...) at nfssvc_nfsserver+0x55 nfssvc(c747f5c0,ef1b6cec,ef1b6d28,c0e8babe,0,...) at nfssvc+0x89 syscallenter(c747f5c0,ef1b6ce4,ef1b6ce4,0,0,...) at syscallenter+0x263 syscall(ef1b6d28) 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 100079 td 0xc74255c0 sched_switch(c74255c0,0,104,191,d02449ea,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74255c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73eadd0,0,c0e84007,c74255c0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73eade4,0,ef191a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73eade4,c73eadd0,c0e8d785,627,c74322d8,...) at _cv_wait_sig+0x243 seltdwait(c74322d8,58,c6d9ee80,c74255c0,f33,...) at seltdwait+0xa2 kern_select(c74255c0,5,bfbfecb4,0,0,0,20,c741e578,c741e578) at kern_select+0x504 select(c74255c0,ef191cec,bfbffff4,1,0,...) at select+0x66 syscallenter(c74255c0,ef191ce4,c0cd2d5d,c1010ff0,0,...) at syscallenter+0x263 syscall(ef191d28) 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 100087 td 0xc74202e0 sched_switch(c74202e0,0,104,191,ee532f60,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c74202e0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73eae10,0,c0e84007,c74202e0,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73eae24,0,ef1b1a4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73eae24,c73eae10,c0e8d785,627,c7447540,...) at _cv_wait_sig+0x243 seltdwait(c7447540,58,c6d9ee80,c74202e0,c115b770,...) at seltdwait+0xa2 kern_select(c74202e0,9,bfbfed3c,0,0,0,20,c73a62bc,c73a62bc) at kern_select+0x504 select(c74202e0,ef1b1cec,ef1b1d28,c0e8babe,0,...) at select+0x66 syscallenter(c74202e0,ef1b1ce4,ef1b1ce4,0,0,...) at syscallenter+0x263 syscall(ef1b1d28) 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 100111 td 0xc75095c0 sched_switch(c75095c0,0,104,191,870ecc7,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c75095c0,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(ef224a6c,c099890a,c716c9d0,0,c75095c0,...) at sleepq_catch_signals+0xf9 sleepq_timedwait_sig(c716c9e4,0,ef224aa4,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c716c9e4,c716c9d0,7531,627,ef224b5c,...) at _cv_timedwait_sig+0x252 seltdwait(ef224c2c,ef224c34,535,c75095c0,ef224b2c,...) at seltdwait+0x8a poll(c75095c0,ef224cec,ef224d28,c0e8babe,0,...) at poll+0x300 syscallenter(c75095c0,ef224ce4,ef224ce4,0,0,...) at syscallenter+0x263 syscall(ef224d28) 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 100119 td 0xc75078a0 sched_switch(c75078a0,0,104,191,a199a05d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,5c,...) at mi_switch+0x219 sleepq_switch(c75078a0,0,c0e8b180,268,0,...) at sleepq_switch+0x162 sleepq_wait(e08a1dfc,5c,c0eb8a97,0,0,...) at sleepq_wait+0x63 _sleep(e08a1dfc,c744ad34,25c,c0eb8a97,0,...) at _sleep+0x372 getdirtybuf(c118efa8,4,c0eb851c,2df0,ef258b58,...) at getdirtybuf+0x258 flush_deplist(ef258b54,0,c0eb851c,2dc1,c09f23db,...) at flush_deplist+0x8c softdep_sync_metadata(c799dd98,0,c0ebb859,144,0,...) at softdep_sync_metadata+0x13e ffs_syncvnode(c799dd98,1,c0a4352f,c0fbb360,c799de90,...) at ffs_syncvnode+0x3e2 ffs_fsync(ef258c2c,c0ed976f,ef258cec,ef258c2c,0,...) at ffs_fsync+0x27 VOP_FSYNC_APV(c0fbb360,ef258c2c,c0e964c7,dc0,0,...) at VOP_FSYNC_APV+0xc5 fsync(c75078a0,ef258cec,ef258d28,c0e8babe,0,...) at fsync+0x1cf syscallenter(c75078a0,ef258ce4,ef258ce4,0,246,...) at syscallenter+0x263 syscall(ef258d28) at syscall+0x4f Xint0x80_syscall() at Xint0x80_syscall+0x21 --- syscall (95, FreeBSD ELF32, fsync), eip = 0x28196507, esp = 0xbfbfe29c, ebp = 0xbfbfede8 --- Tracing command devd pid 1507 tid 100097 td 0xc77fdb80 sched_switch(c77fdb80,0,104,191,7ca7aedb,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,0,...) at mi_switch+0x219 sleepq_switch(c77fdb80,0,c0e8b180,1a7,0,...) at sleepq_switch+0x162 sleepq_catch_signals(c099890a,c73eae50,0,c0e84007,c77fdb80,...) at sleepq_catch_signals+0xf9 sleepq_wait_sig(c73eae64,0,ef1eaa4c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c73eae64,c73eae50,c0e8d785,627,c7431188,...) at _cv_wait_sig+0x243 seltdwait(c7431188,58,c6d9ee80,c77fdb80,c0ebd3a1,...) at seltdwait+0xa2 kern_select(c77fdb80,5,bfbfe960,0,0,0,20,c77f6834,c77f6834) at kern_select+0x504 select(c77fdb80,ef1eacec,ef1ead28,c0e8babe,0,...) at select+0x66 syscallenter(c77fdb80,ef1eace4,ef1eace4,0,0,...) at syscallenter+0x263 syscall(ef1ead28) 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 kdb_enter(c0d29436,c0e19439,0,8ab8c0,0) at kdb_enter+0x3a watchdog_fire(1,0,c0e7e0b7,216,c7045b80,...) at watchdog_fire+0xbd hardclock_anycpu(1,0,ecf96b10,c09b47fd,0,...) at hardclock_anycpu+0x262 handleevents(ecf96b30,c0a43199,c804bae0,80300,c0e94e92,856,14c2,537f11e0,70bf53c,5b46580) at handleevents+0x108 timercb(c11e6180,0,2,c0e7b9d4,c0eb851d,...) at timercb+0x29d lapic_handle_timer(ecf96b74) at lapic_handle_timer+0x83 Xtimerint() at Xtimerint+0x20 --- interrupt, eip = 0xc0a53fe2, esp = 0xecf96bb4, ebp = 0xecf96bbc --- strncmp(c0eb851c,c0e7b9d2,3,c7045b80,ecf96c30,...) at strncmp+0x32 fixup_filename(246,c6d5b450,c7045c30,c0e966a1,ecf96c10,...) at fixup_filename+0x2b witness_checkorder(c118efa8,9,c0eb851c,687,0,...) at witness_checkorder+0x68 _mtx_lock_flags(c118efa8,0,c0eb851c,687,8,...) at _mtx_lock_flags+0xc4 process_worklist_item(c118efa8,0,c0eb851c,5c5,c7045b80,...) at process_worklist_item+0x2f4 softdep_process_worklist(c776a2d4,0,c0eb851c,538,3e8,...) at softdep_process_worklist+0x83 softdep_flush(0,ecf96d28,c0e8036c,390,c73a42bc,...) at softdep_flush+0x2a0 fork_exit(c0bd8570,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,c7f2b20d,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,60,...) at mi_switch+0x219 sleepq_switch(c7170000,0,c0e8b180,268,60,...) at sleepq_switch+0x162 sleepq_wait(e0760540,60,c0e7e0b0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(e0760540,81900,c803e668,c0e7e0b0,60,...) at __lockmgr_args+0xb1f getblk(c803e570,e0,0,4000,0,...) at getblk+0x167 breadn(c803e570,e0,0,4000,0,...) at breadn+0x44 bread(c803e570,e0,0,4000,0,...) at bread+0x4c ffs_update(c803e2b8,0,c0ebb859,163,c0e84007,...) at ffs_update+0x172 ffs_syncvnode(c803e2b8,3,c7170000,566,c0e84007,...) at ffs_syncvnode+0x48f ffs_sync(c776a2d4,3,c0e94e92,db7,c776a2d4,...) at ffs_sync+0x26f sync_fsync(ecf93c6c,c0ed976f,c803e0c4,ecf93c6c,c803e000,...) at sync_fsync+0x18f VOP_FSYNC_APV(c0fa9de0,ecf93c6c,c0e94e92,6c6,c7170000,...) at VOP_FSYNC_APV+0xc5 sync_vnode(c1188a94,c1188a80,3e8,76a,4e20,...) at sync_vnode+0x16b sched_sync(0,ecf93d28,c0e8036c,390,c73a4578,...) at sched_sync+0x282 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,4cd8e1bb,...) 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,c1188a54,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 sched_switch(c71705c0,0,104,191,b5594df7,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,54,...) at mi_switch+0x219 sleepq_switch(c71705c0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c1188728,54,c0e92e32,0,0,...) at sleepq_timedwait+0x6b _sleep(c1188728,c1188730,54,c0e92e32,3e8,...) at _sleep+0x342 buf_daemon(0,ecf8dd28,c0e8036c,390,c73a4af0,...) at buf_daemon+0x175 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,86dd0b7a,...) 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(c1190e5c,0,c0ec0e68,0,0,...) at sleepq_timedwait+0x6b _sleep(c1190e5c,c118f900,0,c0ec0e68,493e0,...) at _sleep+0x342 vm_pagezero(0,ecf8ad28,c0e8036c,390,c73a6000,...) at vm_pagezero+0xdc fork_exit(c0c1ad10,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,ef7147f6,...) 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(c1190a48,74,c0e92e32,0,0,...) at sleepq_wait+0x63 _sleep(c1190a48,c1190a4c,74,c0e92e32,0,...) at _sleep+0x372 vm_daemon(0,ecf87d28,c0e8036c,390,c6dbe2bc,...) at vm_daemon+0x59 fork_exit(c0c148d0,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,4e918322,...) 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(c1190a10,54,c0e92e32,0,0,...) at sleepq_timedwait+0x6b _sleep(c1190a10,c118f900,54,c0e92e32,1388,...) at _sleep+0x342 vm_pageout(0,ecf84d28,c0e8036c,390,c6dbe578,...) at vm_pageout+0x2c7 fork_exit(c0c158f0,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,eb50f6e6,...) 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(c0fd77d4,5c,c0cf9c72,0,0,...) at sleepq_wait+0x63 _sleep(c0fd77d4,c0fd7818,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,ebb956c8,...) 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(c118a558,0,c0ea8ddf,0,0,...) at sleepq_wait+0x63 _sleep(c118a558,c118a520,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,6b514fcd,...) 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(c0c99e80,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,eb7562ed,...) 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,d8abe905,...) 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,4556ef81,...) 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,d842d576,...) 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,d842c3d6,...) 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,d842ae3c,...) 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,3c535612,...) 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,d7dbb659,...) 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,d7dba35b,...) 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,d7db887a,...) 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,3936b8ff,...) 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,d1e600ae,...) 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,d1e5ee6d,...) 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,d1e5d919,...) 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,37ed4185,...) 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,d17f28b2,...) 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,d17f139f,...) 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,d17effdb,...) 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,36bf06c5,...) 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,d118132a,...) 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,d117fe65,...) 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,d117e977,...) 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,35c7ed2e,...) 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,d0b0d446,...) 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,d0b0c018,...) 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,c0669a03,...) 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(c1011704,0,c0e78e92,2,0,...) at sleepq_timedwait+0x6b _sleep(c1011704,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,a19aa5d9,...) 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(c100f348,5c,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c100f348,c100f2a8,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(1,c6b4ca44,c0cd2616,c6d5b7f8,c6d5d058,...) at cpustop_handler+0x34 ipi_nmi_handler(c6d5b7f8,c6d5d058,4,0,c6dbd2bc,...) at ipi_nmi_handler+0x2f trap(c6b4ca50) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0cc76d3, esp = 0xc6b4ca90, ebp = 0xc6b4cab0 --- smp_tlb_shootdown(c6b4cad8,c0cc9d6f,e13ec000,e13f0000,c6b4cae0,...) at smp_tlb_shootdown+0x93 smp_invlpg_range(e13ec000,e13f0000,c6b4cae0,c09f23db,e13f0000,...) at smp_invlpg_range+0x1c pmap_invalidate_range(c11b0540,e13ec000,e13f0000) at pmap_invalidate_range+0x4f pmap_qremove(e13ec000,4,c115ccc0,c0eb8525,c6ecc000,...) at pmap_qremove+0x54 allocbuf(e071e160,0,c0ebd3a1,c6d5b7f8,0,...) at allocbuf+0x18d brelse(e071e160,0,c0ebb255,c0e7b9d2,3,...) at brelse+0x172 bufdone_finish(e071e160,e071e160,e071e160,e08a1da0,c6b4cc50,...) at bufdone_finish+0x3a7 bufdone(e071e160,0,c0ebb24c,716,c744ad34,...) at bufdone+0x6a ffs_backgroundwritedone(e071e160,c159e000,e071e160,c73e5390,c6b4cc80,...) at ffs_backgroundwritedone+0xcc bufdone(e071e160,c6d752b8) at bufdone+0x53 g_vfs_done(c73e5390,0,c0e924eb,c56,c6ecc000,...) at g_vfs_done+0x85 biodone(c73e5390,c100f2c8,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,ed7c3264,...) 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(c100f33c,5c,c0e78e92,0,0,...) at sleepq_wait+0x63 _sleep(c100f33c,c100f26c,25c,c0e78e92,0,...) at _sleep+0x372 g_run_events(c101f580,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,d0ad0fa0,...) 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,b1468c4c,...) 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,d0aca893,...) 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,ec459056,...) 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,f5f373e2,...) 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,f05fde25,...) 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,ee71fa2b,...) 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,a1a0d1c1,...) 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,a1966a4f,...) 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,a1a18d38,...) 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,c285ca93,...) 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,b5ab8322,...) 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,45d30caa,...) 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,c06646df,...) 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,a180c7fb,...) 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,9d4cc1e2,...) 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,108,18c,a1a185bf,...) at sched_switch+0x3bc mi_switch(108,0,c0e87a4b,a03,c6dbf000,...) at mi_switch+0x219 sched_idletd(0,c6b33d28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x2bf 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,c0cd2616,ee,0,...) at cpustop_handler+0x34 ipi_nmi_handler(ee,0,1858342,c0cb7325,c6dbd834,...) at ipi_nmi_handler+0x2f trap(c6b30c10) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0cb7325, esp = 0xc6b30c50, ebp = 0xc6b30c50 --- acpi_cpu_c1(c6b30c6c,c0fd7a50,1,2f4,14c2,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(0,c6b30ca0,c0cc5540,0,ffffffff,...) at acpi_cpu_idle+0x122 cpu_idle_acpi(0,ffffffff,c101fc00,2,c6b30ce8,...) at cpu_idle_acpi+0x2f cpu_idle(0,c6b30cc4,c0e87a4b,a05,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,108,18c,73ae10cb,...) at sched_switch+0x3bc mi_switch(108,0,c0e87a4b,3b9,c6dbf5c0,...) at mi_switch+0x219 sched_idletd(0,c6b2dd28,c0e8036c,390,c6dbd834,...) at sched_idletd+0x19f 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 cpustop_handler(8,c6b2ac04,c0cd2616,ee,0,...) at cpustop_handler+0x34 ipi_nmi_handler(ee,0,0,c11b4224,c6dbd834,...) at ipi_nmi_handler+0x2f trap(c6b2ac10) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc0cb7325, esp = 0xc6b2ac50, ebp = 0xc6b2ac50 --- acpi_cpu_c1(c6b2ac6c,c0fd7a50,3,2f4,14c2,...) at acpi_cpu_c1+0x5 acpi_cpu_idle(0,c6b2aca0,c0cc5540,0,ffffffff,...) at acpi_cpu_idle+0x122 cpu_idle_acpi(0,ffffffff,c1020900,2,c6b2ace8,...) at cpu_idle_acpi+0x2f cpu_idle(0,c6b2acc4,c0e87a4b,a05,c6dbf8a0,...) at cpu_idle+0x90 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,1448bfcc,...) 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,d0aea1eb,...) 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(c118e780,0,c6b23c8c,1,0,...) at sleepq_wait+0x63 _cv_wait(c118e780,c118e764,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,b4603ca5,...) 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(c11e6220,ef185d28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c11e6220,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,9adb3ca2,...) 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(c1011704,0,c0e78e92,2,0,...) at sleepq_timedwait+0x6b _sleep(c1011704,0,0,c0e78e92,bb8,...) at _sleep+0x342 pause(c0e78e92,bb8,124,122,c100f4a8,...) at pause+0x47 deadlkres(0,ecf7bd28,c0e8036c,390,c100f420,...) 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,99fe43e8,...) 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,c100f420,...) 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,eb580877,...) 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(c0fda6b8,c6b70d28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda6b8,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,eb57fa71,...) 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(c0fda6b8,c6b6dd28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda6b8,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,eb57ea67,...) 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(c0fda6b8,c6b6ad28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0x8f fork_exit(c09ea9e0,c0fda6b8,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,eb517d6b,...) 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(c100fd98,c6b67d28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c100fd98,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,eb516b98,...) 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(c118ed64,c6b64d28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c118ed64,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,edf508f1,...) 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(c102e2a8,c6b5bd28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c102e2a8,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,f514f3d,...) 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(c102cd20,c6b52d28,c0e8036c,390,c100f420,...) at taskqueue_thread_loop+0xb5 fork_exit(c09ea9e0,c102cd20,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 0xc100f6e0 sched_switch(c100f6e0,0,104,191,37684538,...) at sched_switch+0x3bc mi_switch(104,0,c0e8b180,1f3,54,...) at mi_switch+0x219 sleepq_switch(c100f6e0,0,c0e8b180,28b,0,...) at sleepq_switch+0x162 sleepq_timedwait(c100f420,54,c0e8835f,0,0,...) at sleepq_timedwait+0x6b _sleep(c100f420,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 171 MB: 156 140 124 108 92 76 60 44 28 12 Dump complete = 0xf db:0:doadump> reset cpu_reset: Restarting BSP cpu_reset_proxy: Stopped CPU 2 (kgdb) proc 17 [Switching to thread 76 (Thread 100074)]#0 sched_switch (td=0xc7170000, newtd=0xc6dbf000, flags=0x104) at ../../../kern/sched_ule.c:1854 1854 cpuid = PCPU_GET(cpuid); (kgdb) bt #0 sched_switch (td=0xc7170000, newtd=0xc6dbf000, flags=0x104) at ../../../kern/sched_ule.c:1854 #1 0xc09b1249 in mi_switch (flags=0x104, newtd=0x0) at ../../../kern/kern_synch.c:450 #2 0xc09e79d2 in sleepq_switch (wchan=0xe0760540, pri=0x60) at ../../../kern/subr_sleepqueue.c:538 #3 0xc09e8703 in sleepq_wait (wchan=0xe0760540, pri=0x60) at ../../../kern/subr_sleepqueue.c:617 #4 0xc099096f in __lockmgr_args (lk=0xe0760540, flags=0x81900, ilk=0xc803e668, wmesg=0xc0e7e0b0 "getblk", pri=0x60, timo=0x0, file=0xc0e924eb "../../../kern/vfs_bio.c", line=0xa62) at ../../../kern/kern_lock.c:217 #5 0xc0a2b097 in getblk (vp=0xc803e570, blkno=0xe0, size=0x4000, slpflag=0x0, slptimeo=0x0, flags=0x0) at lockmgr.h:97 #6 0xc0a2b904 in breadn (vp=0xc803e570, blkno=Unhandled dwarf expression opcode 0x93 ) at ../../../kern/vfs_bio.c:849 #7 0xc0a2ba7c in bread (vp=0xc803e570, blkno=Unhandled dwarf expression opcode 0x93 ) at ../../../kern/vfs_bio.c:797 #8 0xc0bba552 in ffs_update (vp=0xc803e2b8, waitfor=0x0) at ../../../ufs/ffs/ffs_inode.c:95 #9 0xc0be0bcf in ffs_syncvnode (vp=0xc803e2b8, waitfor=0x3) at ../../../ufs/ffs/ffs_vnops.c:357 #10 0xc0bdc2ff in ffs_sync (mp=0xc776a2d4, waitfor=0x3) at ../../../ufs/ffs/ffs_vfsops.c:1391 #11 0xc0a45a7f in sync_fsync (ap=0xecf93c6c) at ../../../kern/vfs_subr.c:3513 #12 0xc0cf34d5 in VOP_FSYNC_APV (vop=0xc0fa9de0, a=0xecf93c6c) at vnode_if.c:1267 #13 0xc0a428bb in sync_vnode (slp=0xc6dbbd70, bo=0xecf93cd8, td=0xc7170000) at vnode_if.h:549 #14 0xc0a42c12 in sched_sync () at ../../../kern/vfs_subr.c:1840 #15 0xc097bbc8 in fork_exit (callout=0xc0a42990 , arg=0x0, frame=0xecf93d28) at ../../../kern/kern_fork.c:920 #16 0xc0cbb9d4 in fork_trampoline () at ../../../i386/i386/exception.s:275 (kgdb) f 4 #4 0xc099096f in __lockmgr_args (lk=0xe0760540, flags=0x81900, ilk=0xc803e668, wmesg=0xc0e7e0b0 "getblk", pri=0x60, timo=0x0, file=0xc0e924eb "../../../kern/vfs_bio.c", line=0xa62) at ../../../kern/kern_lock.c:217 217 sleepq_wait(&lk->lock_object, pri); (kgdb) p *lk $4 = {lock_object = {lo_name = 0xc0e93014 "bufwait", lo_flags = 0x5730000, lo_data = 0x0, lo_witness = 0xc6d5e2a0}, lk_lock = 0xc7d8a5c4, lk_exslpfail = 0x6, lk_timo = 0x0, lk_pri = 0x60, lk_stack = {depth = 0xe, pcs = {0xc0990a4e, 0xc0a2b097, 0xc0a2b904, 0xc0a2ba7c, 0xc0bba552, 0xc0bbafa6, 0xc0bf00e8, 0xc0cf5985, 0xc0a511e5, 0xc09f6247, 0xc09f62c8, 0xc09eada3, 0xc0cd24ff, 0xc0cbb9c1, 0x0, 0x0, 0x0, 0x0}}} (kgdb) proc 2304 [Switching to thread 127 (Thread 100159)]#0 sched_switch (td=0xc7d8a5c0, newtd=0xc7045b80, flags=0x602) at ../../../kern/sched_ule.c:1854 1854 cpuid = PCPU_GET(cpuid); (kgdb) bt #0 sched_switch (td=0xc7d8a5c0, newtd=0xc7045b80, flags=0x602) at ../../../kern/sched_ule.c:1854 #1 0xc09b1249 in mi_switch (flags=0x602, newtd=0x0) at ../../../kern/kern_synch.c:450 #2 0xc09af598 in critical_exit () at ../../../kern/kern_switch.c:212 #3 0xc0cc7232 in ipi_bitmap_handler (frame= {tf_fs = 0x8, tf_es = 0x28, tf_ds = 0x28, tf_edi = 0xe2600000, tf_esi = 0xe25fc000, tf_ebp = 0xef31f468, tf_isp = 0xef31f450, tf_ebx = 0xc7d8a5c0, tf_edx = 0x246, tf_ecx = 0x0, tf_eax = 0x0, tf_trapno = 0x0, tf_err = 0x0, tf_eip = 0xc0cc54ab, tf_cs = 0x20, tf_eflags = 0x246, tf_esp = 0xc102e054, tf_ss = 0xef31f484}) at ../../../i386/i386/mp_machdep.c:1397 #4 0xc0cbc03f in Xipi_intr_bitmap_handler () at apic_vector.s:314 #5 0xc0cc54ab in spinlock_exit () at cpufunc.h:357 #6 0xc09984e4 in _mtx_unlock_spin_flags (m=0xc102e054, opts=0x0, file=0xc0ed1f01 "../../../i386/i386/mp_machdep.c", line=0x4be) at ../../../kern/kern_mutex.c:267 #7 0xc0cc7700 in smp_tlb_shootdown (vector=0xf6, addr1=0xe25fc000, addr2=0xe2600000) at ../../../i386/i386/mp_machdep.c:1214 #8 0xc0cc772c in smp_invlpg_range (addr1=0xe25fc000, addr2=0xe2600000) at ../../../i386/i386/mp_machdep.c:1318 #9 0xc0cc9d6f in pmap_invalidate_range (pmap=0xc11b0540, sva=0xe25fc000, eva=0xe2600000) at ../../../i386/i386/pmap.c:960 #10 0xc0cca024 in pmap_qremove (sva=0xe25fc000, count=0x4) at ../../../i386/i386/pmap.c:1497 #11 0xc0a2720d in allocbuf (bp=0xe07937e0, size=0x0) at ../../../kern/vfs_bio.c:3785 #12 0xc0a27b02 in brelse (bp=0xe07937e0) at ../../../kern/vfs_bio.c:1267 #13 0xc0a2944f in bufwrite (bp=0xe07937e0) at ../../../kern/vfs_bio.c:940 #14 0xc0bdb150 in ffs_bufwrite (bp=0xe07937e0) at ../../../ufs/ffs/ffs_vfsops.c:1966 #15 0xc0bd39c8 in softdep_process_journal (mp=0xc776a2d4, needwk=0x0, flags=0x1) at buf.h:386 #16 0xc0bd3ada in jwait (wk=0xc7900d40) at ../../../ufs/ffs/ffs_softdep.c:4091 #17 0xc0bd5d37 in softdep_disk_io_initiation (bp=0xe07604e0) at ../../../ufs/ffs/ffs_softdep.c:9060 #18 0xc0bdbb2f in ffs_geom_strategy (bo=0xc803e668, bp=0xe07604e0) at buf.h:405 #19 0xc0a29439 in bufwrite (bp=0xe07604e0) at buf.h:398 #20 0xc0bdb150 in ffs_bufwrite (bp=0xe07604e0) at ../../../ufs/ffs/ffs_vfsops.c:1966 #21 0xc0bba66c in ffs_update (vp=0xc804bae0, waitfor=0x1) at buf.h:386 #22 0xc0bbafa6 in ffs_truncate (vp=0xc804bae0, length=0x36e84ea, flags=Variable "flags" is not available. ) at ../../../ufs/ffs/ffs_inode.c:306 #23 0xc0bf00e8 in ufs_setattr (ap=0xef31fbf0) at ../../../ufs/ufs/ufs_vnops.c:621 #24 0xc0cf5985 in VOP_SETATTR_APV (vop=0xc0fbb860, a=0xef31fbf0) at vnode_if.c:760 #25 0xc0a511e5 in vn_truncate (fp=0xc74470a8, length=0x36e84ea, active_cred=0xc715b800, td=0xc7d8a5c0) at vnode_if.h:335 #26 0xc09f6247 in kern_ftruncate (td=0xc7d8a5c0, fd=0x3, length=0x36e84ea) at file.h:247 #27 0xc09f62c8 in ftruncate (td=0xc7d8a5c0, uap=0xef31fcec) at ../../../kern/sys_generic.c:595 #28 0xc09eada3 in syscallenter (td=0xc7d8a5c0, sa=0xef31fce4) at ../../../kern/subr_trap.c:344 #29 0xc0cd24ff in syscall (frame=0xef31fd28) at ../../../i386/i386/trap.c:1082 #30 0xc0cbb9c1 in Xint0x80_syscall () at ../../../i386/i386/exception.s:266 #31 0x00000033 in ?? () Previous frame inner to this frame (corrupt stack?) (kgdb) f 6 #6 0xc09984e4 in _mtx_unlock_spin_flags (m=0xc102e054, opts=0x0, file=0xc0ed1f01 "../../../i386/i386/mp_machdep.c", line=0x4be) at ../../../kern/kern_mutex.c:267 267 __mtx_unlock_spin(m); (kgdb) p *m $5 = {lock_object = {lo_name = 0xc0e8b5bf "smp rendezvous", lo_flags = 0x30000, lo_data = 0x0, lo_witness = 0x0}, mtx_lock = 0xc6ecc000} (kgdb) $ 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,134 @@ 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); 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 +5503,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 +5522,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 +5540,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 +5555,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 = NULL; + } + /* + * 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 +6117,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 +6124,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 +6194,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 +6208,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 +6234,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 +6250,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 +6270,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 +6322,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 +6394,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 +6473,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 +6510,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 +6530,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 +6554,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 +6565,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 +6593,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 +6626,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 +6641,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 +6670,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 +6699,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 +6815,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 +6843,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 +6913,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 +6941,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 +6968,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 +7038,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 +7118,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 +7136,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 +7248,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 +7271,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 +7462,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 +8214,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 +9047,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 +9071,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 +9575,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 +9598,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 +9640,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 +9650,10 @@ 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)); + KASSERT(indirdep->ir_saveddata == NULL, + ("free_indirdep: %p still has saved data.", indirdep)); if (indirdep->ir_state & ONWORKLIST) WORKLIST_REMOVE(&indirdep->ir_list); WORKITEM_FREE(indirdep, D_INDIRDEP); @@ -8984,22 +9670,25 @@ initiate_write_indirdep(indirdep, bp) struct buf *bp; { + indirdep->ir_state |= IOSTARTED; if (indirdep->ir_state & GOINGAWAY) panic("disk_io_initiation: indirdep gone"); - /* * 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 = NULL; + } 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. @@ -11237,6 +12068,8 @@ softdep_slowdown(vp) softdep_speedup(); stat_sync_limit_hit += 1; FREE_LOCK(&lk); + if (DOINGSUJ(vp)) + return (0); return (1); } @@ -11338,6 +12171,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 +12197,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 +12218,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 +12497,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 +12545,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