GENERIC HEAD from 2009-12-14 22:55:20 UTC, r200565M, vmcore.15 KDB: debugger backends: ddb KDB: current backend: ddb Copyright (c) 1992-2009 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 r200565M: Thu Dec 17 23:12:32 CET 2009 pho@crashbox.osted.lan:/usr/src/sys/i386/compile/PHO i386 WARNING: WITNESS option enabled, expect reduced performance. WARNING: DIAGNOSTIC option enabled, expect reduced performance. Timecounter "i8254" frequency 1193182 Hz quality 0 CPU: Intel(R) XEON(TM) CPU 1.80GHz (1799.81-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0xf24 Stepping = 4 Features=0x3febfbff real memory = 1073741824 (1024 MB) avail memory = 1031368704 (983 MB) : Trying to mount root from ufs:/dev/ad0s1a Entropy harvesting: interrupts ethernet point_to_point kickstart. /dev/ad0s1a: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1a: clean, 269387 free (651 frags, 33592 blocks, 0.1% fragmentation) /dev/ad0s1f: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1f: clean, 449949 free (501 frags, 56181 blocks, 0.1% fragmentation) /dev/ad0s1e: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1d: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1d: clean, 2844438 free (50238 frags, 349275 blocks, 1.0% fragmentation) /dev/ad0s1g: FILE SYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1g: clean, 21465288 free (23408 frags, 2680235 blocks, 0.1% fragmentation) lock order reversal: 1st 0xd85049e0 bufwait (bufwait) @ kern/vfs_bio.c:2559 2nd 0xc483a800 dirhash (dirhash) @ ufs/ufs/ufs_dirhash.c:283 KDB: stack backtrace: db_trace_self_wrapper(c0ca001d,e6cfd880,c08d0105,c08c0beb,c0ca2fc1,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c08c0beb,c0ca2fc1,c4538030,c453b290,e6cfd8dc,...) at kdb_backtrace+0x29 _witness_debugger(c0ca2fc1,c483a800,c0cc6214,c453b290,c0cc5eba,...) at _witness_debugger+0x25 witness_checkorder(c483a800,9,c0cc5eb1,11b,0,...) at witness_checkorder+0x839 _sx_xlock(c483a800,0,c0cc5eb1,11b,c4ab0074,...) at _sx_xlock+0x85 ufsdirhash_acquire(d8504980,e6cfda1c,164,d8bbd4ac,e6cfd9a8,...) at ufsdirhash_acquire+0x48 ufsdirhash_add(c4ab0074,e6cfda1c,4ac,e6cfd994,e6cfd998,...) at ufsdirhash_add+0x13 ufs_direnter(c4b9c000,c4c1615c,e6cfda1c,e6cfdc00,d85073c0,...) at ufs_direnter+0x669 ufs_mkdir(e6cfdc28,c0cdb787,0,0,e6cfdb6c,...) at ufs_mkdir+0x981 VOP_MKDIR_APV(c0daad00,e6cfdc28,e6cfdc00,e6cfdb6c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c4b5bd80,ffffff9c,bfbfef5a,0,1ff,...) at kern_mkdirat+0x21b kern_mkdir(c4b5bd80,bfbfef5a,0,1ff,e6cfdd2c,...) at kern_mkdir+0x2e mkdir(c4b5bd80,e6cfdcf8,8,c0ca3887,c0d88fe0,...) at mkdir+0x29 syscall(e6cfdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x2816a5c3, esp = 0xbfbfed6c, ebp = 0xbfbfee38 --- fxp0: link state changed to UP Starting Network: lo0 fxp0. add net default: gateway 192.168.1.1 Additional ABI support: linux. Starting mountd. Configuring syscons: keymap blanktime. Local package initialization:lock order reversal: 1st 0xc4b9c5c8 ufs (ufs) @ kern/vfs_subr.c:2083 2nd 0xd8511b80 bufwait (bufwait) @ ufs/ffs/ffs_softdep.c:9723 3rd 0xc4dae880 ufs (ufs) @ kern/vfs_subr.c:2083 KDB: stack backtrace: db_trace_self_wrapper(c0ca001d,e6cf985c,c08d0105,c08c0beb,c0ca2fda,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c08c0beb,c0ca2fda,c4538030,c453b228,e6cf98b8,...) at kdb_backtrace+0x29 _witness_debugger(c0ca2fda,c4dae880,c0c957ae,c453b228,c0caa1b4,...) at _witness_debugger+0x25 witness_checkorder(c4dae880,9,c0caa1ab,823,0,...) at witness_checkorder+0x839 __lockmgr_args(c4dae880,80100,c4dae8ec,0,0,...) at __lockmgr_args+0x824 ffs_lock(e6cf99d8,c08cfeab,c0ca9692,80100,c4dae828,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6cf99d8,c4b5d0a4,c0dc55a0,c4dae828,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c4dae828,80100,c0caa1ab,823,4,...) at _vn_lock+0x78 vget(c4dae828,80100,c4b5d000,50,0,...) at vget+0xbb vfs_hash_get(c4c0a2d4,b802,80000,c4b5d000,e6cf9b38,...) at vfs_hash_get+0xed ffs_vgetf(c4c0a2d4,b802,80000,e6cf9b38,1,...) at ffs_vgetf+0x49 softdep_sync_metadata(c4b9c570,0,c0cc5afd,146,0,...) at softdep_sync_metadata+0x5f3 ffs_syncvnode(c4b9c570,1,c4b5d000,51d,c4b9c414,...) at ffs_syncvnode+0x3e2 ffs_sync(c4c0a2d4,1,c0ca99a9,4f9,80,...) at ffs_sync+0x26f dounmount(c4c0a2d4,8000000,c4b5d000,47e,92efefaa,...) at dounmount+0x44e unmount(c4b5d000,e6cf9cf8,8,c4b5d000,c0d88368,...) at unmount+0x2ff syscall(e6cf9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (22, FreeBSD ELF32, unmount), eip = 0x280da13f, esp = 0xbfbfe68c, ebp = 0xbfbfe758 --- lock order reversal: 1st 0xc4b229dc ufs (ufs) @ kern/vfs_mount.c:1204 2nd 0xc4b9d310 devfs (devfs) @ ufs/ffs/ffs_softdep.c:1276 KDB: stack backtrace: db_trace_self_wrapper(c0ca001d,e6cf99dc,c08d0105,c08c0beb,c0ca2fc1,...) at db_trace_self_wrapper+0x26 kdb_backtrace(c08c0beb,c0ca2fc1,c453b228,c453b0f0,e6cf9a38,...) at kdb_backtrace+0x29 _witness_debugger(c0ca2fc1,c4b9d310,c0c916b0,c453b0f0,c0cc31ed,...) at _witness_debugger+0x25 witness_checkorder(c4b9d310,9,c0cc31e4,4fc,c4b9d37c,...) at witness_checkorder+0x839 __lockmgr_args(c4b9d310,80400,c4b9d37c,0,0,...) at __lockmgr_args+0x824 vop_stdlock(e6cf9b54,c0c9b36c,df,80400,c4b9d2b8,...) at vop_stdlock+0x65 VOP_LOCK1_APV(c0d845a0,e6cf9b54,0,c0dc55a0,c4b9d2b8,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c4b9d2b8,80400,c0cc31e4,4fc,c4c0a2d4,...) at _vn_lock+0x78 softdep_flushworklist(c4c0a2d4,e6cf9c00,c4b5d000,52b,c4b9c414,...) at softdep_flushworklist+0x47 ffs_sync(c4c0a2d4,1,c0ca99a9,4f9,80,...) at ffs_sync+0x2fd dounmount(c4c0a2d4,8000000,c4b5d000,47e,92efefaa,...) at dounmount+0x44e unmount(c4b5d000,e6cf9cf8,8,c4b5d000,c0d88368,...) at unmount+0x2ff syscall(e6cf9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (22, FreeBSD ELF32, unmount), eip = 0x280da13f, esp = 0xbfbfe68c, ebp = 0xbfbfe758 --- ** /dev/ad0s1e ** Last Mounted on /tmp ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups 104 files, 236048 used, 1792983 free (135 frags, 224106 blocks, 0.0% fragmentation) ***** FILE SYSTEM IS CLEAN ***** usage: kill [-s signal_name] pid ... kill -l [exit_status] kill -signal_name pid ... kill -signal_number pid ... fsck -y /tmp watchdogd. Fri Dec 18 12:03:41 CET 2009 Dec 18 12:03:50 crashbox su: pho to root on /dev/pts/0 panic: flush_pagedep_deps: MKDIR_BODY cpuid = 0 KDB: enter: panic [thread pid 1619 tid 100241 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db> run pho db:0:pho> bt Tracing pid 1619 tid 100241 td 0xc95f1b40 kdb_enter(c0c9cbe4,c0c9cbe4,c0cc5365,e6fe1638,0,...) at kdb_enter+0x3a panic(c0cc5365,0,c0cc31e4,23d0,0,...) at panic+0x136 softdep_sync_metadata(c50ce570,0,c0cc5afd,146,0,...) at softdep_sync_metadata+0x945 ffs_syncvnode(c50ce570,1,c4538030,c0f37668,e6fe1740,...) at ffs_syncvnode+0x3e2 ffs_truncate(c50ce570,5200,0,880,c4aa0580,...) at ffs_truncate+0x6a6 ufs_direnter(c50ce570,c63af6cc,e6fe19f8,e6fe1c00,0,...) at ufs_direnter+0x846 ufs_makeinode(e6fe1c00,c091f67f,c0daad00,e6fe1b28,c0dab200,...) at ufs_makeinode+0x595 ufs_mknod(e6fe1c28,c0cdb90b,0,0,e6fe1b6c,...) at ufs_mknod+0x35 VOP_MKNOD_APV(c0daad00,e6fe1c28,e6fe1c00,e6fe1b6c,0,...) at VOP_MKNOD_APV+0xc5 kern_mkfifoat(c95f1b40,ffffff9c,804d240,0,1b6,...) at kern_mkfifoat+0x217 kern_mkfifo(c95f1b40,804d240,0,1b6,e6fe1d2c,...) at kern_mkfifo+0x2e mkfifo(c95f1b40,e6fe1cf8,8,c0ca37cf,c0d88f70,...) at mkfifo+0x29 syscall(e6fe1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (132, FreeBSD ELF32, mkfifo), eip = 0x280eabdb, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- db:0:bt> show allpcpu Current CPU: 0 cpuid = 0 dynamic pcpu = 0x65f380 curthread = 0xc95f1b40: pid 1619 "mkfifo" curpcb = 0xe6fe1d90 fpcurthread = none idlethread = 0xc457c480: pid 11 "idle: cpu0" APIC ID = 0 currentldt = 0x50 spin locks held: cpuid = 1 dynamic pcpu = 0x34f5380 curthread = 0xc4b5d480: pid 1568 "rw" curpcb = 0xe6cedd90 fpcurthread = none idlethread = 0xc457c6c0: pid 11 "idle: cpu1" APIC ID = 1 currentldt = 0x50 spin locks held: cpuid = 2 dynamic pcpu = 0x34f8380 curthread = 0xc95f0d80: pid 1631 "rename" curpcb = 0xe6fffd90 fpcurthread = none idlethread = 0xc457c900: pid 11 "idle: cpu2" APIC ID = 6 currentldt = 0x50 spin locks held: cpuid = 3 dynamic pcpu = 0x34fb380 curthread = 0xc4c5bd80: pid 1554 "rw" curpcb = 0xe6daad90 fpcurthread = none idlethread = 0xc457cb40: pid 11 "idle: cpu3" APIC ID = 7 currentldt = 0x50 spin locks held: db:0:allpcpu> show alllocks Process 1683 (mkfifo) thread 0xc4fe4000 (100154) exclusive sx so_snd_sx (so_snd_sx) r = 0 (0xc5cf7ac8) locked @ kern/uipc_sockbuf.c:148 Process 1659 (lockf) thread 0xc4ac9240 (100065) exclusive sx ls_lock (ls_lock) r = 0 (0xc545c6c8) locked @ kern/kern_lockf.c:641 Process 1644 (rename) thread 0xc95f0240 (100263) exclusive lockmgr ufs (ufs) r = 0 (0xc52f5b38) locked @ kern/vfs_lookup.c:497 Process 1632 (rename) thread 0xc95f0b40 (100250) exclusive lockmgr ufs (ufs) r = 0 (0xc60c4310) locked @ kern/vfs_lookup.c:497 Process 1631 (rename) thread 0xc95f0d80 (100249) exclusive lockmgr bufwait (bufwait) r = 0 (0xd8671bc0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc54d0058) locked @ ufs/ffs/ffs_vfsops.c:1465 exclusive lockmgr ufs (ufs) r = 0 (0xc646c9dc) locked @ kern/vfs_lookup.c:497 Process 1629 (rename) thread 0xc95f1240 (100247) exclusive lockmgr ufs (ufs) r = 0 (0xc623a1b4) locked @ ufs/ufs/ufs_vnops.c:1099 exclusive lockmgr ufs (ufs) r = 1 (0xc78bd9dc) locked @ ufs/ufs/ufs_vnops.c:1104 Process 1626 (rename) thread 0xc95f16c0 (100244) exclusive lockmgr ufs (ufs) r = 0 (0xc62f6c94) locked @ ufs/ufs/ufs_vnops.c:1099 exclusive lockmgr ufs (ufs) r = 1 (0xc623c9dc) locked @ ufs/ufs/ufs_vnops.c:1104 Process 1619 (mkfifo) thread 0xc95f1b40 (100241) exclusive sleep mutex Softdep Lock (Softdep Lock) r = 0 (0xc0f72a2c) locked @ ufs/ffs/ffs_softdep.c:9168 exclusive lockmgr bufwait (bufwait) r = 0 (0xd852ec40) locked @ ufs/ffs/ffs_softdep.c:9723 exclusive lockmgr ufs (ufs) r = 0 (0xc50ce5c8) locked @ kern/vfs_lookup.c:497 Process 1618 (mkfifo) thread 0xc95f1d80 (100240) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5cf7bd0) locked @ kern/uipc_sockbuf.c:148 Process 1616 (mkfifo) thread 0xc95f3240 (100238) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4ceea34) locked @ kern/uipc_sockbuf.c:148 Process 1615 (mkfifo) thread 0xc5be46c0 (100237) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5579bd0) locked @ kern/uipc_sockbuf.c:148 Process 1614 (mkfifo) thread 0xc5be4900 (100236) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc555008c) locked @ kern/uipc_sockbuf.c:148 Process 1613 (mkfifo) thread 0xc5be4b40 (100235) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4db7228) locked @ kern/uipc_sockbuf.c:148 Process 1612 (mkfifo) thread 0xc5be4d80 (100234) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5cf7560) locked @ kern/uipc_sockbuf.c:148 Process 1611 (mkfifo) thread 0xc5d0e000 (100233) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5579560) locked @ kern/uipc_sockbuf.c:148 Process 1610 (mkfifo) thread 0xc5d0e240 (100232) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5cf7898) locked @ kern/uipc_sockbuf.c:148 Process 1609 (mkfifo) thread 0xc5d0e480 (100231) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4dd708c) locked @ kern/uipc_sockbuf.c:148 Process 1607 (lockf) thread 0xc5d0e900 (100218) shared lockmgr ufs (ufs) r = 0 (0xc60f5058) locked @ kern/vfs_default.c:372 Process 1605 (mkdir) thread 0xc5d0e6c0 (100230) exclusive lockmgr ufs (ufs) r = 0 (0xc52f6724) locked @ kern/vfs_lookup.c:497 Process 1602 (mkdir) thread 0xc5d0f240 (100211) exclusive lockmgr ufs (ufs) r = 0 (0xc62b59dc) locked @ kern/vfs_lookup.c:497 Process 1600 (mkdir) thread 0xc5be3900 (100204) exclusive lockmgr ufs (ufs) r = 0 (0xc60cd5c8) locked @ kern/vfs_lookup.c:497 Process 1596 (openat) thread 0xc518d240 (100166) exclusive lockmgr ufs (ufs) r = 0 (0xc61b35c8) locked @ kern/vfs_subr.c:2083 Process 1595 (openat) thread 0xc518d000 (100167) exclusive lockmgr ufs (ufs) r = 0 (0xc60c4058) locked @ kern/vfs_lookup.c:497 Process 1592 (openat) thread 0xc518ab40 (100169) exclusive lockmgr ufs (ufs) r = 0 (0xc54dc5c8) locked @ ufs/ufs/ufs_vnops.c:1099 exclusive lockmgr ufs (ufs) r = 1 (0xc63b4df0) locked @ ufs/ufs/ufs_vnops.c:1104 Process 1591 (openat) thread 0xc518a900 (100170) exclusive lockmgr ufs (ufs) r = 0 (0xc623cdf0) locked @ kern/vfs_subr.c:2083 Process 1590 (openat) thread 0xc4b326c0 (100067) exclusive lockmgr bufwait (bufwait) r = 0 (0xd85ad9e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc609e5c8) locked @ kern/vfs_lookup.c:497 Process 1588 (link) thread 0xc4b016c0 (100081) exclusive lockmgr bufwait (bufwait) r = 0 (0xd865e700) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc60ad9dc) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc5c369dc) locked @ kern/vfs_lookup.c:497 Process 1587 (link) thread 0xc4c5b900 (100095) exclusive lockmgr ufs (ufs) r = 0 (0xc53c546c) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc60cf1b4) locked @ kern/vfs_lookup.c:497 Process 1586 (link) thread 0xc4db9d80 (100118) exclusive lockmgr bufwait (bufwait) r = 0 (0xd865e220) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc54eac94) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc60e046c) locked @ kern/vfs_lookup.c:497 Process 1584 (link) thread 0xc559ed80 (100198) exclusive lockmgr ufs (ufs) r = 0 (0xc54b0df0) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc60d5c94) locked @ kern/vfs_lookup.c:497 Process 1583 (link) thread 0xc5134900 (100152) exclusive lockmgr bufwait (bufwait) r = 0 (0xd865e560) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc60fc9dc) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc63b1880) locked @ kern/vfs_lookup.c:497 Process 1582 (link) thread 0xc5be4000 (100193) exclusive lockmgr bufwait (bufwait) r = 0 (0xd85861c0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc65d2880) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc5c7dc94) locked @ kern/vfs_lookup.c:497 Process 1581 (link) thread 0xc5134000 (100177) exclusive lockmgr ufs (ufs) r = 0 (0xc54a51b4) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc60d1b38) locked @ kern/vfs_lookup.c:497 Process 1579 (rw) thread 0xc4b01b40 (100072) exclusive lockmgr bufwait (bufwait) r = 0 (0xd854c1e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc62e71b4) locked @ kern/vfs_vnops.c:607 Process 1577 (rw) thread 0xc4afc900 (100100) exclusive lockmgr bufwait (bufwait) r = 0 (0xd86dbaa0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc60549dc) locked @ kern/vfs_vnops.c:607 Process 1575 (openat) thread 0xc4fe56c0 (100194) exclusive lockmgr ufs (ufs) r = 0 (0xc61b646c) locked @ kern/vfs_subr.c:2083 Process 1574 (rw) thread 0xc4b32240 (100075) exclusive lockmgr bufwait (bufwait) r = 0 (0xd855c100) locked @ kern/vfs_bio.c:1835 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8580a00) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc5467b38) locked @ kern/vfs_vnops.c:607 Process 1573 (openat) thread 0xc559e900 (100205) exclusive lockmgr ufs (ufs) r = 0 (0xc646c058) locked @ kern/vfs_subr.c:2083 Process 1572 (rw) thread 0xc4dba240 (100116) exclusive lockmgr ufs (ufs) r = 0 (0xc62e6df0) locked @ kern/vfs_vnops.c:607 Process 1571 (openat) thread 0xc5d0f480 (100202) exclusive lockmgr ufs (ufs) r = 0 (0xc5c3e310) locked @ kern/vfs_lookup.c:497 Process 1570 (rw) thread 0xc4b5d900 (100109) exclusive lockmgr ufs (ufs) r = 0 (0xc60f9b38) locked @ kern/vfs_lookup.c:497 Process 1569 (openat) thread 0xc5be3240 (100209) exclusive lockmgr bufwait (bufwait) r = 0 (0xd84ed280) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc66461b4) locked @ ufs/ufs/ufs_vnops.c:1099 exclusive lockmgr ufs (ufs) r = 1 (0xc5c63df0) locked @ ufs/ufs/ufs_vnops.c:1104 Process 1568 (rw) thread 0xc4b5d480 (100059) exclusive sleep mutex vm object (standard object) r = 0 (0xc4b02110) locked @ kern/vfs_bio.c:3611 exclusive lockmgr bufwait (bufwait) r = 0 (0xd85d87a0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc54d11b4) locked @ kern/vfs_vnops.c:607 Process 1567 (openat) thread 0xc5134240 (100175) exclusive lockmgr bufwait (bufwait) r = 0 (0xd85a0020) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc6299058) locked @ ufs/ffs/ffs_vfsops.c:1465 exclusive lockmgr ufs (ufs) r = 0 (0xc5c639dc) locked @ kern/vfs_lookup.c:497 Process 1566 (rw) thread 0xc4b32480 (100074) exclusive lockmgr bufwait (bufwait) r = 0 (0xd86b0b40) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd86aa680) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd86a3e80) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd869c640) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd86723e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8513da0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd855a8a0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc644ec94) locked @ kern/vfs_vnops.c:607 Process 1565 (openat) thread 0xc559f6c0 (100186) exclusive lockmgr ufs (ufs) r = 0 (0xc7b5846c) locked @ kern/vfs_lookup.c:497 Process 1564 (rw) thread 0xc4b33480 (100128) exclusive lockmgr bufwait (bufwait) r = 0 (0xd8559ee0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc6507724) locked @ kern/vfs_vnops.c:607 Process 1563 (openat) thread 0xc5be4480 (100187) exclusive lockmgr bufwait (bufwait) r = 0 (0xd856e240) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc65db310) locked @ kern/vfs_subr.c:2083 Process 1562 (rw) thread 0xc4b33900 (100126) exclusive lockmgr bufwait (bufwait) r = 0 (0xd8559860) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc658cb38) locked @ kern/vfs_vnops.c:607 Process 1561 (openat) thread 0xc5135240 (100144) exclusive lockmgr bufwait (bufwait) r = 0 (0xd85be2c0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc60d05c8) locked @ kern/vfs_lookup.c:497 Process 1560 (rw) thread 0xc4b33b40 (100125) exclusive lockmgr ufs (ufs) r = 0 (0xc62b5310) locked @ kern/vfs_vnops.c:607 Process 1558 (rw) thread 0xc4b33d80 (100124) exclusive lockmgr bufwait (bufwait) r = 0 (0xd867ea20) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8521de0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd86887c0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc55115c8) locked @ kern/vfs_vnops.c:607 Process 1556 (rw) thread 0xc4b5b480 (100121) exclusive lockmgr bufwait (bufwait) r = 0 (0xd85070e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8515fc0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd85215c0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd852b1c0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd852b840) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd87228e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc61b3df0) locked @ kern/vfs_vnops.c:607 Process 1554 (rw) thread 0xc4c5bd80 (100093) exclusive lockmgr bufwait (bufwait) r = 0 (0xd852e900) locked @ kern/vfs_bio.c:2559 exclusive sleep mutex bufobj interlock (bufobj interlock) r = 0 (0xc4b9d3b0) locked @ kern/vfs_bio.c:2545 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8554720) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8553f00) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd855bc20) locked @ kern/vfs_bio.c:2559 exclusive lockmgr bufwait (bufwait) r = 0 (0xd8557980) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc5c85724) locked @ kern/vfs_vnops.c:607 Process 1551 (link) thread 0xc4fe5d80 (100185) exclusive lockmgr bufwait (bufwait) r = 0 (0xd865c4e0) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc61acdf0) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc5c365c8) locked @ kern/vfs_lookup.c:497 Process 1550 (link) thread 0xc55a0900 (100222) exclusive lockmgr ufs (ufs) r = 0 (0xc60f95c8) locked @ kern/vfs_lookup.c:497 Process 1549 (link) thread 0xc5134b40 (100151) exclusive lockmgr bufwait (bufwait) r = 0 (0xd865c820) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc829446c) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc63b5310) locked @ kern/vfs_lookup.c:497 Process 1548 (link) thread 0xc559eb40 (100201) exclusive lockmgr bufwait (bufwait) r = 0 (0xd855f020) locked @ kern/vfs_bio.c:2559 exclusive lockmgr ufs (ufs) r = 0 (0xc5bbc1b4) locked @ kern/vfs_syscalls.c:1593 exclusive lockmgr ufs (ufs) r = 0 (0xc6465c94) locked @ kern/vfs_lookup.c:497 Process 1540 (lockf2) thread 0xc4fe4480 (100149) exclusive sx ls_lock (ls_lock) r = 0 (0xc5a81e88) locked @ kern/kern_lockf.c:641 Process 1539 (lockf2) thread 0xc4fe4240 (100150) exclusive sx ls_lock (ls_lock) r = 0 (0xc617b6c8) locked @ kern/kern_lockf.c:641 Process 1537 (lockf2) thread 0xc4c5c900 (100088) exclusive sx ls_lock (ls_lock) r = 0 (0xc56ac748) locked @ kern/kern_lockf.c:641 Process 1528 (creat) thread 0xc4afcb40 (100099) exclusive lockmgr ufs (ufs) r = 0 (0xc707c46c) locked @ kern/vfs_lookup.c:497 Process 1167 (sshd) thread 0xc5134480 (100174) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5550a34) locked @ kern/uipc_sockbuf.c:148 Process 1166 (sshd) thread 0xc518a240 (100173) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4dd8898) locked @ kern/uipc_sockbuf.c:148 Process 1165 (sshd) thread 0xc518a480 (100172) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc5550560) locked @ kern/uipc_sockbuf.c:148 Process 1056 (sshd) thread 0xc4dba000 (100117) exclusive sx so_rcv_sx (so_rcv_sx) r = 0 (0xc4c2c6fc) locked @ kern/uipc_sockbuf.c:148 Process 18 (softdepflush) thread 0xc4767900 (100049) exclusive lockmgr ufs (ufs) r = 0 (0xc604f880) locked @ kern/vfs_subr.c:2083 db:0:alllocks> show lockedvnods Locked vnodes 0xc50ce570: tag ufs, type VDIR usecount 99, writecount 0, refcount 104 mountedhere 0 flags () v_object 0xc514e000 ref 0 pages 3 lock type ufs: EXCL by thread 0xc95f1b40 (pid 1619) with shared waiters pending #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0926278 at kern_mkfifoat+0x68 #7 0xc09264ce at kern_mkfifo+0x2e #8 0xc09264f9 at mkfifo+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 494592, on dev ad0s1e 0xc604f828: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc6083908 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4767900 (pid 18) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ac16e7 at handle_workitem_remove+0x47 #8 0xc0ac0ae6 at process_worklist_item+0x1e6 #9 0xc0aca7a1 at softdep_process_worklist+0x81 #10 0xc0acad47 at softdep_flush+0x287 #11 0xc0863018 at fork_exit+0xb8 #12 0xc0bad180 at fork_trampoline+0x8 ino 497054, on dev ad0s1e 0xc707c414: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc6227a18 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4afcb40 (pid 1528) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 494639, on dev ad0s1e 0xc5c63d98: tag ufs, type VDIR usecount 5, writecount 0, refcount 7 mountedhere 0 flags () v_object 0xc5197770 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5be3240 (pid 1569) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24ce at ufs_rename+0x1ae #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc09286c7 at renameat+0x37 #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 495007, on dev ad0s1e 0xc7b58414: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc51983b8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc559f6c0 (pid 1565) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 495234, on dev ad0s1e 0xc5c63984: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc640f5d8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134240 (pid 1567) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 518145, on dev ad0s1e 0xc6465c3c: tag ufs, type VDIR usecount 2, writecount 0, refcount 11 mountedhere 0 flags () v_object 0xc5ef9990 ref 0 pages 22 lock type ufs: EXCL by thread 0xc559eb40 (pid 1548) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 495555, on dev ad0s1e 0xc5c3e2b8: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc519c7f8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5d0f480 (pid 1571) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 518146, on dev ad0s1e 0xc60d0570: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc5b9dd48 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5135240 (pid 1561) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 518147, on dev ad0s1e 0xc609e570: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc5184a18 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4b326c0 (pid 1590) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 376921, on dev ad0s1e 0xc63b4d98: tag ufs, type VDIR usecount 5, writecount 0, refcount 7 mountedhere 0 flags () v_object 0xc5199e58 ref 0 pages 0 lock type ufs: EXCL by thread 0xc518ab40 (pid 1592) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24ce at ufs_rename+0x1ae #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc09286c7 at renameat+0x37 #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 447497, on dev ad0s1e 0xc60c4000: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc6249880 ref 0 pages 0 lock type ufs: EXCL by thread 0xc518d000 (pid 1595) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a898 at openat+0x38 #10 0xc0bcae34 at syscall+0x2b4 #11 0xc0bad170 at Xint0x80_syscall+0x20 ino 376941, on dev ad0s1e 0xc623c984: tag ufs, type VDIR usecount 5, writecount 0, refcount 7 mountedhere 0 flags () v_object 0xc5b87cc0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f16c0 (pid 1626) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24ce at ufs_rename+0x1ae #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc0928656 at kern_rename+0x36 #8 0xc0928689 at rename+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 494998, on dev ad0s1e 0xc646c984: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc635cbb0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f0d80 (pid 1631) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 471043, on dev ad0s1e 0xc60c42b8: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc727b6e8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f0b40 (pid 1632) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 471045, on dev ad0s1e 0xc52f5ae0: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc7611770 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f0240 (pid 1644) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 471046, on dev ad0s1e 0xc5c36570: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc65ea088 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4fe5d80 (pid 1551) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471358, on dev ad0s1e 0xc63b52b8: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc6446dd0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134b40 (pid 1549) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471370, on dev ad0s1e 0xc60f9570: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc65e9dd0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc55a0900 (pid 1550) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 518155, on dev ad0s1e 0xc60f9ae0: tag ufs, type VDIR usecount 3, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc615fb28 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4b5d900 (pid 1570) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc092bf40 at vn_open_cred+0x90 #7 0xc092c4ab at vn_open+0x3b #8 0xc092a2af at kern_openat+0x11f #9 0xc092a815 at kern_open+0x35 #10 0xc092a850 at open+0x30 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 376975, on dev ad0s1e 0xc60cf15c: tag ufs, type VDIR usecount 2, writecount 0, refcount 15 mountedhere 0 flags () v_object 0xc62ef198 ref 0 pages 38 lock type ufs: EXCL by thread 0xc4c5b900 (pid 1587) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 423951, on dev ad0s1e 0xc5c7dc3c: tag ufs, type VDIR usecount 2, writecount 0, refcount 16 mountedhere 0 flags () v_object 0xc5c33660 ref 0 pages 44 lock type ufs: EXCL by thread 0xc5be4000 (pid 1582) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 447605, on dev ad0s1e 0xc60d5c3c: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc66f8088 ref 0 pages 0 lock type ufs: EXCL by thread 0xc559ed80 (pid 1584) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471389, on dev ad0s1e 0xc60d1ae0: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc609c2a8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134000 (pid 1581) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471390, on dev ad0s1e 0xc60e0414: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc609a000 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4db9d80 (pid 1586) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471392, on dev ad0s1e 0xc63b1828: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc6114aa0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134900 (pid 1583) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471394, on dev ad0s1e 0xc5c36984: tag ufs, type VDIR usecount 2, writecount 0, refcount 4 mountedhere 0 flags () v_object 0xc7cb8908 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4b016c0 (pid 1588) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0927a9c at kern_linkat+0x16c #7 0xc0927d3e at kern_link+0x3e #8 0xc0927d69 at link+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 471395, on dev ad0s1e 0xc60f5000: tag ufs, type VREG usecount 1, writecount 1, refcount 3 mountedhere 0 flags () v_object 0xc6445110 ref 0 pages 1 lock type ufs: SHARED (count 1) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc090f0f4 at vop_stdadvlock+0x44 #5 0xc0be2896 at VOP_ADVLOCK_APV+0xd6 #6 0xc0858062 at kern_fcntl+0x9a2 #7 0xc0858b11 at fcntl+0x101 #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 495519, on dev ad0s1e 0xc78bd984: tag ufs, type VDIR usecount 5, writecount 0, refcount 7 mountedhere 0 flags () v_object 0xc83ca2a8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f1240 (pid 1629) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24ce at ufs_rename+0x1ae #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc0928656 at kern_rename+0x36 #8 0xc0928689 at rename+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 495542, on dev ad0s1e 0xc52f66cc: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc5bebd48 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5d0e6c0 (pid 1605) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0923758 at kern_mkdirat+0x68 #7 0xc09239de at kern_mkdir+0x2e #8 0xc0923a09 at mkdir+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 495627, on dev ad0s1e 0xc6299000: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () lock type ufs: EXCL by thread 0xc5134240 (pid 1567) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ace001 at ffs_vgetf+0x1e1 #2 0xc0ace3ee at ffs_vget+0x2e #3 0xc0aa92fe at ffs_valloc+0x59e #4 0xc0ae0bb3 at ufs_makeinode+0xc3 #5 0xc0ae1370 at ufs_create+0x30 #6 0xc0be4c35 at VOP_CREATE_APV+0xc5 #7 0xc092c0b5 at vn_open_cred+0x205 #8 0xc092c4ab at vn_open+0x3b #9 0xc092a2af at kern_openat+0x11f #10 0xc092a898 at openat+0x38 #11 0xc0bcae34 at syscall+0x2b4 #12 0xc0bad170 at Xint0x80_syscall+0x20 ino 518158, on dev ad0s1e 0xc623cd98: tag ufs, type VREG usecount 0, writecount 0, refcount 1 mountedhere 0 flags (VV_NOSYNC|VI_DOINGINACT) v_object 0xc61c0990 ref 0 pages 0 lock type ufs: EXCL by thread 0xc518a900 (pid 1591) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ace3ee at ffs_vget+0x2e #8 0xc0adaff9 at ufs_lookup_ino+0x809 #9 0xc0adb33a at ufs_lookup+0x2a #10 0xc0be2435 at VOP_CACHEDLOOKUP_APV+0xc5 #11 0xc090c5e6 at vfs_cache_lookup+0xd6 #12 0xc0be4de5 at VOP_LOOKUP_APV+0xe5 #13 0xc091398b at lookup+0x67b #14 0xc09147cf at namei+0x57f #15 0xc0924724 at kern_unlinkat+0x54 #16 0xc0924927 at kern_unlink+0x27 #17 0xc0924952 at unlink+0x22 ino 471454, on dev ad0s1e 0xc62b5984: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc5bbf198 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5d0f240 (pid 1602) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0923758 at kern_mkdirat+0x68 #7 0xc09239de at kern_mkdir+0x2e #8 0xc0923a09 at mkdir+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 495836, on dev ad0s1e 0xc646c000: tag ufs, type VREG usecount 0, writecount 0, refcount 1 mountedhere 0 flags (VV_NOSYNC|VI_DOINGINACT) v_object 0xc7d3f4c8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc559e900 (pid 1573) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ace3ee at ffs_vget+0x2e #8 0xc0adaff9 at ufs_lookup_ino+0x809 #9 0xc0adb33a at ufs_lookup+0x2a #10 0xc0be2435 at VOP_CACHEDLOOKUP_APV+0xc5 #11 0xc090c5e6 at vfs_cache_lookup+0xd6 #12 0xc0be4de5 at VOP_LOOKUP_APV+0xe5 #13 0xc091398b at lookup+0x67b #14 0xc09147cf at namei+0x57f #15 0xc0924724 at kern_unlinkat+0x54 #16 0xc09249bc at unlinkat+0x5c #17 0xc0bcae34 at syscall+0x2b4 ino 471400, on dev ad0s1e 0xc61b6414: tag ufs, type VREG usecount 0, writecount 0, refcount 1 mountedhere 0 flags (VV_NOSYNC|VI_DOINGINACT) v_object 0xc5bbf330 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4fe56c0 (pid 1575) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ace3ee at ffs_vget+0x2e #8 0xc0adaff9 at ufs_lookup_ino+0x809 #9 0xc0adb33a at ufs_lookup+0x2a #10 0xc0be2435 at VOP_CACHEDLOOKUP_APV+0xc5 #11 0xc090c5e6 at vfs_cache_lookup+0xd6 #12 0xc0be4de5 at VOP_LOOKUP_APV+0xe5 #13 0xc091398b at lookup+0x67b #14 0xc09147cf at namei+0x57f #15 0xc0924724 at kern_unlinkat+0x54 #16 0xc09249bc at unlinkat+0x5c #17 0xc0bcae34 at syscall+0x2b4 ino 518159, on dev ad0s1e 0xc60cd570: tag ufs, type VDIR usecount 2, writecount 0, refcount 3 mountedhere 0 flags () v_object 0xc67fa770 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5be3900 (pid 1600) #0 0xc0875612 at __lockmgr_args+0x592 #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0913416 at lookup+0x106 #5 0xc09147cf at namei+0x57f #6 0xc0923758 at kern_mkdirat+0x68 #7 0xc09239de at kern_mkdir+0x2e #8 0xc0923a09 at mkdir+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 497763, on dev ad0s1e 0xc5bbc15c: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc964c5d8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc559eb40 (pid 1548) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 497985, on dev ad0s1e 0xc623a15c: tag ufs, type VREG usecount 1, writecount 0, refcount 2 mountedhere 0 flags () v_object 0xc65ea6e8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f1240 (pid 1629) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24fe at ufs_rename+0x1de #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc0928656 at kern_rename+0x36 #8 0xc0928689 at rename+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 498893, on dev ad0s1e 0xc54dc570: tag ufs, type VREG usecount 1, writecount 0, refcount 2 mountedhere 0 flags () v_object 0xc615e660 ref 0 pages 0 lock type ufs: EXCL by thread 0xc518ab40 (pid 1592) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24fe at ufs_rename+0x1de #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc09286c7 at renameat+0x37 #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 447636, on dev ad0s1e 0xc6054984: tag ufs, type VREG usecount 1, writecount 1, refcount 1515 mountedhere 0 flags () v_object 0xc65e9ee0 ref 0 pages 6052 lock type ufs: EXCL by thread 0xc4afc900 (pid 1577) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 497858, on dev ad0s1e 0xc65d2828: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc65c6660 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5be4000 (pid 1582) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 447618, on dev ad0s1e 0xc53c5414: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc67faaa0 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4c5b900 (pid 1587) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 423970, on dev ad0s1e 0xc62f6c3c: tag ufs, type VREG usecount 1, writecount 0, refcount 2 mountedhere 0 flags () v_object 0xc53167f8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc95f16c0 (pid 1626) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24fe at ufs_rename+0x1de #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc0928656 at kern_rename+0x36 #8 0xc0928689 at rename+0x29 #9 0xc0bcae34 at syscall+0x2b4 #10 0xc0bad170 at Xint0x80_syscall+0x20 ino 498395, on dev ad0s1e 0xc5467ae0: tag ufs, type VREG usecount 1, writecount 1, refcount 324 mountedhere 0 flags () v_object 0xc5fe7908 ref 0 pages 1288 lock type ufs: EXCL by thread 0xc4b32240 (pid 1574) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 400482, on dev ad0s1e 0xc664615c: tag ufs, type VREG usecount 1, writecount 0, refcount 2 mountedhere 0 flags () v_object 0xc640f990 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5be3240 (pid 1569) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0ae24fe at ufs_rename+0x1de #5 0xc0be4255 at VOP_RENAME_APV+0xa5 #6 0xc09284a7 at kern_renameat+0x307 #7 0xc09286c7 at renameat+0x37 #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 499139, on dev ad0s1e 0xc65db2b8: tag ufs, type VREG usecount 0, writecount 0, refcount 2 mountedhere 0 flags (VV_NOSYNC|VI_DOINGINACT) v_object 0xc7b3c3b8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5be4480 (pid 1563) with exclusive waiters pending #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ace3ee at ffs_vget+0x2e #8 0xc0adaff9 at ufs_lookup_ino+0x809 #9 0xc0adb33a at ufs_lookup+0x2a #10 0xc0be2435 at VOP_CACHEDLOOKUP_APV+0xc5 #11 0xc090c5e6 at vfs_cache_lookup+0xd6 #12 0xc0be4de5 at VOP_LOOKUP_APV+0xe5 #13 0xc091398b at lookup+0x67b #14 0xc09147cf at namei+0x57f #15 0xc0924724 at kern_unlinkat+0x54 #16 0xc0924927 at kern_unlink+0x27 #17 0xc0924952 at unlink+0x22 ino 499143, on dev ad0s1e 0xc61b3570: tag ufs, type VREG usecount 0, writecount 0, refcount 1 mountedhere 0 flags (VV_NOSYNC|VI_DOINGINACT) v_object 0xc615f330 ref 0 pages 0 lock type ufs: EXCL by thread 0xc518d240 (pid 1596) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc09205db at vget+0xbb #5 0xc091271d at vfs_hash_get+0xed #6 0xc0acde69 at ffs_vgetf+0x49 #7 0xc0ace3ee at ffs_vget+0x2e #8 0xc0adaff9 at ufs_lookup_ino+0x809 #9 0xc0adb33a at ufs_lookup+0x2a #10 0xc0be2435 at VOP_CACHEDLOOKUP_APV+0xc5 #11 0xc090c5e6 at vfs_cache_lookup+0xd6 #12 0xc0be4de5 at VOP_LOOKUP_APV+0xe5 #13 0xc091398b at lookup+0x67b #14 0xc09147cf at namei+0x57f #15 0xc0924724 at kern_unlinkat+0x54 #16 0xc0924927 at kern_unlink+0x27 #17 0xc0924952 at unlink+0x22 ino 498811, on dev ad0s1e 0xc60fc984: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc615ed48 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134900 (pid 1583) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471456, on dev ad0s1e 0xc658cae0: tag ufs, type VREG usecount 1, writecount 1, refcount 8 mountedhere 0 flags () v_object 0xc5198ee0 ref 0 pages 22 lock type ufs: EXCL by thread 0xc4b33900 (pid 1562) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471458, on dev ad0s1e 0xc8294414: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc5bebb28 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134b40 (pid 1549) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471459, on dev ad0s1e 0xc54a515c: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc62493b8 ref 0 pages 0 lock type ufs: EXCL by thread 0xc5134000 (pid 1581) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471460, on dev ad0s1e 0xc62b52b8: tag ufs, type VREG usecount 1, writecount 1, refcount 8 mountedhere 0 flags () v_object 0xc5184e58 ref 0 pages 24 lock type ufs: EXCL by thread 0xc4b33b40 (pid 1560) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471461, on dev ad0s1e 0xc62e6d98: tag ufs, type VREG usecount 1, writecount 1, refcount 10 mountedhere 0 flags () v_object 0xc5181aa0 ref 0 pages 32 lock type ufs: EXCL by thread 0xc4dba240 (pid 1572) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471463, on dev ad0s1e 0xc61acd98: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc5faa440 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4fe5d80 (pid 1551) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471464, on dev ad0s1e 0xc61b3d98: tag ufs, type VREG usecount 1, writecount 1, refcount 8 mountedhere 0 flags () v_object 0xc606f220 ref 0 pages 24 lock type ufs: EXCL by thread 0xc4b5b480 (pid 1556) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471465, on dev ad0s1e 0xc5511570: tag ufs, type VREG usecount 1, writecount 1, refcount 12 mountedhere 0 flags () v_object 0xc6437330 ref 0 pages 40 lock type ufs: EXCL by thread 0xc4b33d80 (pid 1558) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471466, on dev ad0s1e 0xc54b0d98: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc6160a18 ref 0 pages 0 lock type ufs: EXCL by thread 0xc559ed80 (pid 1584) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471467, on dev ad0s1e 0xc60ad984: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc4e56e58 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4b016c0 (pid 1588) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471468, on dev ad0s1e 0xc62e715c: tag ufs, type VREG usecount 1, writecount 1, refcount 14 mountedhere 0 flags () v_object 0xc61a4908 ref 0 pages 46 lock type ufs: EXCL by thread 0xc4b01b40 (pid 1579) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471469, on dev ad0s1e 0xc65076cc: tag ufs, type VREG usecount 1, writecount 1, refcount 7 mountedhere 0 flags () v_object 0xc76dec38 ref 0 pages 17 lock type ufs: EXCL by thread 0xc4b33480 (pid 1564) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471484, on dev ad0s1e 0xc644ec3c: tag ufs, type VREG usecount 1, writecount 1, refcount 9 mountedhere 0 flags () v_object 0xc6339660 ref 0 pages 28 lock type ufs: EXCL by thread 0xc4b32480 (pid 1566) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471485, on dev ad0s1e 0xc54eac3c: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () v_object 0xc65c7440 ref 0 pages 0 lock type ufs: EXCL by thread 0xc4db9d80 (pid 1586) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc0927b0f at kern_linkat+0x1df #5 0xc0927d3e at kern_link+0x3e #6 0xc0927d69 at link+0x29 #7 0xc0bcae34 at syscall+0x2b4 #8 0xc0bad170 at Xint0x80_syscall+0x20 ino 471498, on dev ad0s1e 0xc54d115c: tag ufs, type VREG usecount 1, writecount 1, refcount 6 mountedhere 0 flags () v_object 0xc6114990 ref 0 pages 13 lock type ufs: EXCL by thread 0xc4b5d480 (pid 1568) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 471540, on dev ad0s1e 0xc5c856cc: tag ufs, type VREG usecount 1, writecount 1, refcount 6 mountedhere 0 flags () v_object 0xc7d3ebb0 ref 0 pages 16 lock type ufs: EXCL by thread 0xc4c5bd80 (pid 1554) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ad3671 at ffs_lock+0xa1 #2 0xc0be3c65 at VOP_LOCK1_APV+0xb5 #3 0xc092c7f8 at _vn_lock+0x78 #4 0xc092db66 at vn_write+0x156 #5 0xc08d27f5 at dofilewrite+0x95 #6 0xc08d3f48 at kern_writev+0x58 #7 0xc08d405f at write+0x4f #8 0xc0bcae34 at syscall+0x2b4 #9 0xc0bad170 at Xint0x80_syscall+0x20 ino 499390, on dev ad0s1e 0xc54d0000: tag ufs, type VREG usecount 1, writecount 0, refcount 1 mountedhere 0 flags () lock type ufs: EXCL by thread 0xc95f0d80 (pid 1631) #0 0xc0875c9e at __lockmgr_args+0xc1e #1 0xc0ace001 at ffs_vgetf+0x1e1 #2 0xc0ace3ee at ffs_vget+0x2e #3 0xc0aa92fe at ffs_valloc+0x59e #4 0xc0ae0bb3 at ufs_makeinode+0xc3 #5 0xc0ae1370 at ufs_create+0x30 #6 0xc0be4c35 at VOP_CREATE_APV+0xc5 #7 0xc092c0b5 at vn_open_cred+0x205 #8 0xc092c4ab at vn_open+0x3b #9 0xc092a2af at kern_openat+0x11f #10 0xc092a815 at kern_open+0x35 #11 0xc092a850 at open+0x30 #12 0xc0bcae34 at syscall+0x2b4 #13 0xc0bad170 at Xint0x80_syscall+0x20 ino 471622, on dev ad0s1e db:0:lockedvnods> show mount 0xc4a9bb50 /dev/ad0s1a on / (ufs) 0xc4a9c000 devfs on /dev (devfs) 0xc4c0a5a8 /dev/ad0s1f on /home (ufs) 0xc4c0a000 /dev/ad0s1d on /usr (ufs) 0xc4a9cb50 /dev/ad0s1g on /var (ufs) 0xc4a9b5a8 /dev/ad0s1e on /tmp (ufs) More info: show mount db:0:mount> ps pid ppid pgrp uid state wmesg wchan cmd 1691 1614 1074 1001 R+ mkfifo 1690 1611 1074 1001 R+ mkfifo 1689 1616 1074 1001 R+ mkfifo 1688 1613 1074 1001 R+ mkfifo 1687 1609 1074 1001 R+ mkfifo 1686 1612 1074 1001 R+ mkfifo 1685 1615 1074 1001 R+ mkfifo 1684 1610 1074 1001 R+ mkfifo 1683 1618 1074 1001 R+ mkfifo 1682 1177 1176 1001 S nanslp 0xc0dfa744 sleep 1667 1623 1074 1001 R+ lockf 1666 1621 1074 1001 R+ lockf 1665 1622 1074 1001 R+ lockf 1664 1620 1074 1001 S+ lockf 0xc8735c80 lockf 1663 1601 1074 1001 R+ lockf 1662 1606 1074 1001 S+ lockf 0xc874cbc0 lockf 1661 1608 1074 1001 R+ lockf 1660 1607 1074 1001 R+ lockf 1659 1604 1074 1001 R+ lockf 1658 1603 1074 1001 R+ lockf 1657 1624 1074 1001 R+ swap 1656 1624 1074 1001 R+ swap 1655 1624 1074 1001 R+ swap 1654 1624 1074 1001 R+ swap 1653 1624 1074 1001 R+ swap 1652 1624 1074 1001 R+ swap 1651 1624 1074 1001 R+ swap 1650 1624 1074 1001 R+ swap 1649 1624 1074 1001 R+ swap 1648 1624 1074 1001 R+ swap 1647 1625 1074 1001 R+ rename 1646 1625 1074 1001 R+ rename 1645 1625 1074 1001 R+ rename 1644 1625 1074 1001 R+ rename 1643 1624 1074 1001 R+ swap 1642 1624 1074 1001 R+ swap 1641 1624 1074 1001 R+ swap 1640 1624 1074 1001 R+ swap 1639 1624 1074 1001 R+ swap 1638 1624 1074 1001 R+ swap 1637 1625 1074 1001 R+ rename 1636 1624 1074 1001 R+ swap 1635 1625 1074 1001 R+ rename 1634 1624 1074 1001 R+ swap 1633 1625 1074 1001 R+ rename 1632 1625 1074 1001 S+ getblk 0xd85d87a0 rename 1631 1625 1074 1001 R+ CPU 2 rename 1630 1625 1074 1001 R+ rename 1629 1625 1074 1001 S+ drainvp 0xc78bdab0 rename 1628 1624 1074 1001 R+ swap 1627 1625 1074 1001 S+ nanslp 0xc0dfa744 rename 1626 1625 1074 1001 R+ rename 1625 1522 1074 1001 S+ wait 0xc95d9000 rename 1624 1523 1074 1001 S+ wait 0xc95f7aa0 swap 1623 1593 1074 1001 S+ lockf 0xc6142b80 lockf 1622 1593 1074 1001 R+ lockf 1621 1593 1074 1001 R+ lockf 1620 1593 1074 1001 R+ lockf 1619 1598 1074 1001 R+ CPU 0 mkfifo 1618 1598 1074 1001 S+ sbwait 0xc5cf7bfc mkfifo 1617 1598 1074 1001 S+ ufs 0xc50ce5c8 mkfifo 1616 1598 1074 1001 S+ sbwait 0xc4ceea60 mkfifo 1615 1598 1074 1001 S+ sbwait 0xc5579bfc mkfifo 1614 1598 1074 1001 S+ sbwait 0xc55500b8 mkfifo 1613 1598 1074 1001 S+ sbwait 0xc4db7254 mkfifo 1612 1598 1074 1001 S+ sbwait 0xc5cf758c mkfifo 1611 1598 1074 1001 S+ sbwait 0xc557958c mkfifo 1610 1598 1074 1001 S+ sbwait 0xc5cf78c4 mkfifo 1609 1598 1074 1001 S+ sbwait 0xc4dd70b8 mkfifo 1608 1593 1074 1001 S+ lockf 0xc60a8c00 lockf 1607 1593 1074 1001 R+ lockf 1606 1593 1074 1001 R+ lockf 1605 1589 1074 1001 R+ mkdir 1604 1593 1074 1001 R+ lockf 1603 1593 1074 1001 S+ lockf 0xc8ac4240 lockf 1602 1589 1074 1001 S+ getblk 0xd85ad9e0 mkdir 1601 1593 1074 1001 R+ lockf 1600 1589 1074 1001 S+ getblk 0xd85ad9e0 mkdir 1599 1589 1074 1001 S+ ufs 0xc50ce5c8 mkdir 1598 1524 1074 1001 S+ wait 0xc4c4a7f8 mkfifo 1597 1545 1074 1001 R+ openat 1596 1545 1074 1001 R+ openat 1595 1545 1074 1001 S+ getblk 0xd85ad9e0 openat 1594 1545 1074 1001 R+ openat 1593 1519 1074 1001 S+ wait 0xc4c49aa0 lockf 1592 1545 1074 1001 R+ openat 1591 1545 1074 1001 R+ openat 1590 1545 1074 1001 R+ openat 1589 1521 1074 1001 S+ wait 0xc4b2c7f8 mkdir 1588 1527 1074 1001 R+ link 1587 1527 1074 1001 R+ link 1586 1527 1074 1001 R+ link 1585 1527 1074 1001 R+ link 1584 1527 1074 1001 R+ link 1583 1527 1074 1001 R+ link 1582 1527 1074 1001 R+ link 1581 1527 1074 1001 R+ link 1580 1526 1074 1001 R+ lockf2 1579 1530 1074 1001 R+ rw 1578 1526 1074 1001 R+ lockf2 1577 1530 1074 1001 R+ rw 1576 1526 1074 1001 R+ lockf2 1575 1545 1074 1001 S+ getblk 0xd85be2c0 openat 1574 1530 1074 1001 R+ rw 1573 1545 1074 1001 R+ openat 1572 1530 1074 1001 R+ rw 1571 1545 1074 1001 S+ getblk 0xd85be2c0 openat 1570 1530 1074 1001 S+ getblk 0xd85ad9e0 rw 1569 1545 1074 1001 R+ openat 1568 1530 1074 1001 R+ CPU 1 rw 1567 1545 1074 1001 R+ openat 1566 1530 1074 1001 R+ rw 1565 1545 1074 1001 R+ openat 1564 1530 1074 1001 R+ rw 1563 1545 1074 1001 R+ openat 1562 1530 1074 1001 R+ rw 1561 1545 1074 1001 R+ openat 1560 1530 1074 1001 S+ getblk 0xd85d87a0 rw 1559 1545 1074 1001 R+ openat 1558 1530 1074 1001 S+ getblk 0xd85d87a0 rw 1557 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1556 1530 1074 1001 R+ rw 1555 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1554 1530 1074 1001 R+ CPU 3 rw 1553 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1552 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1551 1527 1074 1001 R+ link 1550 1527 1074 1001 S+ getblk 0xd85be2c0 link 1549 1527 1074 1001 R+ link 1548 1527 1074 1001 R+ link 1547 1526 1074 1001 S+ ufs 0xc50ce5c8 lockf2 1546 1526 1074 1001 R+ lockf2 1545 1515 1074 1001 S+ wait 0xc4afbaa0 openat 1544 1526 1074 1001 S+ ufs 0xc50ce5c8 lockf2 1543 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1542 1526 1074 1001 R+ lockf2 1541 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1540 1526 1074 1001 R+ lockf2 1539 1526 1074 1001 R+ lockf2 1538 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1537 1526 1074 1001 R+ lockf2 1536 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1535 1525 1074 1001 R+ creat 1534 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1533 1526 1074 1001 R+ lockf2 1532 1525 1074 1001 R+ creat 1531 1529 1074 1001 S+ nanslp 0xc0dfa744 symlink 1530 1516 1074 1001 S+ wait 0xc5b972a8 rw 1529 1514 1074 1001 S+ wait 0xc514a000 symlink 1528 1525 1074 1001 S+ ufs 0xc65db310 creat 1527 1518 1074 1001 S+ wait 0xc4c49d48 link 1526 1513 1074 1001 S+ wait 0xc4afb7f8 lockf2 1525 1520 1074 1001 S+ wait 0xc5567d48 creat 1524 1082 1074 1001 S+ nanslp 0xc0dfa744 mkfifo 1523 1082 1074 1001 S+ nanslp 0xc0dfa744 swap 1522 1082 1074 1001 S+ nanslp 0xc0dfa744 rename 1521 1082 1074 1001 S+ nanslp 0xc0dfa744 mkdir 1520 1082 1074 1001 S+ nanslp 0xc0dfa744 creat 1519 1082 1074 1001 S+ nanslp 0xc0dfa744 lockf 1518 1082 1074 1001 S+ nanslp 0xc0dfa744 link 1516 1082 1074 1001 S+ nanslp 0xc0dfa744 rw 1515 1082 1074 1001 S+ nanslp 0xc0dfa744 openat 1514 1082 1074 1001 S+ nanslp 0xc0dfa744 symlink 1513 1082 1074 1001 S+ nanslp 0xc0dfa744 lockf2 1178 1176 1176 1001 S piperd 0xc4ce5000 awk 1177 1176 1176 1001 S wait 0xc51912a8 sh 1176 1175 1176 1001 Ss wait 0xc4ac8aa0 sh 1175 1167 1167 1001 S select 0xc5681224 sshd 1174 1173 1174 1001 Ss+ select 0xc559a5a4 top 1173 1165 1165 1001 S select 0xc557b5a4 sshd 1172 1171 1172 1001 Ss kqread 0xc550cc80 tail 1171 1166 1166 1001 S select 0xc5571e24 sshd 1167 945 1167 0 Ss sbwait 0xc5550a60 sshd 1166 945 1166 0 Ss sbwait 0xc4dd88c4 sshd 1165 945 1165 0 Ss sbwait 0xc555058c sshd 1082 1081 1074 1001 S+ wait 0xc50cf000 run 1081 1080 1074 1001 S+ wait 0xc4e537f8 run 1080 1074 1074 1001 S+ nanslp 0xc0dfa744 run 1074 1059 1074 1001 S+ wait 0xc4ac5d48 sh 1059 1058 1059 1001 Ss+ wait 0xc4c49550 bash 1058 1056 1056 1001 S select 0xc4ac32e4 sshd 1056 945 1056 0 Ss sbwait 0xc4c2c728 sshd 1055 1 1055 0 Ss+ ttyin 0xc483a070 getty 1054 1 1054 0 Ss+ ttyin 0xc483a270 getty 1053 1 1053 0 Ss+ ttyin 0xc468ee70 getty 1052 1 1052 0 Ss+ ttyin 0xc468ec70 getty 1051 1 1051 0 Ss+ ttyin 0xc4820870 getty 1050 1 1050 0 Ss+ ttyin 0xc4820470 getty 1049 1 1049 0 Ss+ ttyin 0xc468ea70 getty 1048 1 1048 0 Ss+ ttyin 0xc468e670 getty 1026 1 1026 0 Ss select 0xc4ac4424 inetd 1002 1 1002 0 Ss select 0xc4a68964 moused 984 1 984 0 Ss nanslp 0xc0dfa744 watchdogd 962 1 962 0 Ss nanslp 0xc0dfa744 cron 956 1 956 25 Ss pause 0xc4db1da0 sendmail 952 1 952 0 Ss select 0xc4affaa4 sendmail 945 1 945 0 Ss select 0xc4836e24 sshd 908 1 908 0 Ss select 0xc4affe24 ntpd 809 808 808 0 R (threaded) nfsd 100107 RunQ nfsd: service 100106 RunQ nfsd: service 100105 RunQ nfsd: service 100055 RunQ nfsd: master 808 1 808 0 Ss select 0xc4836ae4 nfsd 806 1 806 0 Ss select 0xc4ac33a4 mountd 711 1 711 0 Ss select 0xc4ac3d24 rpcbind 691 1 691 0 Ss select 0xc4ac4da4 syslogd 561 1 561 0 Ss select 0xc4836964 devd 19 0 0 0 SL flowclea 0xc0f67288 [flowcleaner] 18 0 0 0 RL [softdepflush] 17 0 0 0 SL vlruwt 0xc4a51aa0 [vnlru] 16 0 0 0 SL syncer 0xc0f67094 [syncer] 15 0 0 0 SL psleep 0xc0f66dc8 [bufdaemon] 9 0 0 0 SL pgzero 0xc0f73894 [pagezero] 8 0 0 0 SL psleep 0xc0f734c4 [vmdaemon] 7 0 0 0 SL psleep 0xc0f7348c [pagedaemon] 6 0 0 0 SL - 0xc468e83c [fdc0] 14 0 0 0 SL (threaded) [usb] 100034 D - 0xc479edac [usbus0] 100033 D - 0xc479ed7c [usbus0] 100032 D - 0xc479ed4c [usbus0] 100031 D - 0xc479ed1c [usbus0] 5 0 0 0 SL ccb_scan 0xc0dc6954 [xpt_thrd] 13 0 0 0 SL - 0xc0dfa5a4 [yarrow] 4 0 0 0 SL - 0xc0df8364 [g_down] 3 0 0 0 RL [g_up] 2 0 0 0 SL - 0xc0df8358 [g_event] 12 0 0 0 RL (threaded) [intr] 100042 I [irq7: ppc0] 100040 I [swi0: uart uart] 100039 I [irq12: psm0] 100038 I [irq1: atkbd0] 100037 I [irq15: ata1] 100036 I [irq14: ata0] 100035 I [irq17: fxp0] 100030 I [irq16: uhci0] 100028 I [irq9: acpi0] 100024 I [swi2: cambio] 100022 I [swi6: task queue] 100021 I [swi6: Giant taskq] 100019 I [swi5: +] 100012 I [swi4: clock] 100011 I [swi4: clock] 100010 RunQ [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 CanRun [idle: cpu1] 100004 CanRun [idle: cpu2] 100003 CanRun [idle: cpu3] 1 0 1 0 SLs wait 0xc457ad48 [init] 10 0 0 0 SL audit_wo 0xc0f722c0 [audit] 0 0 0 0 SLs (threaded) [kernel] 100029 D - 0xc4782340 [em0 taskq] 100027 D - 0xc4749100 [acpi_task_2] 100026 D - 0xc4749100 [acpi_task_1] 100025 D - 0xc4749100 [acpi_task_0] 100020 D - 0xc4749380 [thread taskq] 100018 D - 0xc4749600 [kqueue taskq] 100016 D - 0xc4561dc0 [firmware taskq] 100000 D sched 0xc0df8440 [swapper] 1517 1082 1074 1001 Z+ fts db:0:ps> allt Tracing command mkfifo pid 1691 tid 100288 td 0xc7612d80 sched_switch(c7612d80,0,207,18c,5e87fe3a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e708ad38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1690 tid 100287 td 0xc9628d80 sched_switch(c9628d80,0,207,18c,5e164592,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e7086d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1689 tid 100286 td 0xc7614000 sched_switch(c7614000,0,207,18c,36d66c2a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e7082d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1688 tid 100285 td 0xc9630000 sched_switch(c9630000,0,207,18c,5192109e,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e707fd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1687 tid 100284 td 0xc9630240 sched_switch(c9630240,0,207,18c,5e1bc43a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e707cd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1686 tid 100221 td 0xc55a0b40 sched_switch(c55a0b40,0,207,18c,70321fe6,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e6f7cd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1685 tid 100283 td 0xc7614240 sched_switch(c7614240,0,207,18c,36d4a8e2,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e7078d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1684 tid 100208 td 0xc559e6c0 sched_switch(c559e6c0,0,207,18c,70065bfa,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,4,...) at mi_switch+0x200 ast(e6f53d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkfifo pid 1683 tid 100154 td 0xc4fe4000 sched_switch(c4fe4000,0,104,191,6477e0ca,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c4fe4000,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5cf7af4,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5cf7af4,c5cf7ab4,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5cf7a90,0,c0ca6fc6,489,0,...) at sbwait+0x76 sosend_generic(c5cf79a8,0,e6e93c58,0,0,...) at sosend_generic+0x35b sosend(c5cf79a8,0,e6e93c58,0,0,0,c4fe4000) at sosend+0x3f fifo_write_f(c4af7380,e6e93c58,c4aa0580,0,c4fe4000,...) at fifo_write_f+0x65 dofilewrite(e6e93c58,ffffffff,ffffffff,0,c4af7380,...) at dofilewrite+0x95 kern_writev(c4fe4000,3,e6e93c58,e6e93c78,1,...) at kern_writev+0x58 write(c4fe4000,e6e93cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e93d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command sleep pid 1682 tid 100282 td 0xc9630480 sched_switch(c9630480,0,104,191,db0983d6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9630480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(2711,c08c67e0,c9630480,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,2711,...) at _sleep+0x31e kern_nanosleep(c9630480,e7075c64,e7075c6c,a,0,...) at kern_nanosleep+0xc1 nanosleep(c9630480,e7075cf8,8,c9630480,c0d89b40,...) at nanosleep+0x6f syscall(e7075d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2815bad7, esp = 0xbfbfeccc, ebp = 0xbfbfed08 --- Tracing command lockf pid 1667 tid 100141 td 0xc4c5cb40 sched_switch(c4c5cb40,0,104,191,995e65e2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c4c5cb40,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6e6c9f8,c08c6a19,c0e0cb2c,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5846b80,68,e6e6ca38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5846b80,c5923d08,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6e6cacc,c60cdd94,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6e6cc00,c60cdd94,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e6cc00,c0cdb288,c7b26310,c7b26310,c60cdc3c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e6cc00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4c5cb40,3,d,e6e6cc40,0,...) at kern_fcntl+0x95f fcntl(c4c5cb40,e6e6ccf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6e6cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1666 tid 100280 td 0xc9629000 sched_switch(c9629000,0,104,191,99603742,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c9629000,0,c0ca113a,260,c0df8e38,...) at sleepq_switch+0x15f sleepq_wait(c0df8e38,0,c0c99e87,3,0,...) at sleepq_wait+0x63 _sx_xlock_hard(c0df8e38,c9629000,0,c0c99ea9,1ea,...) at _sx_xlock_hard+0x496 _sx_xlock(c0df8e38,0,c0c99ea9,1ea,c0f36440,...) at _sx_xlock+0xc0 lf_advlockasync(e7069acc,c60c52b4,4,0,c0d99ae0,...) at lf_advlockasync+0x24e lf_advlock(e7069c00,c60c52b4,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e7069c00,c0cdb288,c4af71f8,c4af71f8,c60c515c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e7069c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c9629000,3,d,e7069c40,0,...) at kern_fcntl+0x95f fcntl(c9629000,e7069cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e7069d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1665 tid 100054 td 0xc4ac9900 sched_switch(c4ac9900,0,207,18c,55e2a4fe,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6cd9d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command lockf pid 1664 tid 100279 td 0xc96306c0 sched_switch(c96306c0,0,104,191,71502d26,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c96306c0,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e70669f8,c08c6a19,c0e0c9c4,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c8735c80,68,e7066a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c8735c80,c51f6a08,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e7066acc,c5be9158,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e7066c00,c5be9158,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e7066c00,c0cdb288,c4adb4d0,c4adb4d0,c5be9000,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e7066c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c96306c0,3,d,e7066c40,0,...) at kern_fcntl+0x95f fcntl(c96306c0,e7066cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e7066d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1663 tid 100078 td 0xc4b2fb40 sched_switch(c4b2fb40,0,104,191,70313202,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c4b2fb40,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6d459f8,c08c6a19,c0e0c964,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c8585800,68,e6d45a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c8585800,c88d1c08,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6d45acc,c60eaef0,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6d45c00,c60eaef0,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6d45c00,c0cdb288,c4daf620,c4daf620,c60ead98,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6d45c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4b2fb40,3,d,e6d45c40,0,...) at kern_fcntl+0x95f fcntl(c4b2fb40,e6d45cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6d45d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1662 tid 100196 td 0xc4fe5480 sched_switch(c4fe5480,0,104,191,7008efc2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c4fe5480,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6f269f8,c08c6a19,c0e0c82c,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c874cbc0,68,e6f26a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c874cbc0,c57b4348,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6f26acc,c5ee4824,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6f26c00,c5ee4824,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6f26c00,c0cdb288,c4b26e38,c4b26e38,c5ee46cc,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6f26c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4fe5480,3,d,e6f26c40,0,...) at kern_fcntl+0x95f fcntl(c4fe5480,e6f26cf8,c,e6f26c9c,c0d88b10,...) at fcntl+0x101 syscall(e6f26d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1661 tid 100278 td 0xc9629240 sched_switch(c9629240,0,207,18c,ecd65e72,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e7061d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command lockf pid 1660 tid 100277 td 0xc9629480 sched_switch(c9629480,0,207,18c,6f852a46,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e705dd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command lockf pid 1659 tid 100065 td 0xc4ac9240 sched_switch(c4ac9240,0,104,191,70351ffe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4ac9240,0,c0ca113a,260,c0df9260,...) at sleepq_switch+0x15f sleepq_wait(c0df9260,0,c0c99e98,3,0,...) at sleepq_wait+0x63 _sx_xlock_hard(c0df9260,c4ac9240,0,c0c99ea9,5e6,...) at _sx_xlock_hard+0x496 _sx_xlock(c0df9260,0,c0c99ea9,5e6,c0f366a8,...) at _sx_xlock+0xc0 lf_advlockasync(e6d05acc,c60c5410,4,0,c0d99ae0,...) at lf_advlockasync+0xb2a lf_advlock(e6d05c00,c60c5410,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6d05c00,c0cdb288,c4daf5b0,c4daf5b0,c60c52b8,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6d05c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4ac9240,3,d,e6d05c40,0,...) at kern_fcntl+0x95f fcntl(c4ac9240,e6d05cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6d05d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1658 tid 100276 td 0xc96296c0 sched_switch(c96296c0,0,104,191,ee815e9a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c96296c0,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e70599f8,c08c6a19,c0e0cb74,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5d96e80,68,e7059a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5d96e80,c8a2b248,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e7059acc,c5eebd94,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e7059c00,c5eebd94,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e7059c00,c0cdb288,c7b263b8,c7b263b8,c5eebc3c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e7059c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c96296c0,3,d,e7059c40,0,...) at kern_fcntl+0x95f fcntl(c96296c0,e7059cf8,c,e7059c9c,c0d88b10,...) at fcntl+0x101 syscall(e7059d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command swap pid 1657 tid 100275 td 0xc9630900 sched_switch(c9630900,0,104,191,86644d52,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9630900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9630900,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9630900,e7056c64,e7056c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9630900,e7056cf8,8,c9630900,c0d89b40,...) at nanosleep+0x6f syscall(e7056d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1656 tid 100274 td 0xc9630b40 sched_switch(c9630b40,0,104,191,8641440a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9630b40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9630b40,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9630b40,e7053c64,e7053c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9630b40,e7053cf8,8,c9630b40,c0d89b40,...) at nanosleep+0x6f syscall(e7053d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1655 tid 100273 td 0xc9630d80 sched_switch(c9630d80,0,104,191,86651b16,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9630d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9630d80,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9630d80,e7050c64,e7050c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9630d80,e7050cf8,8,c9630d80,c0d89b40,...) at nanosleep+0x6f syscall(e7050d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1654 tid 100272 td 0xc9631000 sched_switch(c9631000,0,104,191,864c9f5e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9631000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9631000,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9631000,e704dc64,e704dc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9631000,e704dcf8,8,c9631000,c0d89b40,...) at nanosleep+0x6f syscall(e704dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1653 tid 100271 td 0xc95f3480 sched_switch(c95f3480,0,104,191,8661bf9e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f3480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f3480,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f3480,e704ac64,e704ac6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f3480,e704acf8,8,c95f3480,c0d89b40,...) at nanosleep+0x6f syscall(e704ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1652 tid 100270 td 0xc95f36c0 sched_switch(c95f36c0,0,104,191,861df9da,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f36c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f36c0,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f36c0,e7047c64,e7047c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f36c0,e7047cf8,8,c95f36c0,c0d89b40,...) at nanosleep+0x6f syscall(e7047d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1651 tid 100269 td 0xc95f3900 sched_switch(c95f3900,0,104,191,85fe999e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f3900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f3900,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f3900,e7044c64,e7044c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f3900,e7044cf8,8,c95f3900,c0d89b40,...) at nanosleep+0x6f syscall(e7044d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1650 tid 100268 td 0xc95f3b40 sched_switch(c95f3b40,0,104,191,86449afe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f3b40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f3b40,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f3b40,e7041c64,e7041c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f3b40,e7041cf8,8,c95f3b40,c0d89b40,...) at nanosleep+0x6f syscall(e7041d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1649 tid 100267 td 0xc95f3d80 sched_switch(c95f3d80,0,104,191,85d5936a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f3d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f3d80,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f3d80,e703ec64,e703ec6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f3d80,e703ecf8,8,c95f3d80,c0d89b40,...) at nanosleep+0x6f syscall(e703ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1648 tid 100262 td 0xc95f8000 sched_switch(c95f8000,0,104,191,85b73b2e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f8000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f8000,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f8000,e702bc64,e702bc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f8000,e702bcf8,8,c95f8000,c0d89b40,...) at nanosleep+0x6f syscall(e702bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command rename pid 1647 tid 100266 td 0xc9629900 sched_switch(c9629900,0,104,191,8552adce,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9629900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9629900,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9629900,e703ac64,e703ac6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9629900,e703acf8,8,c9629900,c0d89b40,...) at nanosleep+0x6f syscall(e703ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1646 tid 100265 td 0xc9629b40 sched_switch(c9629b40,0,104,191,853f49ee,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c9629b40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c9629b40,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c9629b40,e7036c64,e7036c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c9629b40,e7036cf8,8,c9629b40,c0d89b40,...) at nanosleep+0x6f syscall(e7036d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1645 tid 100264 td 0xc95f0000 sched_switch(c95f0000,0,104,191,86717752,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f0000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f0000,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f0000,e7032c64,e7032c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f0000,e7032cf8,8,c95f0000,c0d89b40,...) at nanosleep+0x6f syscall(e7032d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1644 tid 100263 td 0xc95f0240 sched_switch(c95f0240,0,104,191,6f6835e6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c95f0240,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c7732bc8,14,73006,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(73006,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c52f5ae0,81b0,c4aa0580,e702e8cc,e702e8b8,...) at ffs_valloc+0x569 ufs_makeinode(e702ebd0,c0dab200,e702eabc,e702ea18,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e702eabc,c0cdb94d,0,0,e702eba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e702eabc,e702ebd0,e702ea54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e702eba4,e702ec5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e702eba4,e702ec5c,1b0,c4b26620,c0cc7799,...) at vn_open+0x3b kern_openat(c95f0240,ffffff9c,bfbfe6e4,0,201,...) at kern_openat+0x11f kern_open(c95f0240,bfbfe6e4,0,200,1b0,...) at kern_open+0x35 open(c95f0240,e702ecf8,c,c0cbeca6,c0d8818c,...) at open+0x30 syscall(e702ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfe62c, ebp = 0xbfbfe768 --- Tracing command swap pid 1643 tid 100261 td 0xc95f8240 sched_switch(c95f8240,0,104,191,8505980a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f8240,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f8240,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f8240,e7028c64,e7028c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f8240,e7028cf8,8,c95f8240,c0d89b40,...) at nanosleep+0x6f syscall(e7028d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1642 tid 100260 td 0xc95f8480 sched_switch(c95f8480,0,602,18c,71132a6e,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,c0f83c60,...) at mi_switch+0x200 critical_exit(1,8049518,0) at critical_exit+0xa8 lapic_handle_timer(e7025d38) at lapic_handle_timer+0x155 Xtimerint() at Xtimerint+0x1f --- interrupt, eip = 0x8049518, esp = 0xbfbfe750, ebp = 0xbfbfe788 --- Tracing command swap pid 1641 tid 100259 td 0xc95f86c0 sched_switch(c95f86c0,0,104,191,84dca02e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f86c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f86c0,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f86c0,e7022c64,e7022c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f86c0,e7022cf8,8,c95f86c0,c0d89b40,...) at nanosleep+0x6f syscall(e7022d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1640 tid 100258 td 0xc95f8900 sched_switch(c95f8900,0,104,191,85d89e16,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f8900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f8900,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f8900,e701fc64,e701fc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f8900,e701fcf8,8,c95f8900,c0d89b40,...) at nanosleep+0x6f syscall(e701fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command swap pid 1639 tid 100257 td 0xc95f8b40 sched_switch(c95f8b40,0,207,18c,d9d65eb6,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,1,...) at mi_switch+0x200 ast(e701cd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command swap pid 1638 tid 100256 td 0xc95f8d80 sched_switch(c95f8d80,0,104,191,84b87906,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f8d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f8d80,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f8d80,e7019c64,e7019c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f8d80,e7019cf8,8,c95f8d80,c0d89b40,...) at nanosleep+0x6f syscall(e7019d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command rename pid 1637 tid 100255 td 0xc95f0480 sched_switch(c95f0480,0,104,191,8571de06,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f0480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f0480,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f0480,e7015c64,e7015c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f0480,e7015cf8,8,c95f0480,c0d89b40,...) at nanosleep+0x6f syscall(e7015d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command swap pid 1636 tid 100254 td 0xc95f9000 sched_switch(c95f9000,0,104,191,845f1bba,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f9000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f9000,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f9000,e7012c64,e7012c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f9000,e7012cf8,8,c95f9000,c0d89b40,...) at nanosleep+0x6f syscall(e7012d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command rename pid 1635 tid 100253 td 0xc95f06c0 sched_switch(c95f06c0,0,104,191,859dd3e2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f06c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f06c0,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f06c0,e700ec64,e700ec6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f06c0,e700ecf8,8,c95f06c0,c0d89b40,...) at nanosleep+0x6f syscall(e700ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command swap pid 1634 tid 100252 td 0xc95f9240 sched_switch(c95f9240,0,602,18c,3ea7d3c6,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,c0f83c60,...) at mi_switch+0x200 critical_exit(1,804951b,0) at critical_exit+0xa8 lapic_handle_timer(e700bd38) at lapic_handle_timer+0x155 Xtimerint() at Xtimerint+0x1f --- interrupt, eip = 0x804951b, esp = 0xbfbfe750, ebp = 0xbfbfe788 --- Tracing command rename pid 1633 tid 100251 td 0xc95f0900 sched_switch(c95f0900,0,104,191,84ee7f1a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f0900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f0900,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f0900,e7007c64,e7007c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f0900,e7007cf8,8,c95f0900,c0d89b40,...) at nanosleep+0x6f syscall(e7007d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1632 tid 100250 td 0xc95f0b40 sched_switch(c95f0b40,0,104,191,7177c7f2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c95f0b40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c7b4a89c,14,73005,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(73005,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60c42b8,81b0,c4aa0580,e70038cc,e70038b8,...) at ffs_valloc+0x569 ufs_makeinode(e7003bd0,c0dab200,e7003abc,e7003a18,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e7003abc,c0cdb94d,0,0,e7003ba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e7003abc,e7003bd0,e7003a54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e7003ba4,e7003c5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e7003ba4,e7003c5c,1b0,c4cdfa10,c0cc7799,...) at vn_open+0x3b kern_openat(c95f0b40,ffffff9c,bfbfe6e4,0,201,...) at kern_openat+0x11f kern_open(c95f0b40,bfbfe6e4,0,200,1b0,...) at kern_open+0x35 open(c95f0b40,e7003cf8,c,c0cbeca6,c0d8818c,...) at open+0x30 syscall(e7003d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfe62c, ebp = 0xbfbfe768 --- Tracing command rename pid 1631 tid 100249 td 0xc95f0d80 cpustop_handler(4,e6fff724,c0bcb0b6,e6fff6b4,c087d094,...) at cpustop_handler+0x32 ipi_nmi_handler(e6fff6b4,c087d094,c0dfa7f8,4,c95fd2a8,...) at ipi_nmi_handler+0x2f trap(e6fff730) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc087d679, esp = 0xe6fff770, ebp = 0xe6fff78c --- _mtx_lock_sleep(c0f72a2c,c95f0d80,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x99 _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c4a46800,...) at _mtx_lock_flags+0xf7 workitem_alloc(28,c0da9158,502,0,e,...) at workitem_alloc+0x39 softdep_setup_directory_add(d85edae0,c5253074,418,0,73246,...) at softdep_setup_directory_add+0x74 ufs_direnter(c646c984,c54d0000,e6fff8d0,e6fffbd0,0,...) at ufs_direnter+0x6fb ufs_makeinode(e6fffbd0,c0dab200,e6fffabc,e6fffa18,c0be4c35,...) at ufs_makeinode+0x595 ufs_create(e6fffabc,c0cdb94d,0,0,e6fffba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6fffabc,e6fffbd0,e6fffa54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6fffba4,e6fffc5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6fffba4,e6fffc5c,1b0,c4af7070,c0cc7799,...) at vn_open+0x3b kern_openat(c95f0d80,ffffff9c,bfbfe6e4,0,201,...) at kern_openat+0x11f kern_open(c95f0d80,bfbfe6e4,0,200,1b0,...) at kern_open+0x35 open(c95f0d80,e6fffcf8,c,c0cbeca6,c0d8818c,...) at open+0x30 syscall(e6fffd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfe62c, ebp = 0xbfbfe768 --- Tracing command rename pid 1630 tid 100248 td 0xc95f1000 sched_switch(c95f1000,0,104,191,84b2eb02,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f1000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f1000,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f1000,e6ffbc64,e6ffbc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f1000,e6ffbcf8,8,c95f1000,c0d89b40,...) at nanosleep+0x6f syscall(e6ffbd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1629 tid 100247 td 0xc95f1240 sched_switch(c95f1240,0,104,191,716ed82e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4d,...) at mi_switch+0x200 sleepq_switch(c95f1240,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c78bdab0,4d,c0cc3702,0,0,...) at sleepq_wait+0x63 _sleep(c78bdab0,c78bda7c,4d,c0cc3702,0,...) at _sleep+0x36b drain_output(c78bda7c,0,c0cc31e4,2226,0,...) at drain_output+0x81 softdep_sync_metadata(c78bd984,0,c0cc5afd,146,0,...) at softdep_sync_metadata+0xe7 ffs_syncvnode(c78bd984,1,c4538030,c0f37198,e6ff7718,...) at ffs_syncvnode+0x3e2 ffs_truncate(c78bd984,a00,0,880,c4aa0580,...) at ffs_truncate+0x6a6 ufs_direnter(c78bd984,0,e6ff7a0c,e6ff7ba0,0,...) at ufs_direnter+0x846 ufs_rename(e6ff7c1c,0,c623a15c,e6ff7bc8,0,...) at ufs_rename+0xcd3 VOP_RENAME_APV(c0daad00,e6ff7c1c,0,1,e6ff7ba0,...) at VOP_RENAME_APV+0xa5 kern_renameat(c95f1240,ffffff9c,bfbfe664,ffffff9c,bfbfe6e4,...) at kern_renameat+0x307 kern_rename(c95f1240,bfbfe664,bfbfe6e4,0,e6ff7d2c,...) at kern_rename+0x36 rename(c95f1240,e6ff7cf8,8,c0cdbaa2,c0d88f00,...) at rename+0x29 syscall(e6ff7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (128, FreeBSD ELF32, rename), eip = 0x280eabfb, esp = 0xbfbfe62c, ebp = 0xbfbfe768 --- Tracing command swap pid 1628 tid 100245 td 0xc95f9480 sched_switch(c95f9480,0,207,18c,48942916,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,1,...) at mi_switch+0x200 ast(e6ff0d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command rename pid 1627 tid 100246 td 0xc95f1480 sched_switch(c95f1480,0,104,191,6e5e87f6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f1480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c95f1480,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c95f1480,e6ff3c64,e6ff3c6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c95f1480,e6ff3cf8,8,c95f1480,c0d89b40,...) at nanosleep+0x6f syscall(e6ff3d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command rename pid 1626 tid 100244 td 0xc95f16c0 sched_switch(c95f16c0,0,104,191,6fa27812,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4d,...) at mi_switch+0x200 sleepq_switch(c95f16c0,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c623cab0,4d,c0cc3702,0,0,...) at sleepq_wait+0x63 _sleep(c623cab0,c623ca7c,4d,c0cc3702,0,...) at _sleep+0x36b drain_output(c623ca7c,0,c0cc31e4,2226,0,...) at drain_output+0x81 softdep_sync_metadata(c623c984,0,c0cc5afd,146,0,...) at softdep_sync_metadata+0xe7 ffs_syncvnode(c623c984,1,c4538030,c0f372a0,e6fec718,...) at ffs_syncvnode+0x3e2 ffs_truncate(c623c984,a00,0,880,c4aa0580,...) at ffs_truncate+0x6a6 ufs_direnter(c623c984,0,e6feca0c,e6fecba0,0,...) at ufs_direnter+0x846 ufs_rename(e6fecc1c,0,c62f6c3c,e6fecbc8,0,...) at ufs_rename+0xcd3 VOP_RENAME_APV(c0daad00,e6fecc1c,0,1,e6fecba0,...) at VOP_RENAME_APV+0xa5 kern_renameat(c95f16c0,ffffff9c,bfbfe664,ffffff9c,bfbfe6e4,...) at kern_renameat+0x307 kern_rename(c95f16c0,bfbfe664,bfbfe6e4,0,e6fecd2c,...) at kern_rename+0x36 rename(c95f16c0,e6feccf8,8,c0cdbaa2,c0d88f00,...) at rename+0x29 syscall(e6fecd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (128, FreeBSD ELF32, rename), eip = 0x280eabfb, esp = 0xbfbfe62c, ebp = 0xbfbfe768 --- Tracing command rename pid 1625 tid 100242 td 0xc95f1900 sched_switch(c95f1900,0,104,191,84acc3b6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f1900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c95d9000,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c95d9000,c95d9088,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c95f1900,65a,e6fe5c74,0,0,...) at kern_wait+0xb76 wait4(c95f1900,e6fe5cf8,10,c95f1900,c0d881c4,...) at wait4+0x3b syscall(e6fe5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe77c, ebp = 0xbfbfe798 --- Tracing command swap pid 1624 tid 100243 td 0xc95f96c0 sched_switch(c95f96c0,0,104,191,861a7062,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c95f96c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c95f7aa0,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c95f7aa0,c95f7b28,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c95f96c0,65c,e6fe9c74,0,0,...) at kern_wait+0xb76 wait4(c95f96c0,e6fe9cf8,10,c95f96c0,c0d881c4,...) at wait4+0x3b syscall(e6fe9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command lockf pid 1623 tid 100212 td 0xc559e240 sched_switch(c559e240,0,104,191,e2bc9132,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c559e240,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6f609f8,c08c6a19,c0e0c52c,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c6142b80,68,e6f60a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c6142b80,c5923d08,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6f60acc,c60cdd94,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6f60c00,c60cdd94,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6f60c00,c0cdb288,c7b26310,c7b26310,c60cdc3c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6f60c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c559e240,3,d,e6f60c40,0,...) at kern_fcntl+0x95f fcntl(c559e240,e6f60cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6f60d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1622 tid 100162 td 0xc518db40 sched_switch(c518db40,0,103,18c,4222ac2a,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4b5e580,...) at mi_switch+0x200 turnstile_wait(c4b5e580,c559eb40,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c518db40,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,c188ca80,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c96a8800,c96a8800,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f37518,...) at lf_alloc_lock+0x2a lf_advlockasync(e6eabacc,c6066d94,4,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6eabc00,c6066d94,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6eabc00,c0cdb288,c4cdf5b0,c4cdf5b0,c6066c3c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6eabc00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c518db40,3,d,e6eabc40,0,...) at kern_fcntl+0x95f fcntl(c518db40,e6eabcf8,c,e6eabc9c,c0d88b10,...) at fcntl+0x101 syscall(e6eabd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1621 tid 100217 td 0xc5d0eb40 sched_switch(c5d0eb40,0,103,18c,1f9ade7a,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766b00,...) at mi_switch+0x200 turnstile_wait(c4766b00,c4ac9240,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c5d0eb40,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,e6f6fa24,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c964a3e0,c964a3e0,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f374c0,...) at lf_alloc_lock+0x2a lf_advlockasync(e6f6facc,c60c52b4,4,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6f6fc00,c60c52b4,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6f6fc00,c0cdb288,c4af71f8,c4af71f8,c60c515c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6f6fc00,245,196,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c5d0eb40,3,c,e6f6fc40,0,...) at kern_fcntl+0x9a2 fcntl(c5d0eb40,e6f6fcf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6f6fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1620 tid 100086 td 0xc481b480 sched_switch(c481b480,0,104,191,714bf90a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c481b480,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6d959f8,c08c6a19,c0e0c964,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c875d800,68,e6d95a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c875d800,c51f6a08,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6d95acc,c5be9158,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6d95c00,c5be9158,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6d95c00,c0cdb288,c4adb4d0,c4adb4d0,c5be9000,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6d95c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c481b480,3,d,e6d95c40,0,...) at kern_fcntl+0x95f fcntl(c481b480,e6d95cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6d95d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command mkfifo pid 1619 tid 100241 td 0xc95f1b40 kdb_enter(c0c9cbe4,c0c9cbe4,c0cc5365,e6fe1638,0,...) at kdb_enter+0x3a panic(c0cc5365,0,c0cc31e4,23d0,0,...) at panic+0x136 softdep_sync_metadata(c50ce570,0,c0cc5afd,146,0,...) at softdep_sync_metadata+0x945 ffs_syncvnode(c50ce570,1,c4538030,c0f37668,e6fe1740,...) at ffs_syncvnode+0x3e2 ffs_truncate(c50ce570,5200,0,880,c4aa0580,...) at ffs_truncate+0x6a6 ufs_direnter(c50ce570,c63af6cc,e6fe19f8,e6fe1c00,0,...) at ufs_direnter+0x846 ufs_makeinode(e6fe1c00,c091f67f,c0daad00,e6fe1b28,c0dab200,...) at ufs_makeinode+0x595 ufs_mknod(e6fe1c28,c0cdb90b,0,0,e6fe1b6c,...) at ufs_mknod+0x35 VOP_MKNOD_APV(c0daad00,e6fe1c28,e6fe1c00,e6fe1b6c,0,...) at VOP_MKNOD_APV+0xc5 kern_mkfifoat(c95f1b40,ffffff9c,804d240,0,1b6,...) at kern_mkfifoat+0x217 kern_mkfifo(c95f1b40,804d240,0,1b6,e6fe1d2c,...) at kern_mkfifo+0x2e mkfifo(c95f1b40,e6fe1cf8,8,c0ca37cf,c0d88f70,...) at mkfifo+0x29 syscall(e6fe1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (132, FreeBSD ELF32, mkfifo), eip = 0x280eabdb, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command mkfifo pid 1618 tid 100240 td 0xc95f1d80 sched_switch(c95f1d80,0,104,191,64cd8912,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c95f1d80,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5cf7bfc,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5cf7bfc,c5cf7bbc,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5cf7b98,4,c0ca6fc6,5c5,c5cf7bbc,...) at sbwait+0x76 soreceive_generic(c5cf7b44,0,e6fddc58,0,0,...) at soreceive_generic+0x3f0 soreceive(c5cf7b44,0,e6fddc58,0,0,e6fddbe0,0) at soreceive+0x38 fifo_read_f(c4adcd90,e6fddc58,c4aa0580,0,c95f1d80,...) at fifo_read_f+0x6e dofileread(e6fddc58,ffffffff,ffffffff,0,c4adcd90,...) at dofileread+0x96 kern_readv(c95f1d80,3,e6fddc58,e6fddc78,1,...) at kern_readv+0x58 read(c95f1d80,e6fddcf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fddd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1617 tid 100239 td 0xc95f3000 sched_switch(c95f3000,0,104,191,36ff7cb2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c95f3000,0,c0ca113a,260,c50ce5c8,...) at sleepq_switch+0x15f sleepq_wait(c50ce5c8,50,c0c957ae,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c50ce5c8,200400,c50ce634,0,0,...) at __lockmgr_args+0x4b5 ffs_lock(e6fd9ac0,0,c4535248,200400,c50ce570,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6fd9ac0,848,c0dc55a0,c50ce570,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c50ce570,200400,c0ca979d,1f1,e6fd9b34,...) at _vn_lock+0x78 lookup(e6fd9be0,c0ca979d,ea,c5,ffffff9c,...) at lookup+0x106 namei(e6fd9be0,ffffffdf,c5c6a828,e6fd9c0c,804d240,...) at namei+0x57f kern_unlinkat(c95f3000,ffffff9c,804d240,0,e6fd9c80,...) at kern_unlinkat+0x54 kern_unlink(c95f3000,804d240,0,e6fd9d2c,c0bcae34,...) at kern_unlink+0x27 unlink(c95f3000,e6fd9cf8,4,c0ca37cf,c0d88218,...) at unlink+0x22 syscall(e6fd9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (10, FreeBSD ELF32, unlink), eip = 0x2817ab3f, esp = 0xbfbfe74c, ebp = 0xbfbfe778 --- Tracing command mkfifo pid 1616 tid 100238 td 0xc95f3240 sched_switch(c95f3240,0,104,191,36d70e3e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c95f3240,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ceea60,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4ceea60,c4ceea20,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c4cee9fc,4,c0ca6fc6,5c5,c4ceea20,...) at sbwait+0x76 soreceive_generic(c4cee9a8,0,e6fd5c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c4cee9a8,0,e6fd5c58,0,0,e6fd5be0,0) at soreceive+0x38 fifo_read_f(c4aee380,e6fd5c58,c4aa0580,0,c95f3240,...) at fifo_read_f+0x6e dofileread(e6fd5c58,ffffffff,ffffffff,0,c4aee380,...) at dofileread+0x96 kern_readv(c95f3240,3,e6fd5c58,e6fd5c78,1,...) at kern_readv+0x58 read(c95f3240,e6fd5cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fd5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1615 tid 100237 td 0xc5be46c0 sched_switch(c5be46c0,0,104,191,36d59f72,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5be46c0,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5579bfc,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5579bfc,c5579bbc,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5579b98,4,c0ca6fc6,5c5,c5579bbc,...) at sbwait+0x76 soreceive_generic(c5579b44,0,e6fd1c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c5579b44,0,e6fd1c58,0,0,e6fd1be0,0) at soreceive+0x38 fifo_read_f(c4af7c40,e6fd1c58,c4aa0580,0,c5be46c0,...) at fifo_read_f+0x6e dofileread(e6fd1c58,ffffffff,ffffffff,0,c4af7c40,...) at dofileread+0x96 kern_readv(c5be46c0,3,e6fd1c58,e6fd1c78,1,...) at kern_readv+0x58 read(c5be46c0,e6fd1cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fd1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1614 tid 100236 td 0xc5be4900 sched_switch(c5be4900,0,104,191,5e890366,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5be4900,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c55500b8,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c55500b8,c5550078,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5550054,4,c0ca6fc6,5c5,c5550078,...) at sbwait+0x76 soreceive_generic(c5550000,0,e6fcdc58,0,0,...) at soreceive_generic+0x3f0 soreceive(c5550000,0,e6fcdc58,0,0,e6fcdbe0,0) at soreceive+0x38 fifo_read_f(c4cdf7a8,e6fcdc58,c4aa0580,0,c5be4900,...) at fifo_read_f+0x6e dofileread(e6fcdc58,ffffffff,ffffffff,0,c4cdf7a8,...) at dofileread+0x96 kern_readv(c5be4900,3,e6fcdc58,e6fcdc78,1,...) at kern_readv+0x58 read(c5be4900,e6fcdcf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fcdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1613 tid 100235 td 0xc5be4b40 sched_switch(c5be4b40,0,104,191,51a6a02a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5be4b40,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4db7254,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4db7254,c4db7214,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c4db71f0,4,c0ca6fc6,5c5,c4db7214,...) at sbwait+0x76 soreceive_generic(c4db719c,0,e6fc9c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c4db719c,0,e6fc9c58,0,0,e6fc9be0,0) at soreceive+0x38 fifo_read_f(c4dafa10,e6fc9c58,c4aa0580,0,c5be4b40,...) at fifo_read_f+0x6e dofileread(e6fc9c58,ffffffff,ffffffff,0,c4dafa10,...) at dofileread+0x96 kern_readv(c5be4b40,3,e6fc9c58,e6fc9c78,1,...) at kern_readv+0x58 read(c5be4b40,e6fc9cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fc9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1612 tid 100234 td 0xc5be4d80 sched_switch(c5be4d80,0,104,191,7032d0c2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5be4d80,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5cf758c,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5cf758c,c5cf754c,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5cf7528,4,c0ca6fc6,5c5,c5cf754c,...) at sbwait+0x76 soreceive_generic(c5cf74d4,0,e6fc5c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c5cf74d4,0,e6fc5c58,0,0,e6fc5be0,0) at soreceive+0x38 fifo_read_f(c4adc8c0,e6fc5c58,c4aa0580,0,c5be4d80,...) at fifo_read_f+0x6e dofileread(e6fc5c58,ffffffff,ffffffff,0,c4adc8c0,...) at dofileread+0x96 kern_readv(c5be4d80,3,e6fc5c58,e6fc5c78,1,...) at kern_readv+0x58 read(c5be4d80,e6fc5cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fc5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1611 tid 100233 td 0xc5d0e000 sched_switch(c5d0e000,0,104,191,5e179412,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5d0e000,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c557958c,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c557958c,c557954c,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5579528,4,c0ca6fc6,5c5,c557954c,...) at sbwait+0x76 soreceive_generic(c55794d4,0,e6fc1c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c55794d4,0,e6fc1c58,0,0,e6fc1be0,0) at soreceive+0x38 fifo_read_f(c4af7540,e6fc1c58,c4aa0580,0,c5d0e000,...) at fifo_read_f+0x6e dofileread(e6fc1c58,ffffffff,ffffffff,0,c4af7540,...) at dofileread+0x96 kern_readv(c5d0e000,3,e6fc1c58,e6fc1c78,1,...) at kern_readv+0x58 read(c5d0e000,e6fc1cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fc1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1610 tid 100232 td 0xc5d0e240 sched_switch(c5d0e240,0,104,191,7007ac06,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5d0e240,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5cf78c4,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5cf78c4,c5cf7884,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5cf7860,4,c0ca6fc6,5c5,c5cf7884,...) at sbwait+0x76 soreceive_generic(c5cf780c,0,e6fbdc58,0,0,...) at soreceive_generic+0x3f0 soreceive(c5cf780c,0,e6fbdc58,0,0,e6fbdbe0,0) at soreceive+0x38 fifo_read_f(c4adc1c0,e6fbdc58,c4aa0580,0,c5d0e240,...) at fifo_read_f+0x6e dofileread(e6fbdc58,ffffffff,ffffffff,0,c4adc1c0,...) at dofileread+0x96 kern_readv(c5d0e240,3,e6fbdc58,e6fbdc78,1,...) at kern_readv+0x58 read(c5d0e240,e6fbdcf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fbdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command mkfifo pid 1609 tid 100231 td 0xc5d0e480 sched_switch(c5d0e480,0,104,191,5e1c667e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5d0e480,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4dd70b8,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4dd70b8,c4dd7078,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c4dd7054,4,c0ca6fc6,5c5,c4dd7078,...) at sbwait+0x76 soreceive_generic(c4dd7000,0,e6fb9c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c4dd7000,0,e6fb9c58,0,0,e6fb9be0,0) at soreceive+0x38 fifo_read_f(c4adb0a8,e6fb9c58,c4aa0580,0,c5d0e480,...) at fifo_read_f+0x6e dofileread(e6fb9c58,ffffffff,ffffffff,0,c4adb0a8,...) at dofileread+0x96 kern_readv(c5d0e480,3,e6fb9c58,e6fb9c78,1,...) at kern_readv+0x58 read(c5d0e480,e6fb9cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6fb9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfe71c, ebp = 0xbfbfe748 --- Tracing command lockf pid 1608 tid 100223 td 0xc7614d80 sched_switch(c7614d80,0,104,191,a929da9a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c7614d80,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6f849f8,c08c6a19,c0e0c244,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c60a8c00,68,e6f84a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c60a8c00,c55e9948,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6f84acc,c6299adc,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6f84c00,c6299adc,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6f84c00,c0cdb288,c7b26498,c7b26498,c6299984,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6f84c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c7614d80,3,d,e6f84c40,0,...) at kern_fcntl+0x95f fcntl(c7614d80,e6f84cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6f84d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1607 tid 100218 td 0xc5d0e900 sched_switch(c5d0e900,0,602,18c,715fc8e2,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,0,...) at mi_switch+0x200 critical_exit(c455aa38,c5d0e900,c455aa38,c45c1300,e,...) at critical_exit+0xa8 intr_event_handle(c45c1300,e6f729ec,0,0,c4535248,...) at intr_event_handle+0xba intr_execute_handlers(c455aa38,e6f729ec,6,e6f72a80,c0bad4d4,...) at intr_execute_handlers+0x49 lapic_handle_intr(33,e6f729ec) at lapic_handle_intr+0x4c Xapic_isr1() at Xapic_isr1+0x34 --- interrupt, eip = 0xc08d0d2f, esp = 0xe6f72a2c, ebp = 0xe6f72a80 --- witness_checkorder(c60f50c4,9,c0cc6b8f,1a7,0,...) at witness_checkorder+0x23f _mtx_lock_flags(c60f50c4,0,c0cc6b8f,1a7,c60f5000,...) at _mtx_lock_flags+0xc4 ufs_getattr(e6f72b6c,c0cdb044,c4aa0580,e6f72b6c,e6f72c00,...) at ufs_getattr+0x40 VOP_GETATTR_APV(c0daad00,e6f72b6c,c0ca9501,174,c4538308,...) at VOP_GETATTR_APV+0xc5 vop_stdadvlock(e6f72c00,c0cdb288,c7b26460,c7b26460,c60f5000,...) at vop_stdadvlock+0x6c VOP_ADVLOCK_APV(c0daad00,e6f72c00,245,196,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c5d0e900,3,c,e6f72c40,0,...) at kern_fcntl+0x9a2 fcntl(c5d0e900,e6f72cf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6f72d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1606 tid 100214 td 0xc5d0f000 sched_switch(c5d0f000,0,103,18c,42118ab6,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4b5e580,...) at mi_switch+0x200 turnstile_wait(c4b5e580,c559eb40,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c5d0f000,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,e6f66a24,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c90e4200,c90e4200,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f38540,...) at lf_alloc_lock+0x2a lf_advlockasync(e6f66acc,c5ee4824,4,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6f66c00,c5ee4824,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6f66c00,c0cdb288,c4b26e38,c4b26e38,c5ee46cc,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6f66c00,245,196,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c5d0f000,3,c,e6f66c40,0,...) at kern_fcntl+0x9a2 fcntl(c5d0f000,e6f66cf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6f66d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command mkdir pid 1605 tid 100230 td 0xc5d0e6c0 sched_switch(c5d0e6c0,0,104,191,1f9fa76a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5d0e6c0,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d852e900,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d852e900,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,789960,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,789960,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,789960,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c618b6cc,15,78c00,0,41f8,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(78c00,0,41f8,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c52f66cc,41f8,c4aa0580,e6fb5a18,1f4,...) at ffs_valloc+0x569 ufs_mkdir(e6fb5c28,c0cdb787,0,0,e6fb5b6c,...) at ufs_mkdir+0xb5 VOP_MKDIR_APV(c0daad00,e6fb5c28,e6fb5c00,e6fb5b6c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c5d0e6c0,ffffff9c,bfbfbdd3,0,1f8,...) at kern_mkdirat+0x21b kern_mkdir(c5d0e6c0,bfbfbdd3,0,1f8,e6fb5d2c,...) at kern_mkdir+0x2e mkdir(c5d0e6c0,e6fb5cf8,8,e6fb5c9c,c0d88fe0,...) at mkdir+0x29 syscall(e6fb5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x2817d5c3, esp = 0xbfbfb97c, ebp = 0xbfbfbda8 --- Tracing command lockf pid 1604 tid 100143 td 0xc5135480 sched_switch(c5135480,0,103,18c,202430aa,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766b00,...) at mi_switch+0x200 turnstile_wait(c4766b00,c4ac9240,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c5135480,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,c188ca80,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c9649460,c9649460,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f38cd0,...) at lf_alloc_lock+0x2a lf_advlockasync(e6e72acc,c60c5410,4,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6e72c00,c60c5410,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e72c00,c0cdb288,c4daf5b0,c4daf5b0,c60c52b8,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e72c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c5135480,3,d,e6e72c40,0,...) at kern_fcntl+0x95f fcntl(c5135480,e6e72cf8,c,e6e72c9c,c0d88b10,...) at fcntl+0x101 syscall(e6e72d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command lockf pid 1603 tid 100115 td 0xc4dba480 sched_switch(c4dba480,0,104,191,29e1a42e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c4dba480,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(e6e139f8,c08c6a19,c0e0c754,0,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c8ac4240,68,e6e13a38,100,0,...) at sleepq_wait_sig+0x17 _sleep(c8ac4240,c8a2b248,168,c0d8e5c4,0,...) at _sleep+0x354 lf_advlockasync(e6e13acc,c5eebd94,4,0,c0d99ae0,...) at lf_advlockasync+0xab1 lf_advlock(e6e13c00,c5eebd94,4,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e13c00,c0cdb288,c7b263b8,c7b263b8,c5eebc3c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e13c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4dba480,3,d,e6e13c40,0,...) at kern_fcntl+0x95f fcntl(c4dba480,e6e13cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6e13d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x2817aaff, esp = 0xbfbfe6ec, ebp = 0xbfbfe728 --- Tracing command mkdir pid 1602 tid 100211 td 0xc5d0f240 sched_switch(c5d0f240,0,104,191,b93845c2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5d0f240,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85ad9e0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85ad9e0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,5be2c0,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,5be2c0,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,5be2c0,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c62af6cc,10,5c000,0,41f8,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(5c000,0,41f8,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c62b5984,41f8,c4aa0580,e6f5da18,1f4,...) at ffs_valloc+0x569 ufs_mkdir(e6f5dc28,c0cdb787,0,0,e6f5db6c,...) at ufs_mkdir+0xb5 VOP_MKDIR_APV(c0daad00,e6f5dc28,e6f5dc00,e6f5db6c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c5d0f240,ffffff9c,bfbe9483,0,1f8,...) at kern_mkdirat+0x21b kern_mkdir(c5d0f240,bfbe9483,0,1f8,e6f5dd2c,...) at kern_mkdir+0x2e mkdir(c5d0f240,e6f5dcf8,8,c0cc1a1d,c0d88fe0,...) at mkdir+0x29 syscall(e6f5dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x2817d5c3, esp = 0xbfbe902c, ebp = 0xbfbe9458 --- Tracing command lockf pid 1601 tid 100197 td 0xc5d0f900 sched_switch(c5d0f900,0,207,18c,7037c20a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6f29d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command mkdir pid 1600 tid 100204 td 0xc5be3900 sched_switch(c5be3900,0,104,191,37053ed2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5be3900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85ad9e0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85ad9e0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,5be2c0,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,5be2c0,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,5be2c0,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c54c8c3c,10,5c000,0,41f8,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(5c000,0,41f8,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60cd570,41f8,c4aa0580,e6f44a18,1f4,...) at ffs_valloc+0x569 ufs_mkdir(e6f44c28,c0cdb787,0,0,e6f44b6c,...) at ufs_mkdir+0xb5 VOP_MKDIR_APV(c0daad00,e6f44c28,e6f44c00,e6f44b6c,0,...) at VOP_MKDIR_APV+0xc5 kern_mkdirat(c5be3900,ffffff9c,bfbeba33,0,1f8,...) at kern_mkdirat+0x21b kern_mkdir(c5be3900,bfbeba33,0,1f8,e6f44d2c,...) at kern_mkdir+0x2e mkdir(c5be3900,e6f44cf8,8,c0cc1a1d,c0d88fe0,...) at mkdir+0x29 syscall(e6f44d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (136, FreeBSD ELF32, mkdir), eip = 0x2817d5c3, esp = 0xbfbeb5dc, ebp = 0xbfbeba08 --- Tracing command mkdir pid 1599 tid 100190 td 0xc5be4240 sched_switch(c5be4240,0,104,191,408946ca,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5be4240,0,c0ca113a,260,c50ce5c8,...) at sleepq_switch+0x15f sleepq_wait(c50ce5c8,50,c0c957ae,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c50ce5c8,200100,c50ce634,0,0,...) at __lockmgr_args+0x4b5 ffs_lock(e6f108a4,c08cfeab,c0ca9692,200100,c50ce570,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6f108a4,c5be42e4,c0dc55a0,c50ce570,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c50ce570,200100,c0caa1ab,823,4,...) at _vn_lock+0x78 vget(c50ce570,200100,c5be4240,50,0,...) at vget+0xbb vfs_hash_get(c4a9b5a8,78c00,200000,c5be4240,e6f10a4c,...) at vfs_hash_get+0xed ffs_vgetf(c4a9b5a8,78c00,200000,e6f10a4c,0,...) at ffs_vgetf+0x49 ffs_vget(c4a9b5a8,78c00,200000,e6f10a4c,200000,...) at ffs_vget+0x2e vn_vget_ino(c5c7d6cc,78c00,200000,e6f10a4c,e6f10a5c,...) at vn_vget_ino+0x134 ufs_lookup_ino(c5c7d6cc,e6f10c18,e6f10c2c,0,e6f10aa0,...) at ufs_lookup_ino+0x99d ufs_lookup(e6f10ac0,c0cdb19a,c5c7d6cc,c5c7d6cc,e6f10c2c,...) at ufs_lookup+0x2a VOP_CACHEDLOOKUP_APV(c0daad00,e6f10ac0,e6f10c2c,e6f10c18,c4aa0580,...) at VOP_CACHEDLOOKUP_APV+0xc5 vfs_cache_lookup(e6f10b54,c0caae21,c0dc51e0,200000,e6f10c00,...) at vfs_cache_lookup+0xd6 VOP_LOOKUP_APV(c0daad00,e6f10b54,e6f10c2c,1f1,e6f10c18,...) at VOP_LOOKUP_APV+0xe5 lookup(e6f10c00,c0ca979d,ea,c5,ffffff9c,...) at lookup+0x67b namei(e6f10c00,0,ffffff9c,c5c7d828,c70bbe00,...) at namei+0x57f kern_chdir(c5be4240,804ba70,0,e6f10d2c,c0bcae34,...) at kern_chdir+0x58 chdir(c5be4240,e6f10cf8,4,c0cdbab7,c0d88250,...) at chdir+0x22 syscall(e6f10d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (12, FreeBSD ELF32, chdir), eip = 0x280eb21f, esp = 0xbfbfdf2c, ebp = 0xbfbfe358 --- Tracing command mkfifo pid 1598 tid 100085 td 0xc481b6c0 sched_switch(c481b6c0,0,104,191,8181ee62,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c481b6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4c4a7f8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c4a7f8,c4c4a880,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c481b6c0,649,e6d92c74,0,0,...) at kern_wait+0xb76 wait4(c481b6c0,e6d92cf8,10,c481b6c0,c0d881c4,...) at wait4+0x3b syscall(e6d92d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe77c, ebp = 0xbfbfe798 --- Tracing command openat pid 1597 tid 100206 td 0xc5be36c0 sched_switch(c5be36c0,0,207,18c,913061a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,1f5,...) at mi_switch+0x200 ast(e6f4bd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command openat pid 1596 tid 100166 td 0xc518d240 sched_switch(c518d240,0,104,191,7003fb3e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c518d240,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d852e900,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d852e900,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,789960,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,789960,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,789960,0,4000,0,...) at bread+0x4c ffs_freefile(c4c24200,c4a46800,c4b9d2b8,79c7b,81b0,...) at ffs_freefile+0x192 handle_workitem_freefile(c0f72a2c,0,c0cc31e4,1315,c95afc00,...) at handle_workitem_freefile+0x120 softdep_freefile(c61b3570,79c7b,81b0,c0cc31e4,18b9,...) at softdep_freefile+0x14a ffs_vfree(c61b3570,79c7b,81b0,c00,0,...) at ffs_vfree+0x2e ufs_inactive(e6eb7b74,c0cdb5b4,c61b3634,c61b3634,c61b3570,...) at ufs_inactive+0x2da VOP_INACTIVE_APV(c0daad00,e6eb7b74,c0caa1ab,924,c0dc5560,...) at VOP_INACTIVE_APV+0xc5 vinactive(c0daad00,e6eb7ba8,c0caa1ab,8aa,0,...) at vinactive+0xb1 vput(c61b3570,ffffffdf,c61b3570,e6eb7c0c,bfbfe664,...) at vput+0x1f8 kern_unlinkat(c518d240,ffffff9c,bfbfe664,0,e6eb7c80,...) at kern_unlinkat+0x1c3 kern_unlink(c518d240,bfbfe664,0,e6eb7d2c,c0bcae34,...) at kern_unlink+0x27 unlink(c518d240,e6eb7cf8,4,c0cbeca6,c0d88218,...) at unlink+0x22 syscall(e6eb7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (10, FreeBSD ELF32, unlink), eip = 0x2817ab3f, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command openat pid 1595 tid 100167 td 0xc518d000 sched_switch(c518d000,0,104,191,dccad782,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c518d000,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85ad9e0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85ad9e0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,5be2c0,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,5be2c0,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,5be2c0,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c61a59f8,10,5c06d,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(5c06d,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60c4000,81b0,c4aa0580,e6eba8e8,e6eba8d4,...) at ffs_valloc+0x569 ufs_makeinode(e6ebabec,c0dab200,e6ebaad8,e6ebaa34,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6ebaad8,c0cdb94d,0,0,e6ebabc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6ebaad8,e6ebabec,e6ebaa70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6ebabc0,e6ebac78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6ebabc0,e6ebac78,1b0,c7b26150,9e3,...) at vn_open+0x3b kern_openat(c518d000,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c518d000,e6ebacf8,10,c0ca47d1,c0d8b794,...) at openat+0x38 syscall(e6ebad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe6bc, ebp = 0xbfbfe768 --- Tracing command openat pid 1594 tid 100168 td 0xc518ad80 sched_switch(c518ad80,0,207,18c,5f1402ba,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,1f3,...) at mi_switch+0x200 ast(e6ebdd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command lockf pid 1593 tid 100090 td 0xc4c5c480 sched_switch(c4c5c480,0,104,191,82426ba2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4c5c480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4c49aa0,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c49aa0,c4c49b28,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4c5c480,641,e6da1c74,0,0,...) at kern_wait+0xb76 wait4(c4c5c480,e6da1cf8,10,c4c5c480,c0d881c4,...) at wait4+0x3b syscall(e6da1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command openat pid 1592 tid 100169 td 0xc518ab40 sched_switch(c518ab40,0,103,18c,42166f76,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766680,...) at mi_switch+0x200 turnstile_wait(c4766680,c4afc900,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c518ab40,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c58fcc40,...) at _mtx_lock_flags+0xf7 workitem_alloc(38,c0da90f8,402,81b0,1,...) at workitem_alloc+0x39 newjaddref(0,0,1,81b0,c67fe32c,...) at newjaddref+0x4e softdep_setup_link(c5252b54,c67fe32c,e6ec0bb8,e6ec0a14,c4535248,...) at softdep_setup_link+0x39 ufs_rename(e6ec0c34,0,c54dc570,e6ec0be0,0,...) at ufs_rename+0xc00 VOP_RENAME_APV(c0daad00,e6ec0c34,0,1,e6ec0bb8,...) at VOP_RENAME_APV+0xa5 kern_renameat(c518ab40,3,bfbfe6e4,3,bfbfe664,...) at kern_renameat+0x307 renameat(c518ab40,e6ec0cf8,10,c0cbeca6,c0d8b7cc,...) at renameat+0x37 syscall(e6ec0d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (501, FreeBSD ELF32, renameat), eip = 0x280e906b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command openat pid 1591 tid 100170 td 0xc518a900 sched_switch(c518a900,0,104,191,a92bb3fa,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c518a900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_freefile(c4c24200,c4a46800,c4b9d2b8,7319e,81b0,...) at ffs_freefile+0x192 handle_workitem_freefile(c0f72a2c,0,c0cc31e4,1315,c96a69e0,...) at handle_workitem_freefile+0x120 softdep_freefile(c623cd98,7319e,81b0,c0cc31e4,18b9,...) at softdep_freefile+0x14a ffs_vfree(c623cd98,7319e,81b0,c00,0,...) at ffs_vfree+0x2e ufs_inactive(e6ec3b74,c0cdb5b4,c623ce5c,c623ce5c,c623cd98,...) at ufs_inactive+0x2da VOP_INACTIVE_APV(c0daad00,e6ec3b74,c0caa1ab,924,c0dc5560,...) at VOP_INACTIVE_APV+0xc5 vinactive(c0daad00,e6ec3ba8,c0caa1ab,8aa,0,...) at vinactive+0xb1 vput(c623cd98,ffffffdf,c623cd98,e6ec3c0c,bfbfe664,...) at vput+0x1f8 kern_unlinkat(c518a900,ffffff9c,bfbfe664,0,e6ec3c80,...) at kern_unlinkat+0x1c3 kern_unlink(c518a900,bfbfe664,0,e6ec3d2c,c0bcae34,...) at kern_unlink+0x27 unlink(c518a900,e6ec3cf8,4,e6ec3c9c,c0d88218,...) at unlink+0x22 syscall(e6ec3d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (10, FreeBSD ELF32, unlink), eip = 0x2817ab3f, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command openat pid 1590 tid 100067 td 0xc4b326c0 sched_switch(c4b326c0,0,103,18c,42162152,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766680,...) at mi_switch+0x200 turnstile_wait(c4766680,c4afc900,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c4b326c0,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c58454c0,...) at _mtx_lock_flags+0xf7 workitem_alloc(38,c0da90f8,402,0,0,...) at workitem_alloc+0x39 newjaddref(0,0,0,0,df,...) at newjaddref+0x4e softdep_setup_inomapdep(d85ad980,c6001000,5c119,725,0,...) at softdep_setup_inomapdep+0x37 ffs_nodealloccg(c6001000,10,5c059,0,81b0,...) at ffs_nodealloccg+0x5b6 ffs_hashalloc(5c059,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c609e570,81b0,c4aa0580,e6d0e8e8,e6d0e8d4,...) at ffs_valloc+0x569 ufs_makeinode(e6d0ebec,c0dab200,e6d0ead8,e6d0ea34,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6d0ead8,c0cdb94d,0,0,e6d0ebc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6d0ead8,e6d0ebec,e6d0ea70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6d0ebc0,e6d0ec78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6d0ebc0,e6d0ec78,1b0,c4adb428,c1877394,...) at vn_open+0x3b kern_openat(c4b326c0,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c4b326c0,e6d0ecf8,10,e6d0ec9c,c0d8b794,...) at openat+0x38 syscall(e6d0ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command mkdir pid 1589 tid 100097 td 0xc4c5b480 sched_switch(c4c5b480,0,104,191,80d3e676,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4c5b480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4b2c7f8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4b2c7f8,c4b2c880,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4c5b480,63f,e6db6c74,0,0,...) at kern_wait+0xb76 wait4(c4c5b480,e6db6cf8,10,c4c5b480,c0d881c4,...) at wait4+0x3b syscall(e6db6d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command link pid 1588 tid 100081 td 0xc4b016c0 sched_switch(c4b016c0,0,104,191,6f71d702,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b016c0,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c6116d98,0,0,1cc259,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c5c36984,800,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c5c36984,c60ad984,e6d58a10,e6d58bfc,0,...) at ufs_direnter+0x10b ufs_link(e6d58c24,c0cdb800,0,0,c60ad984,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6d58c24,c60ad984,e6d58bfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c4b016c0,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c4b016c0,bfbfe684,bfbfe704,0,e6d58d2c,...) at kern_link+0x3e link(c4b016c0,e6d58cf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6d58d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1587 tid 100095 td 0xc4c5b900 sched_switch(c4c5b900,0,103,18c,42175b72,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766680,...) at mi_switch+0x200 turnstile_wait(c4766680,c4afc900,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c4c5b900,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c56ace80,...) at _mtx_lock_flags+0xf7 workitem_alloc(38,c0da90f8,402,81b0,1af6,...) at workitem_alloc+0x39 newjaddref(0,0,1af6,81b0,1,...) at newjaddref+0x4e softdep_setup_link(c5b93cb0,c65950e8,e6db0a04,c0bc829d,e6db0abc,...) at softdep_setup_link+0x39 ufs_link(e6db0c24,c0cdb800,0,0,c53c5414,...) at ufs_link+0xf9 VOP_LINK_APV(c0daad00,e6db0c24,c53c5414,e6db0bfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c4c5b900,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c4c5b900,bfbfe684,bfbfe704,0,e6db0d2c,...) at kern_link+0x3e link(c4c5b900,e6db0cf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6db0d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1586 tid 100118 td 0xc4db9d80 sched_switch(c4db9d80,0,104,191,6f721f82,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4db9d80,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_alloccg(c6289d98,14,1cb6a8,0,4000,...) at ffs_alloccg+0x10a ffs_hashalloc(1cb6a8,0,4000,1800,c0aaa6b0,...) at ffs_hashalloc+0x85 ffs_realloccg(c6289d98,0,0,1cc860,0,...) at ffs_realloccg+0xb59 ffs_balloc_ufs2(c60e0414,1000,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c60e0414,c54eac3c,e6e1ca10,e6e1cbfc,0,...) at ufs_direnter+0x10b ufs_link(e6e1cc24,c0cdb800,0,0,c54eac3c,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6e1cc24,c54eac3c,e6e1cbfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c4db9d80,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c4db9d80,bfbfe684,bfbfe704,0,e6e1cd2c,...) at kern_link+0x3e link(c4db9d80,e6e1ccf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6e1cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1585 tid 100171 td 0xc518a6c0 sched_switch(c518a6c0,0,104,191,6cbde78a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c518a6c0,0,c0ca113a,260,c60dfc94,...) at sleepq_switch+0x15f sleepq_wait(c60dfc94,50,c0c957ae,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c60dfc94,200400,c60dfd00,0,0,...) at __lockmgr_args+0x4b5 ffs_lock(e6ec6a3c,0,c4535248,200400,c60dfc3c,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6ec6a3c,848,c0dc55a0,c60dfc3c,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c60dfc3c,200400,c0ca979d,1f1,e6ec6ab0,...) at _vn_lock+0x78 lookup(e6ec6bd0,c0ca979d,ea,c5,ffffff9c,...) at lookup+0x106 namei(e6ec6bd0,ffffffdf,c5fd4828,e6ec6bfc,0,...) at namei+0x57f kern_linkat(c518a6c0,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x5a kern_link(c518a6c0,bfbfe684,bfbfe704,0,e6ec6d2c,...) at kern_link+0x3e link(c518a6c0,e6ec6cf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6ec6d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1584 tid 100198 td 0xc559ed80 sched_switch(c559ed80,0,104,191,6f7e90ea,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c559ed80,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d860b760,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d860b760,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72dc00,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72dc00,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72dc00,0,4000,0,...) at bread+0x4c ffs_update(c60d5c3c,0,c00,0,731ab,...) at ffs_update+0x1a2 ufs_direnter(c60d5c3c,c54b0d98,e6f2ca10,e6f2cbfc,0,...) at ufs_direnter+0x2d8 ufs_link(e6f2cc24,c0cdb800,0,0,c54b0d98,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6f2cc24,c54b0d98,e6f2cbfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c559ed80,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c559ed80,bfbfe684,bfbfe704,0,e6f2cd2c,...) at kern_link+0x3e link(c559ed80,e6f2ccf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6f2cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1583 tid 100152 td 0xc5134900 sched_switch(c5134900,0,104,191,703e7bd2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5134900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c618c740,0,0,1cc258,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c63b1828,800,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c63b1828,c60fc984,e6e8da10,e6e8dbfc,0,...) at ufs_direnter+0x10b ufs_link(e6e8dc24,c0cdb800,0,0,c60fc984,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6e8dc24,c60fc984,e6e8dbfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c5134900,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c5134900,bfbfe684,bfbfe704,0,e6e8dd2c,...) at kern_link+0x3e link(c5134900,e6e8dcf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6e8dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1582 tid 100193 td 0xc5be4000 sched_switch(c5be4000,0,602,18c,5f307d56,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,0,...) at mi_switch+0x200 critical_exit(c455aa38,c5be4000,c455aa38,c45c1300,e,...) at critical_exit+0xa8 intr_event_handle(c45c1300,e6f1b85c,c0f39450,c8b4e300,3c,...) at intr_event_handle+0xba intr_execute_handlers(c455aa38,e6f1b85c,6,e6f1b8bc,c0bad4d4,...) at intr_execute_handlers+0x49 lapic_handle_intr(33,e6f1b85c) at lapic_handle_intr+0x4c Xapic_isr1() at Xapic_isr1+0x34 --- interrupt, eip = 0xc0aeedb1, esp = 0xe6f1b89c, ebp = 0xe6f1b8bc --- mtrash_ctor(c8b4e300,40,0,502,c0cc5eba,...) at mtrash_ctor+0x21 uma_zalloc_arg(c188b000,0,502,2,c4a46800,...) at uma_zalloc_arg+0x137 malloc(28,c0da9158,502,c6158600,e,...) at malloc+0xe6 softdep_setup_directory_add(d8586160,c5c6589c,2fd38,0,6d482,...) at softdep_setup_directory_add+0x65 ufs_direnter(c5c7dc3c,c65d2828,e6f1ba10,e6f1bbfc,0,...) at ufs_direnter+0x6fb ufs_link(e6f1bc24,c0cdb800,0,0,c65d2828,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6f1bc24,c65d2828,e6f1bbfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c5be4000,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c5be4000,bfbfe684,bfbfe704,0,e6f1bd2c,...) at kern_link+0x3e link(c5be4000,e6f1bcf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6f1bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1581 tid 100177 td 0xc5134000 sched_switch(c5134000,0,104,191,6f70e332,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5134000,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d860b760,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d860b760,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72dc00,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72dc00,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72dc00,0,4000,0,...) at bread+0x4c ffs_update(c60d1ae0,0,1200,0,731a4,...) at ffs_update+0x1a2 ufs_direnter(c60d1ae0,c54a515c,e6ee5a10,e6ee5bfc,0,...) at ufs_direnter+0x2d8 ufs_link(e6ee5c24,c0cdb800,0,0,c54a515c,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6ee5c24,c54a515c,e6ee5bfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c5134000,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c5134000,bfbfe684,bfbfe704,0,e6ee5d2c,...) at kern_link+0x3e link(c5134000,e6ee5cf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6ee5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command lockf2 pid 1580 tid 100165 td 0xc518d480 sched_switch(c518d480,0,207,18c,1256dc9e,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6eb4d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command rw pid 1579 tid 100072 td 0xc4b01b40 sched_switch(c4b01b40,0,104,191,6f7fe412,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b01b40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c5bcb074,b,0,1cc862,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c62e715c,2e000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ffs_write(e6d29bc4,c0cdb883,c62e715c,0,c62e715c,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6d29bc4,c62e715c,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4adb968,e6d29c58,c4aa0580,0,c4b01b40,...) at vn_write+0x1ca dofilewrite(e6d29c58,ffffffff,ffffffff,0,c4adb968,...) at dofilewrite+0x95 kern_writev(c4b01b40,4,e6d29c58,e6d29c78,1,...) at kern_writev+0x58 write(c4b01b40,e6d29cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6d29d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command lockf2 pid 1578 tid 100199 td 0xc5be3d80 sched_switch(c5be3d80,0,207,18c,eabd700a,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6f2fd38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command rw pid 1577 tid 100100 td 0xc4afc900 sched_switch(c4afc900,0,104,191,7023eae2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4afc900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d852e900,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d852e900,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,789960,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,789960,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,789960,0,4000,0,...) at bread+0x4c ffs_alloccg(c545d828,15,1f0278,0,4000,...) at ffs_alloccg+0x10a ffs_hashalloc(1f0278,0,4000,4000,c0aaa6b0,...) at ffs_hashalloc+0x85 ffs_alloc(c545d828,5e8,0,1f0278,0,...) at ffs_alloc+0x2f2 ffs_balloc_ufs2(c6054984,17a0000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0x1a9c ffs_write(e6ddebc4,c0cdb883,c6054984,0,c6054984,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6ddebc4,c6054984,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4aeecb0,e6ddec58,c4aa0580,0,c4afc900,...) at vn_write+0x1ca dofilewrite(e6ddec58,ffffffff,ffffffff,0,c4aeecb0,...) at dofilewrite+0x95 kern_writev(c4afc900,4,e6ddec58,e6ddec78,1,...) at kern_writev+0x58 write(c4afc900,e6ddecf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6dded38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command lockf2 pid 1576 tid 100220 td 0xc55a0d80 sched_switch(c55a0d80,0,207,18c,5f04a6fe,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6f78d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command openat pid 1575 tid 100194 td 0xc4fe56c0 sched_switch(c4fe56c0,0,104,191,af6bc562,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4fe56c0,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85be2c0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85be2c0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,7e5780,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,7e5780,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,7e5780,0,4000,0,...) at bread+0x4c ffs_freefile(c4c24200,c4a46800,c4b9d2b8,7e80f,81b0,...) at ffs_freefile+0x192 handle_workitem_freefile(c0f72a2c,0,c0cc31e4,1315,c8338220,...) at handle_workitem_freefile+0x120 softdep_freefile(c61b6414,7e80f,81b0,c0cc31e4,18b9,...) at softdep_freefile+0x14a ffs_vfree(c61b6414,7e80f,81b0,c00,0,...) at ffs_vfree+0x2e ufs_inactive(e6f1eb84,c0cdb5b4,c61b64d8,c61b64d8,c61b6414,...) at ufs_inactive+0x2da VOP_INACTIVE_APV(c0daad00,e6f1eb84,c0caa1ab,924,c0dc5560,...) at VOP_INACTIVE_APV+0xc5 vinactive(c0daad00,e6f1ebb8,c0caa1ab,8aa,0,...) at vinactive+0xb1 vput(c61b6414,ffffffdf,c61b6414,e6f1ec1c,bfbfe6e4,...) at vput+0x1f8 kern_unlinkat(c4fe56c0,3,bfbfe6e4,0) at kern_unlinkat+0x1c3 unlinkat(c4fe56c0,e6f1ecf8,c,c0cbeca6,c0d8b804,...) at unlinkat+0x5c syscall(e6f1ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (503, FreeBSD ELF32, unlinkat), eip = 0x280e902b, esp = 0xbfbfe6bc, ebp = 0xbfbfe768 --- Tracing command rw pid 1574 tid 100075 td 0xc4b32240 sched_switch(c4b32240,0,103,18c,70015faa,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c518b100,...) at mi_switch+0x200 turnstile_wait(c518b100,c4c5bd80,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c4b32240,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c7fa6280,...) at _mtx_lock_flags+0xf7 workitem_alloc(50,c0da9198,502,0,c60ca910,...) at workitem_alloc+0x39 newallocindir(187e20,0,0,0,140,...) at newallocindir+0x42 softdep_setup_allocindir_page(c60ca910,d85809a0,e6d389bc,1,140,...) at softdep_setup_allocindir_page+0x5c ffs_balloc_ufs2(c5467ae0,500000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0x1bd7 ffs_write(e6d38bc4,c0cdb883,c5467ae0,0,c5467ae0,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6d38bc4,c5467ae0,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4aee1f8,e6d38c58,c4aa0580,0,c4b32240,...) at vn_write+0x1ca dofilewrite(e6d38c58,ffffffff,ffffffff,0,c4aee1f8,...) at dofilewrite+0x95 kern_writev(c4b32240,4,e6d38c58,e6d38c78,1,...) at kern_writev+0x58 write(c4b32240,e6d38cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6d38d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1573 tid 100205 td 0xc559e900 sched_switch(c559e900,0,104,191,5f8101e6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c559e900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_freefile(c4c24200,c4a46800,c4b9d2b8,73168,81b0,...) at ffs_freefile+0x192 handle_workitem_freefile(c0f72a2c,0,c0cc31e4,1315,c83addc0,...) at handle_workitem_freefile+0x120 softdep_freefile(c646c000,73168,81b0,c0cc31e4,18b9,...) at softdep_freefile+0x14a ffs_vfree(c646c000,73168,81b0,c00,0,...) at ffs_vfree+0x2e ufs_inactive(e6f48b84,c0cdb5b4,c646c0c4,c646c0c4,c646c000,...) at ufs_inactive+0x2da VOP_INACTIVE_APV(c0daad00,e6f48b84,c0caa1ab,924,c0dc5560,...) at VOP_INACTIVE_APV+0xc5 vinactive(c0daad00,e6f48bb8,c0caa1ab,8aa,0,...) at vinactive+0xb1 vput(c646c000,ffffffdf,c646c000,e6f48c1c,bfbfe6e4,...) at vput+0x1f8 kern_unlinkat(c559e900,3,bfbfe6e4,0) at kern_unlinkat+0x1c3 unlinkat(c559e900,e6f48cf8,c,c0cbeca6,c0d8b804,...) at unlinkat+0x5c syscall(e6f48d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (503, FreeBSD ELF32, unlinkat), eip = 0x280e902b, esp = 0xbfbfe6bc, ebp = 0xbfbfe768 --- Tracing command rw pid 1572 tid 100116 td 0xc4dba240 sched_switch(c4dba240,0,104,191,6fa005d2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4dba240,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_alloccg(c5bcb000,14,1cc940,0,1000,...) at ffs_alloccg+0x10a ffs_hashalloc(1cc940,0,1000,1000,c0aaa6b0,...) at ffs_hashalloc+0x85 ffs_alloc(c5bcb000,8,0,1cc940,0,...) at ffs_alloc+0x2f2 ffs_balloc_ufs2(c62e6d98,20000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0x1118 ffs_write(e6e16bc4,c0cdb883,c62e6d98,0,c62e6d98,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6e16bc4,c62e6d98,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4aee0a8,e6e16c58,c4aa0580,0,c4dba240,...) at vn_write+0x1ca dofilewrite(e6e16c58,ffffffff,ffffffff,0,c4aee0a8,...) at dofilewrite+0x95 kern_writev(c4dba240,4,e6e16c58,e6e16c78,1,...) at kern_writev+0x58 write(c4dba240,e6e16cf8,c,e6e16c9c,c0d88170,...) at write+0x4f syscall(e6e16d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1571 tid 100202 td 0xc5d0f480 sched_switch(c5d0f480,0,104,191,d617f28a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5d0f480,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85be2c0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85be2c0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,7e5780,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,7e5780,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,7e5780,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c5253a6c,16,7e802,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(7e802,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c5c3e2b8,81b0,c4aa0580,e6f3b8e8,e6f3b8d4,...) at ffs_valloc+0x569 ufs_makeinode(e6f3bbec,c0dab200,e6f3bad8,e6f3ba34,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6f3bad8,c0cdb94d,0,0,e6f3bbc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6f3bad8,e6f3bbec,e6f3ba70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6f3bbc0,e6f3bc78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6f3bbc0,e6f3bc78,1b0,c4adb3f0,104,...) at vn_open+0x3b kern_openat(c5d0f480,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c5d0f480,e6f3bcf8,10,c0ca37cf,c0d8b794,...) at openat+0x38 syscall(e6f3bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command rw pid 1570 tid 100109 td 0xc4b5d900 sched_switch(c4b5d900,0,104,191,1cae8062,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b5d900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85ad9e0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85ad9e0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,5be2c0,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,5be2c0,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,5be2c0,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c729ecb0,10,5c08f,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(5c08f,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60f9ae0,81b0,c4aa0580,e6e018cc,e6e018b8,...) at ffs_valloc+0x569 ufs_makeinode(e6e01bd0,c0dab200,e6e01abc,e6e01a18,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6e01abc,c0cdb94d,0,0,e6e01ba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6e01abc,e6e01bd0,e6e01a54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6e01ba4,e6e01c5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6e01ba4,e6e01c5c,1b0,c4af75e8,8f,...) at vn_open+0x3b kern_openat(c4b5d900,ffffff9c,bfbfe714,0,602,...) at kern_openat+0x11f kern_open(c4b5d900,bfbfe714,0,601,1b0,...) at kern_open+0x35 open(c4b5d900,e6e01cf8,c,c0ca37cf,c0d8818c,...) at open+0x30 syscall(e6e01d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfd6cc, ebp = 0xbfbfd6e8 --- Tracing command openat pid 1569 tid 100209 td 0xc5be3240 sched_switch(c5be3240,0,103,18c,70033342,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c518b100,...) at mi_switch+0x200 turnstile_wait(c518b100,c4c5bd80,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c5be3240,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c4a46800,...) at _mtx_lock_flags+0xf7 workitem_alloc(28,c0da9158,502,0,e,...) at workitem_alloc+0x39 softdep_setup_directory_add(d84ed220,c54c79f8,30,0,79dc3,...) at softdep_setup_directory_add+0x74 ufs_direnter(c5c63d98,0,e6f56a24,e6f56bb8,0,...) at ufs_direnter+0x6fb ufs_rename(e6f56c34,0,c664615c,e6f56be0,0,...) at ufs_rename+0xcd3 VOP_RENAME_APV(c0daad00,e6f56c34,0,1,e6f56bb8,...) at VOP_RENAME_APV+0xa5 kern_renameat(c5be3240,3,bfbfe6e4,3,bfbfe664,...) at kern_renameat+0x307 renameat(c5be3240,e6f56cf8,10,c0cbeca6,c0d8b7cc,...) at renameat+0x37 syscall(e6f56d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (501, FreeBSD ELF32, renameat), eip = 0x280e906b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command rw pid 1568 tid 100059 td 0xc4b5d480 cpustop_handler(2,e6ced7d8,c0bcb0b6,e6ced768,c0dfa7bc,...) at cpustop_handler+0x32 ipi_nmi_handler(e6ced768,c0dfa7bc,c0dfa7bc,c4b5d480,c4a512a8,...) at ipi_nmi_handler+0x2f trap(e6ced7e4) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc087d679, esp = 0xe6ced824, ebp = 0xe6ced840 --- _mtx_lock_sleep(c0f72a2c,c4b5d480,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x99 _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,0,...) at _mtx_lock_flags+0xf7 workitem_alloc(58,c0da91b8,502,e91,c7a90180,...) at workitem_alloc+0x39 softdep_setup_allocdirect(c5ef86cc,3,3,0,1cc958,...) at softdep_setup_allocdirect+0x48 ffs_balloc_ufs2(c54d115c,c000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0x1204 ffs_write(e6cedbc4,c0cdb883,c54d115c,0,c54d115c,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6cedbc4,c54d115c,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4b26540,e6cedc58,c4aa0580,0,c4b5d480,...) at vn_write+0x1ca dofilewrite(e6cedc58,ffffffff,ffffffff,0,c4b26540,...) at dofilewrite+0x95 kern_writev(c4b5d480,4,e6cedc58,e6cedc78,1,...) at kern_writev+0x58 write(c4b5d480,e6cedcf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6cedd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1567 tid 100175 td 0xc5134240 sched_switch(c5134240,0,103,18c,cdb7d876,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c7613d00,...) at mi_switch+0x200 turnstile_wait(c7613d00,c518d6c0,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c5134240,0,c0cc31e4,20a1,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,20a1,c4a9b5a8,...) at _mtx_lock_flags+0xf7 softdep_update_inodeblock(c5b86cb0,d859ffc0,0,4000,0,...) at softdep_update_inodeblock+0x3b ffs_update(c6299000,0,c4aa0580,0,e6edf8d4,...) at ffs_update+0x1da ufs_makeinode(e6edfbec,c0dab200,e6edfad8,e6edfa34,c0be4c35,...) at ufs_makeinode+0x45e ufs_create(e6edfad8,c0cdb94d,0,0,e6edfbc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6edfad8,e6edfbec,e6edfa70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6edfbc0,e6edfc78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6edfbc0,e6edfc78,1b0,c4daf0a8,c1877394,...) at vn_open+0x3b kern_openat(c5134240,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c5134240,e6edfcf8,10,c0cc175c,c0d8b794,...) at openat+0x38 syscall(e6edfd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command rw pid 1566 tid 100074 td 0xc4b32480 sched_switch(c4b32480,0,104,191,6f9eef8a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b32480,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_checkblk(4000,6,6,0,1cc8f0,...) at ffs_checkblk+0x1d6 ffs_reallocblks(e6d33a38,c0cdb51d,0,c644ec3c,c551902c,...) at ffs_reallocblks+0x16d1 VOP_REALLOCBLKS_APV(c0daad00,e6d33a38,0,4000,0,...) at VOP_REALLOCBLKS_APV+0xd6 cluster_write(c644ec3c,d855a840,1c000,0,1d,...) at cluster_write+0x3c2 ffs_write(e6d33bc4,c0cdb883,c644ec3c,0,c644ec3c,...) at ffs_write+0x5eb VOP_WRITE_APV(c0daad00,e6d33bc4,c644ec3c,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4adb2a0,e6d33c58,c4aa0580,0,c4b32480,...) at vn_write+0x1ca dofilewrite(e6d33c58,ffffffff,ffffffff,0,c4adb2a0,...) at dofilewrite+0x95 kern_writev(c4b32480,4,e6d33c58,e6d33c78,1,...) at kern_writev+0x58 write(c4b32480,e6d33cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6d33d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1565 tid 100186 td 0xc559f6c0 sched_switch(c559f6c0,0,104,191,70073afe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c559f6c0,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d852e900,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d852e900,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,789960,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,789960,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,789960,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c63d5984,15,78e82,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(78e82,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c7b58414,81b0,c4aa0580,e6f008e8,e6f008d4,...) at ffs_valloc+0x569 ufs_makeinode(e6f00bec,c0dab200,e6f00ad8,e6f00a34,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6f00ad8,c0cdb94d,0,0,e6f00bc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6f00ad8,e6f00bec,e6f00a70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6f00bc0,e6f00c78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6f00bc0,e6f00c78,1b0,c4aeec40,9e3,...) at vn_open+0x3b kern_openat(c559f6c0,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c559f6c0,e6f00cf8,10,c0ca47d1,c0d8b794,...) at openat+0x38 syscall(e6f00d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe6bc, ebp = 0xbfbfe768 --- Tracing command rw pid 1564 tid 100128 td 0xc4b33480 sched_switch(c4b33480,0,104,191,6f8090ca,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b33480,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c52d04fc,4,0,1cc89c,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c65076cc,11000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ffs_write(e6e3fbc4,c0cdb883,c65076cc,0,c65076cc,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6e3fbc4,c65076cc,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4adb380,e6e3fc58,c4aa0580,0,c4b33480,...) at vn_write+0x1ca dofilewrite(e6e3fc58,ffffffff,ffffffff,0,c4adb380,...) at dofilewrite+0x95 kern_writev(c4b33480,4,e6e3fc58,e6e3fc78,1,...) at kern_writev+0x58 write(c4b33480,e6e3fcf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e3fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1563 tid 100187 td 0xc5be4480 sched_switch(c5be4480,0,103,18c,700475a2,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c518b100,...) at mi_switch+0x200 turnstile_wait(c518b100,c4c5bd80,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c5be4480,0,c0cc31e4,20a1,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,20a1,c4a9b5a8,...) at _mtx_lock_flags+0xf7 softdep_update_inodeblock(c660d3a0,d856e1e0,0,4000,0,...) at softdep_update_inodeblock+0x3b ffs_update(c65db2b8,0,81b0,c00,0,...) at ffs_update+0x1da ufs_inactive(e6f06b74,c0cdb5b4,c65db37c,c65db37c,c65db2b8,...) at ufs_inactive+0x35a VOP_INACTIVE_APV(c0daad00,e6f06b74,c0caa1ab,924,c0dc5560,...) at VOP_INACTIVE_APV+0xc5 vinactive(c0daad00,e6f06ba8,c0caa1ab,8aa,0,...) at vinactive+0xb1 vput(c65db2b8,ffffffdf,c65db2b8,e6f06c0c,bfbfe664,...) at vput+0x1f8 kern_unlinkat(c5be4480,ffffff9c,bfbfe664,0,e6f06c80,...) at kern_unlinkat+0x1c3 kern_unlink(c5be4480,bfbfe664,0,e6f06d2c,c0bcae34,...) at kern_unlink+0x27 unlink(c5be4480,e6f06cf8,4,c0ca47be,c0d88218,...) at unlink+0x22 syscall(e6f06d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (10, FreeBSD ELF32, unlink), eip = 0x2817ab3f, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command rw pid 1562 tid 100126 td 0xc4b33900 sched_switch(c4b33900,0,104,191,6f803a4e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b33900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c5bbee0c,5,0,1cc898,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c658cae0,16000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ffs_write(e6e39bc4,c0cdb883,c658cae0,0,c658cae0,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6e39bc4,c658cae0,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4adc7e0,e6e39c58,c4aa0580,0,c4b33900,...) at vn_write+0x1ca dofilewrite(e6e39c58,ffffffff,ffffffff,0,c4adc7e0,...) at dofilewrite+0x95 kern_writev(c4b33900,4,e6e39c58,e6e39c78,1,...) at kern_writev+0x58 write(c4b33900,e6e39cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e39d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1561 tid 100144 td 0xc5135240 sched_switch(c5135240,0,103,18c,4216ca16,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766680,...) at mi_switch+0x200 turnstile_wait(c4766680,c4afc900,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c5135240,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,c5a1bac0,...) at _mtx_lock_flags+0xf7 workitem_alloc(38,c0da90f8,402,0,0,...) at workitem_alloc+0x39 newjaddref(0,0,0,0,df,...) at newjaddref+0x4e softdep_setup_inomapdep(d85be260,c618b570,7e811,725,0,...) at softdep_setup_inomapdep+0x37 ffs_nodealloccg(c618b570,16,7e803,0,81b0,...) at ffs_nodealloccg+0x5b6 ffs_hashalloc(7e803,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60d0570,81b0,c4aa0580,e6e758e8,e6e758d4,...) at ffs_valloc+0x569 ufs_makeinode(e6e75bec,c0dab200,e6e75ad8,e6e75a34,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6e75ad8,c0cdb94d,0,0,e6e75bc0,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6e75ad8,e6e75bec,e6e75a70,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6e75bc0,e6e75c78,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6e75bc0,e6e75c78,1b0,c4af7428,c0d9021c,...) at vn_open+0x3b kern_openat(c5135240,3,bfbfe6e4,0,201,...) at kern_openat+0x11f openat(c5135240,e6e75cf8,10,e6e75c9c,c0d8b794,...) at openat+0x38 syscall(e6e75d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (499, FreeBSD ELF32, openat), eip = 0x28100f3b, esp = 0xbfbfe63c, ebp = 0xbfbfe768 --- Tracing command rw pid 1560 tid 100125 td 0xc4b33b40 sched_switch(c4b33b40,0,104,191,71780236,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b33b40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_alloccg(c5bbee80,14,1cc480,0,1000,...) at ffs_alloccg+0x10a ffs_hashalloc(1cc480,0,1000,1000,c0aaa6b0,...) at ffs_hashalloc+0x85 ffs_alloc(c5bbee80,6,0,1cc480,0,...) at ffs_alloc+0x2f2 ffs_balloc_ufs2(c62b52b8,18000,0,1000,c4aa0580,...) at ffs_balloc_ufs2+0x1118 ffs_write(e6e36bc4,c0cdb883,c62b52b8,0,c62b52b8,...) at ffs_write+0x372 VOP_WRITE_APV(c0daad00,e6e36bc4,c62b52b8,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4b26658,e6e36c58,c4aa0580,0,c4b33b40,...) at vn_write+0x1ca dofilewrite(e6e36c58,ffffffff,ffffffff,0,c4b26658,...) at dofilewrite+0x95 kern_writev(c4b33b40,4,e6e36c58,e6e36c78,1,...) at kern_writev+0x58 write(c4b33b40,e6e36cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e36d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command openat pid 1559 tid 100164 td 0xc518d6c0 sched_switch(c518d6c0,0,207,18c,7045d18e,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,1f3,...) at mi_switch+0x200 ast(e6eb1d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command rw pid 1558 tid 100124 td 0xc4b33d80 sched_switch(c4b33d80,0,104,191,7177647e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b33d80,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_checkblk(4000,8,8,0,1cc948,...) at ffs_checkblk+0x1d6 ffs_reallocblks(e6e33a38,c0cdb51d,0,c5511570,c95b251c,...) at ffs_reallocblks+0x12e2 VOP_REALLOCBLKS_APV(c0daad00,e6e33a38,0,4000,0,...) at VOP_REALLOCBLKS_APV+0xd6 cluster_write(c5511570,d8688760,28000,0,29,...) at cluster_write+0x3c2 ffs_write(e6e33bc4,c0cdb883,c5511570,0,c5511570,...) at ffs_write+0x5eb VOP_WRITE_APV(c0daad00,e6e33bc4,c5511570,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4af72d8,e6e33c58,c4aa0580,0,c4b33d80,...) at vn_write+0x1ca dofilewrite(e6e33c58,ffffffff,ffffffff,0,c4af72d8,...) at dofilewrite+0x95 kern_writev(c4b33d80,4,e6e33c58,e6e33c78,1,...) at kern_writev+0x58 write(c4b33d80,e6e33cf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e33d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command symlink pid 1557 tid 100084 td 0xc4b01000 sched_switch(c4b01000,0,104,191,60362bce,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b01000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b01000,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b01000,e6d8bc64,e6d8bc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b01000,e6d8bcf8,8,e6d8bc9c,c0d89b40,...) at nanosleep+0x6f syscall(e6d8bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command rw pid 1556 tid 100121 td 0xc4b5b480 sched_switch(c4b5b480,0,104,191,716df3ce,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4b5b480,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_checkblk(4000,1,1,0,1cc838,...) at ffs_checkblk+0x1d6 ffs_reallocblks(e6e2aa38,c0cdb51d,0,c61b3d98,c6834968,...) at ffs_reallocblks+0x12e2 VOP_REALLOCBLKS_APV(c0daad00,e6e2aa38,0,4000,0,...) at VOP_REALLOCBLKS_APV+0xd6 cluster_write(c61b3d98,d8722880,18000,0,19,...) at cluster_write+0x3c2 ffs_write(e6e2abc4,c0cdb883,c61b3d98,0,c61b3d98,...) at ffs_write+0x5eb VOP_WRITE_APV(c0daad00,e6e2abc4,c61b3d98,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4cdfcb0,e6e2ac58,c4aa0580,0,c4b5b480,...) at vn_write+0x1ca dofilewrite(e6e2ac58,ffffffff,ffffffff,0,c4cdfcb0,...) at dofilewrite+0x95 kern_writev(c4b5b480,4,e6e2ac58,e6e2ac78,1,...) at kern_writev+0x58 write(c4b5b480,e6e2acf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6e2ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command symlink pid 1555 tid 100163 td 0xc518d900 sched_switch(c518d900,0,104,191,61e40546,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c518d900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c518d900,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c518d900,e6eaec64,e6eaec6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c518d900,e6eaecf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6eaed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command rw pid 1554 tid 100093 td 0xc4c5bd80 cpustop_handler(8,e6daa6e8,c0bcb0b6,e6daa678,c087d094,...) at cpustop_handler+0x32 ipi_nmi_handler(e6daa678,c087d094,c0dfa834,4,c4c492a8,...) at ipi_nmi_handler+0x2f trap(e6daa6f4) at trap+0x36 calltrap() at calltrap+0x6 --- trap 0x13, eip = 0xc087d679, esp = 0xe6daa734, ebp = 0xe6daa750 --- _mtx_lock_sleep(c0f72a2c,c4c5bd80,0,c0cc31e4,365,...) at _mtx_lock_sleep+0x99 _mtx_lock_flags(c0f72a2c,0,c0cc31e4,365,4000,...) at _mtx_lock_flags+0xf7 workitem_alloc(58,c0da91b8,502,4000,c75aa780,...) at workitem_alloc+0x39 softdep_setup_allocdirect(c6335244,1,1,0,1e5c70,...) at softdep_setup_allocdirect+0x48 ffs_reallocblks(e6daaa38,c0cdb51d,0,c5c856cc,c586c020,...) at ffs_reallocblks+0x13cc VOP_REALLOCBLKS_APV(c0daad00,e6daaa38,0,4000,0,...) at VOP_REALLOCBLKS_APV+0xd6 cluster_write(c5c856cc,d8557920,10000,0,11,...) at cluster_write+0x3c2 ffs_write(e6daabc4,c0cdb883,c5c856cc,0,c5c856cc,...) at ffs_write+0x5eb VOP_WRITE_APV(c0daad00,e6daabc4,c5c856cc,25f,0,...) at VOP_WRITE_APV+0x136 vn_write(c4af7a10,e6daac58,c4aa0580,0,c4c5bd80,...) at vn_write+0x1ca dofilewrite(e6daac58,ffffffff,ffffffff,0,c4af7a10,...) at dofilewrite+0x95 kern_writev(c4c5bd80,4,e6daac58,e6daac78,1,...) at kern_writev+0x58 write(c4c5bd80,e6daacf8,c,c0c84e80,c0d88170,...) at write+0x4f syscall(e6daad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x2818e093, esp = 0xbfbfd6ec, ebp = 0xbfbfe798 --- Tracing command symlink pid 1553 tid 100158 td 0xc4fe36c0 sched_switch(c4fe36c0,0,104,191,5f2c442a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4fe36c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4fe36c0,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4fe36c0,e6e9fc64,e6e9fc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4fe36c0,e6e9fcf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6e9fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command symlink pid 1552 tid 100155 td 0xc4fe3d80 sched_switch(c4fe3d80,0,104,191,5f1beafe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4fe3d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4fe3d80,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4fe3d80,e6e96c64,e6e96c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4fe3d80,e6e96cf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6e96d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command link pid 1551 tid 100185 td 0xc4fe5d80 sched_switch(c4fe5d80,0,104,191,7149e2be,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4fe5d80,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c6335cb0,0,0,1cc530,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c5c36570,1000,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c5c36570,c61acd98,e6efda10,e6efdbfc,0,...) at ufs_direnter+0x10b ufs_link(e6efdc24,c0cdb800,0,0,c61acd98,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6efdc24,c61acd98,e6efdbfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c4fe5d80,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c4fe5d80,bfbfe684,bfbfe704,0,e6efdd2c,...) at kern_link+0x3e link(c4fe5d80,e6efdcf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6efdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1550 tid 100222 td 0xc55a0900 sched_switch(c55a0900,0,104,191,1a8cb696,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c55a0900,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85be2c0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85be2c0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,7e5780,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,7e5780,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,7e5780,0,4000,0,...) at bread+0x4c ffs_nodealloccg(c6289e80,16,7e80b,0,81b0,...) at ffs_nodealloccg+0xf8 ffs_hashalloc(7e80b,0,81b0,0,c0aa95b0,...) at ffs_hashalloc+0x85 ffs_valloc(c60f9570,81b0,c4aa0580,e6f808cc,e6f808b8,...) at ffs_valloc+0x569 ufs_makeinode(e6f80bd0,c0dab200,e6f80abc,e6f80a18,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6f80abc,c0cdb94d,0,0,e6f80ba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6f80abc,e6f80bd0,e6f80a54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6f80ba4,e6f80c5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6f80ba4,e6f80c5c,1b0,c4af7b28,8f,...) at vn_open+0x3b kern_openat(c55a0900,ffffff9c,bfbfe704,0,602,...) at kern_openat+0x11f kern_open(c55a0900,bfbfe704,0,601,1b0,...) at kern_open+0x35 open(c55a0900,e6f80cf8,c,c0ca37cf,c0d8818c,...) at open+0x30 syscall(e6f80d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfe62c, ebp = 0xbfbfe648 --- Tracing command link pid 1549 tid 100151 td 0xc5134b40 sched_switch(c5134b40,0,104,191,6fe04ade,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c5134b40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d85d87a0,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d85d87a0,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,72db40,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,72db40,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,72db40,0,4000,0,...) at bread+0x4c ffs_realloccg(c63d4658,0,0,1cb6bc,0,...) at ffs_realloccg+0x58e ffs_balloc_ufs2(c63b52b8,800,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c63b52b8,c8294414,e6e8aa10,e6e8abfc,0,...) at ufs_direnter+0x10b ufs_link(e6e8ac24,c0cdb800,0,0,c8294414,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6e8ac24,c8294414,e6e8abfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c5134b40,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c5134b40,bfbfe684,bfbfe704,0,e6e8ad2c,...) at kern_link+0x3e link(c5134b40,e6e8acf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6e8ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command link pid 1548 tid 100201 td 0xc559eb40 sched_switch(c559eb40,0,104,191,7003ac9e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c559eb40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(d852e900,50,c0ca87d0,4,0,...) at sleepq_wait+0x63 __lockmgr_args(d852e900,81900,c4b9d3b0,c0ca87d0,50,...) at __lockmgr_args+0xb3f getblk(c4b9d2b8,789960,0,4000,0,...) at getblk+0x163 breadn(c4b9d2b8,789960,0,4000,0,...) at breadn+0x44 bread(c4b9d2b8,789960,0,4000,0,...) at bread+0x4c ffs_alloccg(c618b5e4,15,1e5968,0,4000,...) at ffs_alloccg+0x10a ffs_hashalloc(1e5968,0,4000,2800,c0aaa6b0,...) at ffs_hashalloc+0x85 ffs_realloccg(c618b5e4,6,0,1e56cc,0,...) at ffs_realloccg+0xb59 ffs_balloc_ufs2(c6465c3c,1a000,0,200,c4aa0580,...) at ffs_balloc_ufs2+0xf78 ufs_direnter(c6465c3c,c5bbc15c,e6f37a10,e6f37bfc,0,...) at ufs_direnter+0x10b ufs_link(e6f37c24,c0cdb800,0,0,c5bbc15c,...) at ufs_link+0x176 VOP_LINK_APV(c0daad00,e6f37c24,c5bbc15c,e6f37bfc,0,...) at VOP_LINK_APV+0xf6 kern_linkat(c559eb40,ffffff9c,ffffff9c,bfbfe684,bfbfe704,...) at kern_linkat+0x2fa kern_link(c559eb40,bfbfe684,bfbfe704,0,e6f37d2c,...) at kern_link+0x3e link(c559eb40,e6f37cf8,8,c0c49d6a,c0d881fc,...) at link+0x29 syscall(e6f37d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (9, FreeBSD ELF32, link), eip = 0x280eb23f, esp = 0xbfbfe64c, ebp = 0xbfbfe788 --- Tracing command lockf2 pid 1547 tid 100131 td 0xc4fe5000 sched_switch(c4fe5000,0,104,191,9d87561e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4fe5000,0,c0ca113a,260,c50ce5c8,...) at sleepq_switch+0x15f sleepq_wait(c50ce5c8,50,c0c957ae,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c50ce5c8,200400,c50ce634,0,0,...) at __lockmgr_args+0x4b5 ffs_lock(e6e4c910,0,c4535248,200400,c50ce570,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6e4c910,848,c0dc55a0,c50ce570,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c50ce570,200400,c0ca979d,1f1,e6e4c984,...) at _vn_lock+0x78 lookup(e6e4cba4,c0ca979d,ea,c5,ffffff9c,...) at lookup+0x106 namei(e6e4cba4,e6e4ca80,c0c975e1,5aa,0,...) at namei+0x57f vn_open_cred(e6e4cba4,e6e4cc5c,180,0,c4aa0580,...) at vn_open_cred+0x31f vn_open(e6e4cba4,e6e4cc5c,180,c4aeea80,8f,...) at vn_open+0x3b kern_openat(c4fe5000,ffffff9c,804c3c0,0,3,...) at kern_openat+0x11f kern_open(c4fe5000,804c3c0,0,2,180,...) at kern_open+0x35 open(c4fe5000,e6e4ccf8,c,c0ca3a99,c0d8818c,...) at open+0x30 syscall(e6e4cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817c603, esp = 0xbfbfe73c, ebp = 0xbfbfe778 --- Tracing command lockf2 pid 1546 tid 100133 td 0xc4fe4b40 sched_switch(c4fe4b40,0,207,18c,a3f79caa,...) at sched_switch+0x406 mi_switch(207,0,c0ca1979,d6,5c,...) at mi_switch+0x200 ast(e6e54d38) at ast+0x2b3 doreti_ast() at doreti_ast+0x17 Tracing command openat pid 1545 tid 100079 td 0xc4b2f900 sched_switch(c4b2f900,0,104,191,7e9a38d6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b2f900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4afbaa0,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4afbaa0,c4afbb28,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4b2f900,617,e6d49c74,0,0,...) at kern_wait+0xb76 wait4(c4b2f900,e6d49cf8,10,c4b2f900,c0d881c4,...) at wait4+0x3b syscall(e6d49d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe77c, ebp = 0xbfbfe798 --- Tracing command lockf2 pid 1544 tid 100147 td 0xc4fe4900 sched_switch(c4fe4900,0,104,191,79f46ec2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4fe4900,0,c0ca113a,260,c50ce5c8,...) at sleepq_switch+0x15f sleepq_wait(c50ce5c8,50,c0c957ae,4,1,...) at sleepq_wait+0x63 __lockmgr_args(c50ce5c8,200400,c50ce634,0,0,...) at __lockmgr_args+0x4b5 ffs_lock(e6e7e910,0,c4535248,200400,c50ce570,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6e7e910,848,c0dc55a0,c50ce570,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c50ce570,200400,c0ca979d,1f1,e6e7e984,...) at _vn_lock+0x78 lookup(e6e7eba4,c0ca979d,ea,c5,ffffff9c,...) at lookup+0x106 namei(e6e7eba4,e6e7ea80,c0c975e1,5aa,0,...) at namei+0x57f vn_open_cred(e6e7eba4,e6e7ec5c,180,0,c4aa0580,...) at vn_open_cred+0x31f vn_open(e6e7eba4,e6e7ec5c,180,c4daf1f8,8f,...) at vn_open+0x3b kern_openat(c4fe4900,ffffff9c,804c3c0,0,3,...) at kern_openat+0x11f kern_open(c4fe4900,804c3c0,0,2,180,...) at kern_open+0x35 open(c4fe4900,e6e7ecf8,c,c0ca3a99,c0d8818c,...) at open+0x30 syscall(e6e7ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817c603, esp = 0xbfbfe73c, ebp = 0xbfbfe778 --- Tracing command symlink pid 1543 tid 100156 td 0xc4fe3b40 sched_switch(c4fe3b40,0,104,191,5fb7f1be,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4fe3b40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4fe3b40,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4fe3b40,e6e99c64,e6e99c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4fe3b40,e6e99cf8,8,e6e99c9c,c0d89b40,...) at nanosleep+0x6f syscall(e6e99d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command lockf2 pid 1542 tid 100148 td 0xc4fe46c0 sched_switch(c4fe46c0,0,103,18c,2009186a,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766b00,...) at mi_switch+0x200 turnstile_wait(c4766b00,c4ac9240,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c4fe46c0,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,e6e81a24,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c94ea700,c94ea700,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f38330,...) at lf_alloc_lock+0x2a lf_advlockasync(e6e81acc,c5c642b4,100000,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6e81c00,c5c642b4,100000,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e81c00,c0cdb288,c4cdfa48,c4cdfa48,c5c6415c,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e81c00,245,196,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4fe46c0,3,c,e6e81c40,5e35c,...) at kern_fcntl+0x9a2 fcntl(c4fe46c0,e6e81cf8,c,c0ca39a8,c0d88b10,...) at fcntl+0x101 syscall(e6e81d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x28179aff, esp = 0xbfbfe6fc, ebp = 0xbfbfe738 --- Tracing command symlink pid 1541 tid 100213 td 0xc5be3000 sched_switch(c5be3000,0,104,191,5f21543e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5be3000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c5be3000,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c5be3000,e6f63c64,e6f63c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c5be3000,e6f63cf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6f63d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command lockf2 pid 1540 tid 100149 td 0xc4fe4480 sched_switch(c4fe4480,0,602,18c,6e712ba,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,0,...) at mi_switch+0x200 critical_exit(c455aa38,c4fe4480,c455aa38,c45c1300,e,...) at critical_exit+0xa8 intr_event_handle(c45c1300,e6e84a0c,c08cfeab,c5705900,c5999cc0,...) at intr_event_handle+0xba intr_execute_handlers(c455aa38,e6e84a0c,6,e6e84a4c,c0bad4d4,...) at intr_execute_handlers+0x49 lapic_handle_intr(33,e6e84a0c) at lapic_handle_intr+0x4c Xapic_isr1() at Xapic_isr1+0x34 --- interrupt, eip = 0xc087663b, esp = 0xe6e84a4c, ebp = 0xe6e84a4c --- lf_blocks(c0df9260,c0c99ea9,5e8,5e6,c0f386f8,...) at lf_blocks+0xb lf_advlockasync(e6e84acc,c72ae56c,100000,0,c0d99ae0,...) at lf_advlockasync+0xd2d lf_advlock(e6e84c00,c72ae56c,100000,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e84c00,c0cdb288,c4daf700,c4daf700,c72ae414,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e84c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4fe4480,3,d,e6e84c40,8ab46,...) at kern_fcntl+0x95f fcntl(c4fe4480,e6e84cf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6e84d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x28179aff, esp = 0xbfbfe6fc, ebp = 0xbfbfe738 --- Tracing command lockf2 pid 1539 tid 100150 td 0xc4fe4240 sched_switch(c4fe4240,0,602,18c,ee32bf0e,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,c0f83c60,...) at mi_switch+0x200 critical_exit(0,c0876635,0) at critical_exit+0xa8 lapic_handle_timer(e6e87a0c) at lapic_handle_timer+0x155 Xtimerint() at Xtimerint+0x1f --- interrupt, eip = 0xc0876635, esp = 0xe6e87a4c, ebp = 0xe6e87a4c --- lf_blocks(c0df9260,c0c99ea9,5e8,5e6,c0f39828,...) at lf_blocks+0x5 lf_advlockasync(e6e87acc,c801bef0,100000,0,c0d99ae0,...) at lf_advlockasync+0xd2d lf_advlock(e6e87c00,c801bef0,100000,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e87c00,c0cdb288,c4aee3f0,c4aee3f0,c801bd98,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e87c00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4fe4240,3,d,e6e87c40,85647,...) at kern_fcntl+0x95f fcntl(c4fe4240,e6e87cf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6e87d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x28179aff, esp = 0xbfbfe6fc, ebp = 0xbfbfe738 --- Tracing command symlink pid 1538 tid 100058 td 0xc4b32b40 sched_switch(c4b32b40,0,104,191,5f7de846,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b32b40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b32b40,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b32b40,e6ce9c64,e6ce9c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b32b40,e6ce9cf8,8,e6ce9c9c,c0d89b40,...) at nanosleep+0x6f syscall(e6ce9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command lockf2 pid 1537 tid 100088 td 0xc4c5c900 sched_switch(c4c5c900,0,602,18c,65463e0a,...) at sched_switch+0x406 mi_switch(602,0,c0c9d2d6,cf,c0f83c60,...) at mi_switch+0x200 critical_exit(0,c0876631,0) at critical_exit+0xa8 lapic_handle_timer(e6d9ba0c) at lapic_handle_timer+0x155 Xtimerint() at Xtimerint+0x1f --- interrupt, eip = 0xc0876631, esp = 0xe6d9ba4c, ebp = 0xe6d9bab4 --- lf_blocks(e6d9bacc,c646c824,100000,0,c0d99ae0,...) at lf_blocks+0x1 lf_advlock(e6d9bc00,c646c824,100000,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6d9bc00,c0cdb288,c4af7888,c4af7888,c646c6cc,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6d9bc00,c0c975d8,25b,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4c5c900,3,d,e6d9bc40,4267d,...) at kern_fcntl+0x95f fcntl(c4c5c900,e6d9bcf8,c,c0ca37c9,c0d88b10,...) at fcntl+0x101 syscall(e6d9bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x28179aff, esp = 0xbfbfe6fc, ebp = 0xbfbfe738 --- Tracing command symlink pid 1536 tid 100228 td 0xc7614900 sched_switch(c7614900,0,104,191,615830f2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c7614900,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c7614900,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c7614900,e6fa4c64,e6fa4c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c7614900,e6fa4cf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6fa4d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command creat pid 1535 tid 100207 td 0xc5be3480 sched_switch(c5be3480,0,104,191,8264392a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5be3480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c5be3480,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c5be3480,e6f4fc64,e6f4fc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c5be3480,e6f4fcf8,8,c5be3480,c0d89b40,...) at nanosleep+0x6f syscall(e6f4fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command symlink pid 1534 tid 100229 td 0xc76146c0 sched_switch(c76146c0,0,104,191,5f26a6ba,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c76146c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c76146c0,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c76146c0,e6fa7c64,e6fa7c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c76146c0,e6fa7cf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6fa7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command lockf2 pid 1533 tid 100139 td 0xc4db9000 sched_switch(c4db9000,0,103,18c,2022028a,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4766b00,...) at mi_switch+0x200 turnstile_wait(c4766b00,c4ac9240,0,1ac,c1894888,...) at turnstile_wait+0x48a _mtx_lock_sleep(c1894888,c4db9000,0,c0cc7790,7c8,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c1894888,0,c0cc7790,7c8,e6e66a24,...) at _mtx_lock_flags+0xf7 uma_zalloc_arg(c188b000,0,102,2,0,...) at uma_zalloc_arg+0xd3 malloc(38,c0d8e5b4,102,c9649620,c9649620,...) at malloc+0xe6 lf_alloc_lock(c0df8e38,c0c99ea9,21c,1ea,c0f39720,...) at lf_alloc_lock+0x2a lf_advlockasync(e6e66acc,c5c636c8,100000,0,c0d99ae0,...) at lf_advlockasync+0x37f lf_advlock(e6e66c00,c5c636c8,100000,0,1,...) at lf_advlock+0x55 vop_stdadvlock(e6e66c00,c0cdb288,c4cdf888,c4cdf888,c5c63570,...) at vop_stdadvlock+0xb5 VOP_ADVLOCK_APV(c0daad00,e6e66c00,245,196,c0929ddf,...) at VOP_ADVLOCK_APV+0xd6 kern_fcntl(c4db9000,3,c,e6e66c40,9b0ce,...) at kern_fcntl+0x9a2 fcntl(c4db9000,e6e66cf8,c,e6e66c9c,c0d88b10,...) at fcntl+0x101 syscall(e6e66d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (92, FreeBSD ELF32, fcntl), eip = 0x28179aff, esp = 0xbfbfe6fc, ebp = 0xbfbfe738 --- Tracing command creat pid 1532 tid 100098 td 0xc4afcd80 sched_switch(c4afcd80,0,104,191,7ed59c96,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4afcd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(1f41,c08c67e0,c4afcd80,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,1f41,...) at _sleep+0x31e kern_nanosleep(c4afcd80,e6dbdc64,e6dbdc6c,8,0,...) at kern_nanosleep+0xc1 nanosleep(c4afcd80,e6dbdcf8,8,c4afcd80,c0d89b40,...) at nanosleep+0x6f syscall(e6dbdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe75c, ebp = 0xbfbfe788 --- Tracing command symlink pid 1531 tid 100176 td 0xc518a000 sched_switch(c518a000,0,104,191,1271024e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c518a000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c518a000,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c518a000,e6ee2c64,e6ee2c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c518a000,e6ee2cf8,8,c0cc2bc0,c0d89b40,...) at nanosleep+0x6f syscall(e6ee2d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe66c, ebp = 0xbfbfe698 --- Tracing command rw pid 1530 tid 100195 td 0xc559f000 sched_switch(c559f000,0,104,191,7ca32516,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c559f000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5b972a8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5b972a8,c5b97330,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c559f000,612,e6f23c74,0,0,...) at kern_wait+0xb76 wait4(c559f000,e6f23cf8,10,c559f000,c0d881c4,...) at wait4+0x3b syscall(e6f23d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe79c, ebp = 0xbfbfe7b8 --- Tracing command symlink pid 1529 tid 100160 td 0xc4fe3240 sched_switch(c4fe3240,0,104,191,7b35cec2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4fe3240,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c514a000,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c514a000,c514a088,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4fe3240,5fb,e6ea5c74,0,0,...) at kern_wait+0xb76 wait4(c4fe3240,e6ea5cf8,10,c4fe3240,c0d881c4,...) at wait4+0x3b syscall(e6ea5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe76c, ebp = 0xbfbfe788 --- Tracing command creat pid 1528 tid 100099 td 0xc4afcb40 sched_switch(c4afcb40,0,104,191,6fd3e3ae,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4afcb40,0,c0ca113a,260,50,...) at sleepq_switch+0x15f sleepq_wait(c65db310,50,c0c957ae,4,0,...) at sleepq_wait+0x63 __lockmgr_args(c65db310,80100,c65db37c,0,0,...) at __lockmgr_args+0xb3f ffs_lock(e6dc16e0,c08cfeab,c0ca9692,80100,c65db2b8,...) at ffs_lock+0xa1 VOP_LOCK1_APV(c0daad00,e6dc16e0,c4afcbe4,c0dc55a0,c65db2b8,...) at VOP_LOCK1_APV+0xb5 _vn_lock(c65db2b8,80100,c0caa1ab,823,4,...) at _vn_lock+0x78 vget(c65db2b8,80100,c4afcb40,50,0,...) at vget+0xbb vfs_hash_get(c4a9b5a8,79dc7,80000,c4afcb40,e6dc18cc,...) at vfs_hash_get+0xed ffs_vgetf(c4a9b5a8,79dc7,80000,e6dc18cc,0,...) at ffs_vgetf+0x49 ffs_vget(c4a9b5a8,79dc7,80000,e6dc18cc,c0aa95b0,...) at ffs_vget+0x2e ffs_valloc(c707c414,81b0,c4aa0580,e6dc18cc,e6dc18b8,...) at ffs_valloc+0x59e ufs_makeinode(e6dc1bd0,c0dab200,e6dc1abc,e6dc1a18,c0be4c35,...) at ufs_makeinode+0xc3 ufs_create(e6dc1abc,c0cdb94d,0,0,e6dc1ba4,...) at ufs_create+0x30 VOP_CREATE_APV(c0daad00,e6dc1abc,e6dc1bd0,e6dc1a54,0,...) at VOP_CREATE_APV+0xc5 vn_open_cred(e6dc1ba4,e6dc1c5c,1b0,0,c4aa0580,...) at vn_open_cred+0x205 vn_open(e6dc1ba4,e6dc1c5c,1b0,c4b26bd0,c0cc7799,...) at vn_open+0x3b kern_openat(c4afcb40,ffffff9c,bfbfe704,0,602,...) at kern_openat+0x11f kern_open(c4afcb40,bfbfe704,0,601,1b0,...) at kern_open+0x35 open(c4afcb40,e6dc1cf8,c,c0cbeca6,c0d8818c,...) at open+0x30 syscall(e6dc1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (5, FreeBSD ELF32, open), eip = 0x2817d603, esp = 0xbfbfe6ac, ebp = 0xbfbfe6c8 --- Tracing command link pid 1527 tid 100089 td 0xc4c5c6c0 sched_switch(c4c5c6c0,0,104,191,7d3584e6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4c5c6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4c49d48,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c49d48,c4c49dd0,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4c5c6c0,60c,e6d9ec74,0,0,...) at kern_wait+0xb76 wait4(c4c5c6c0,e6d9ecf8,10,c4c5c6c0,c0d881c4,...) at wait4+0x3b syscall(e6d9ed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command lockf2 pid 1526 tid 100080 td 0xc4b2f6c0 sched_switch(c4b2f6c0,0,104,191,7cb38306,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b2f6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4afb7f8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4afb7f8,c4afb880,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4b2f6c0,5fd,e6d50c74,0,0,...) at kern_wait+0xb76 wait4(c4b2f6c0,e6d50cf8,10,c4b2f6c0,c0d881c4,...) at wait4+0x3b syscall(e6d50d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810007b, esp = 0xbfbfe77c, ebp = 0xbfbfe798 --- Tracing command creat pid 1525 tid 100219 td 0xc518dd80 sched_switch(c518dd80,0,104,191,7b0d1dda,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c518dd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5567d48,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5567d48,c5567dd0,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c518dd80,5f8,e6f75c74,0,0,...) at kern_wait+0xb76 wait4(c518dd80,e6f75cf8,10,c518dd80,c0d881c4,...) at wait4+0x3b syscall(e6f75d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810107b, esp = 0xbfbfe78c, ebp = 0xbfbfe7a8 --- Tracing command mkfifo pid 1524 tid 100215 td 0xc559e000 sched_switch(c559e000,0,104,191,56bd7be2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c559e000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c559e000,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c559e000,e6f69c64,e6f69c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c559e000,e6f69cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6f69d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe79c, ebp = 0xbfbfe7c8 --- Tracing command swap pid 1523 tid 100063 td 0xc4b5bd80 sched_switch(c4b5bd80,0,104,191,1c5c8066,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b5bd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b5bd80,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b5bd80,e6cfdc64,e6cfdc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b5bd80,e6cfdcf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6cfdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7ac, ebp = 0xbfbfe7d8 --- Tracing command rename pid 1522 tid 100142 td 0xc51356c0 sched_switch(c51356c0,0,104,191,573a0502,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c51356c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c51356c0,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c51356c0,e6e6fc64,e6e6fc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c51356c0,e6e6fcf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e6fd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe79c, ebp = 0xbfbfe7c8 --- Tracing command mkdir pid 1521 tid 100210 td 0xc559e480 sched_switch(c559e480,0,104,191,597cffbe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c559e480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c559e480,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c559e480,e6f5ac64,e6f5ac6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c559e480,e6f5acf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6f5ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7ac, ebp = 0xbfbfe7d8 --- Tracing command creat pid 1520 tid 100216 td 0xc5d0ed80 sched_switch(c5d0ed80,0,104,191,3517f686,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5d0ed80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c5d0ed80,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c5d0ed80,e6f6cc64,e6f6cc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c5d0ed80,e6f6ccf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6f6cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7ac, ebp = 0xbfbfe7d8 --- Tracing command lockf pid 1519 tid 100200 td 0xc5d0f6c0 sched_switch(c5d0f6c0,0,104,191,3e510b16,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5d0f6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c5d0f6c0,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c5d0f6c0,e6f33c64,e6f33c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c5d0f6c0,e6f33cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6f33d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7ac, ebp = 0xbfbfe7d8 --- Tracing command link pid 1518 tid 100104 td 0xc4b5dd80 sched_switch(c4b5dd80,0,104,191,3573eb9e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b5dd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b5dd80,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b5dd80,e6df0c64,e6df0c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b5dd80,e6df0cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6df0d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7ac, ebp = 0xbfbfe7d8 --- Tracing command rw pid 1516 tid 100112 td 0xc4dbab40 sched_switch(c4dbab40,0,104,191,3380f4b6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4dbab40,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4dbab40,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4dbab40,e6e0ac64,e6e0ac6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4dbab40,e6e0acf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e0ad38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe7bc, ebp = 0xbfbfe7e8 --- Tracing command openat pid 1515 tid 100123 td 0xc4b5b000 sched_switch(c4b5b000,0,104,191,420cca86,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b5b000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b5b000,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b5b000,e6e30c64,e6e30c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b5b000,e6e30cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e30d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe79c, ebp = 0xbfbfe7c8 --- Tracing command symlink pid 1514 tid 100122 td 0xc4b5b240 sched_switch(c4b5b240,0,104,191,420ff6aa,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b5b240,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b5b240,3,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b5b240,e6e2dc64,e6e2dc6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b5b240,e6e2dcf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e2dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816ead7, esp = 0xbfbfe78c, ebp = 0xbfbfe7b8 --- Tracing command lockf2 pid 1513 tid 100053 td 0xc4b01d80 sched_switch(c4b01d80,0,104,191,3c31a932,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b01d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c4b01d80,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c4b01d80,e6cd5c64,e6cd5c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c4b01d80,e6cd5cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6cd5d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816dad7, esp = 0xbfbfe79c, ebp = 0xbfbfe7c8 --- Tracing command awk pid 1178 tid 100183 td 0xc559fb40 sched_switch(c559fb40,0,104,191,b9196e5a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c559fb40,0,c0ca113a,1a0,4c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ce5000,4c,c0ca3573,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4ce5000,c4ce5170,14c,c0ca3573,0,...) at _sleep+0x354 pipe_read(c4adc930,e6ef7c58,c52f2780,0,c559fb40,...) at pipe_read+0x417 dofileread(e6ef7c58,ffffffff,ffffffff,0,c4adc930,...) at dofileread+0x96 kern_readv(c559fb40,0,e6ef7c58,e6ef7c78,1,...) at kern_readv+0x58 read(c559fb40,e6ef7cf8,c,c559fb40,c0d88154,...) at read+0x4f syscall(e6ef7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x281b20b3, esp = 0xbfbfe97c, ebp = 0xbfbfe998 --- Tracing command sh pid 1177 tid 100182 td 0xc559fd80 sched_switch(c559fd80,0,104,191,d08fdf66,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c559fd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c51912a8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c51912a8,c5191330,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c559fd80,ffffffff,e6ef4c74,2,0,...) at kern_wait+0xb76 wait4(c559fd80,e6ef4cf8,10,c0ca393b,c0d881c4,...) at wait4+0x3b syscall(e6ef4d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2815e07b, esp = 0xbfbfe95c, ebp = 0xbfbfe978 --- Tracing command sh pid 1176 tid 100101 td 0xc4afc6c0 sched_switch(c4afc6c0,0,104,191,90927f88,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4afc6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac8aa0,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4ac8aa0,c4ac8b28,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4afc6c0,ffffffff,e6de2c74,2,0,...) at kern_wait+0xb76 wait4(c4afc6c0,e6de2cf8,10,c4afc6c0,c0d881c4,...) at wait4+0x3b syscall(e6de2d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2815e07b, esp = 0xbfbfeb6c, ebp = 0xbfbfeb88 --- Tracing command sshd pid 1175 tid 100181 td 0xc55a0000 sched_switch(c55a0000,0,104,191,fad45fda,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c55a0000,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c5681210,0,c0c9b36c,c55a0000,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5681224,0,e6ef1a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c5681224,c5681210,c0ca33c2,603,c4aee2a0,...) at _cv_wait_sig+0x240 seltdwait(c4aee2a0,58,c53d8780,c55a0000,200246,...) at seltdwait+0xa2 kern_select(c55a0000,c,286030b8,286030dc,0,0,20,0,28100c70) at kern_select+0x4f4 select(c55a0000,e6ef1cf8,14,c0c84e80,c0d88b2c,...) at select+0x66 syscall(e6ef1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283ce033, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command top pid 1174 tid 100094 td 0xc4c5bb40 sched_switch(c4c5bb40,0,104,191,e1a9eb6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4c5bb40,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6dada4c,c087d44a,c559a590,0,c4c5bb40,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c559a5a4,0,e6dada7c,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c559a5a4,c559a590,3e9,603,c4aee070,...) at _cv_timedwait_sig+0x250 seltdwait(e6dadc28,e6dadc30,c552b680,c4c5bb40,4832363b,...) at seltdwait+0x8a kern_select(c4c5bb40,2,bfbfebec,0,0,e6dadc70,20,1,0) at kern_select+0x4f4 select(c4c5bb40,e6dadcf8,14,e6dadcd0,c0d88b2c,...) at select+0x66 syscall(e6dadd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x281e8033, esp = 0xbfbfeb8c, ebp = 0xbfbfece8 --- Tracing command sshd pid 1173 tid 100180 td 0xc5135900 sched_switch(c5135900,0,104,191,e19b9ce,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c5135900,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c557b590,0,c0c9b36c,c5135900,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c557b5a4,0,e6eeea7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c557b5a4,c557b590,c0ca33c2,603,c4adc1f8,...) at _cv_wait_sig+0x240 seltdwait(c4adc1f8,58,c52f2e80,c5135900,200246,...) at seltdwait+0xa2 kern_select(c5135900,a,286030b8,286030dc,0,0,20,0,28100c70) at kern_select+0x4f4 select(c5135900,e6eeecf8,14,c0c84e80,c0d88b2c,...) at select+0x66 syscall(e6eeed38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283ce033, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command tail pid 1172 tid 100179 td 0xc5135b40 sched_switch(c5135b40,0,104,191,5afed972,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5135b40,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c5135b40,1,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c550cc80,58,c0c97d25,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c550cc80,c550cc80,158,c0c97d25,3e9,...) at _sleep+0x31e kern_kevent(c5135b40,4,0,1,e6eebc58,...) at kern_kevent+0x364 kevent(c5135b40,e6eebcf8,18,c0c3c109,c0d8a8b4,...) at kevent+0x19b syscall(e6eebd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (363, FreeBSD ELF32, kevent), eip = 0x2815fcbb, esp = 0xbfbfeb5c, ebp = 0xbfbfec18 --- Tracing command sshd pid 1171 tid 100178 td 0xc5135d80 sched_switch(c5135d80,0,104,191,e3565078,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c5135d80,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c5571e10,0,c0c9b36c,c5135d80,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5571e24,0,e6ee8a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c5571e24,c5571e10,c0ca33c2,603,c4cdfd20,...) at _cv_wait_sig+0x240 seltdwait(c4cdfd20,58,c552c000,c5135d80,200246,...) at seltdwait+0xa2 kern_select(c5135d80,c,286030b8,286030dc,0,0,20,0,28100c70) at kern_select+0x4f4 select(c5135d80,e6ee8cf8,14,c0c84e80,c0d88b2c,...) at select+0x66 syscall(e6ee8d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283ce033, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1167 tid 100174 td 0xc5134480 sched_switch(c5134480,0,104,191,7a1bd54c,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c5134480,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c5550a60,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c5550a60,c5550a20,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c55509fc,4,c0ca6fc6,5c5,c5550a20,...) at sbwait+0x76 soreceive_generic(c55509a8,0,e6edcc58,0,0,...) at soreceive_generic+0x3f0 soreceive(c55509a8,0,e6edcc58,0,0,0) at soreceive+0x38 soo_read(c4b26188,e6edcc58,c552bd80,0,c5134480,...) at soo_read+0x4e dofileread(e6edcc58,ffffffff,ffffffff,0,c4b26188,...) at dofileread+0x96 kern_readv(c5134480,5,e6edcc58,e6edcc78,1,...) at kern_readv+0x58 read(c5134480,e6edccf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6edcd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283ce0b3, esp = 0xbfbfde4c, ebp = 0xbfbfde88 --- Tracing command sshd pid 1166 tid 100173 td 0xc518a240 sched_switch(c518a240,0,104,191,d18e98ec,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c518a240,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4dd88c4,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4dd88c4,c4dd8884,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c4dd8860,4,c0ca6fc6,5c5,c4dd8884,...) at sbwait+0x76 soreceive_generic(c4dd880c,0,e6ed9c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c4dd880c,0,e6ed9c58,0,0,0) at soreceive+0x38 soo_read(c4cdfbd0,e6ed9c58,c527d600,0,c518a240,...) at soo_read+0x4e dofileread(e6ed9c58,ffffffff,ffffffff,0,c4cdfbd0,...) at dofileread+0x96 kern_readv(c518a240,5,e6ed9c58,e6ed9c78,1,...) at kern_readv+0x58 read(c518a240,e6ed9cf8,c,c0c3c109,c0d88154,...) at read+0x4f syscall(e6ed9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283ce0b3, esp = 0xbfbfde4c, ebp = 0xbfbfde88 --- Tracing command sshd pid 1165 tid 100172 td 0xc518a480 sched_switch(c518a480,0,104,191,f1bfb9d4,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c518a480,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c555058c,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c555058c,c555054c,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c5550528,4,c0ca6fc6,5c5,c555054c,...) at sbwait+0x76 soreceive_generic(c55504d4,0,e6ed6c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c55504d4,0,e6ed6c58,0,0,0) at soreceive+0x38 soo_read(c4adc498,e6ed6c58,c550c680,0,c518a480,...) at soo_read+0x4e dofileread(e6ed6c58,ffffffff,ffffffff,0,c4adc498,...) at dofileread+0x96 kern_readv(c518a480,5,e6ed6c58,e6ed6c78,1,...) at kern_readv+0x58 read(c518a480,e6ed6cf8,c,c518a480,c0d88154,...) at read+0x4f syscall(e6ed6d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283ce0b3, esp = 0xbfbfde4c, ebp = 0xbfbfde88 --- Tracing command run pid 1082 tid 100146 td 0xc5134d80 sched_switch(c5134d80,0,104,191,7acc4812,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5134d80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c50cf000,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c50cf000,c50cf088,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c5134d80,5e9,e6e7bc74,0,0,...) at kern_wait+0xb76 wait4(c5134d80,e6e7bcf8,10,c5134d80,c0d881c4,...) at wait4+0x3b syscall(e6e7bd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810007b, esp = 0xbfbfe1ac, ebp = 0xbfbfe1c8 --- Tracing command run pid 1081 tid 100130 td 0xc4fe5240 sched_switch(c4fe5240,0,104,191,3aff62e6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4fe5240,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4e537f8,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4e537f8,c4e53880,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4fe5240,43a,e6e49c74,0,0,...) at kern_wait+0xb76 wait4(c4fe5240,e6e49cf8,10,c4fe5240,c0d881c4,...) at wait4+0x3b syscall(e6e49d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2810007b, esp = 0xbfbfe65c, ebp = 0xbfbfe678 --- Tracing command run pid 1080 tid 100145 td 0xc5135000 sched_switch(c5135000,0,104,191,574242ee,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c5135000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(3e9,c08c67e0,c5135000,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,3e9,...) at _sleep+0x31e kern_nanosleep(c5135000,e6e78c64,e6e78c6c,1,0,...) at kern_nanosleep+0xc1 nanosleep(c5135000,e6e78cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e78d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x2816dad7, esp = 0xbfbfe67c, ebp = 0xbfbfe6a8 --- Tracing command sh pid 1074 tid 100064 td 0xc4ac9480 sched_switch(c4ac9480,0,104,191,3469d93a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4ac9480,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac5d48,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4ac5d48,c4ac5dd0,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4ac9480,ffffffff,e6d01c74,2,0,...) at kern_wait+0xb76 wait4(c4ac9480,e6d01cf8,10,c0ca393b,c0d881c4,...) at wait4+0x3b syscall(e6d01d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x2815e07b, esp = 0xbfbfe82c, ebp = 0xbfbfe848 --- Tracing command bash pid 1059 tid 100092 td 0xc4c5c000 sched_switch(c4c5c000,0,104,191,2c9f92b8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4c5c000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4c49550,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c49550,c4c495d8,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c4c5c000,ffffffff,e6da7c74,6,0,...) at kern_wait+0xb76 wait4(c4c5c000,e6da7cf8,10,c0ca384b,c0d881c4,...) at wait4+0x3b syscall(e6da7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x282be07b, esp = 0xbfbfe9cc, ebp = 0xbfbfe9e8 --- Tracing command sshd pid 1058 tid 100071 td 0xc481b900 sched_switch(c481b900,0,104,191,7b6afde6,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c481b900,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4ac32d0,0,c0c9b36c,c481b900,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac32e4,0,e6d24a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4ac32e4,c4ac32d0,c0ca33c2,603,c4cdf070,...) at _cv_wait_sig+0x240 seltdwait(c4cdf070,58,c4da9280,c481b900,200246,...) at seltdwait+0xa2 kern_select(c481b900,a,286030b8,286030dc,0,0,20,0,28100c70) at kern_select+0x4f4 select(c481b900,e6d24cf8,14,c0c84e80,c0d88b2c,...) at select+0x66 syscall(e6d24d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283ce033, esp = 0xbfbfde5c, ebp = 0xbfbfdea8 --- Tracing command sshd pid 1056 tid 100117 td 0xc4dba000 sched_switch(c4dba000,0,104,191,8d5bd244,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,58,...) at mi_switch+0x200 sleepq_switch(c4dba000,0,c0ca113a,1a0,58,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4c2c728,58,c0ca6ef7,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4c2c728,c4c2c6e8,158,c0ca6ef7,0) at _sleep+0x354 sbwait(c4c2c6c4,4,c0ca6fc6,5c5,c4c2c6e8,...) at sbwait+0x76 soreceive_generic(c4c2c670,0,e6e19c58,0,0,...) at soreceive_generic+0x3f0 soreceive(c4c2c670,0,e6e19c58,0,0,0) at soreceive+0x38 soo_read(c4b269a0,e6e19c58,c4a80d00,0,c4dba000,...) at soo_read+0x4e dofileread(e6e19c58,ffffffff,ffffffff,0,c4b269a0,...) at dofileread+0x96 kern_readv(c4dba000,5,e6e19c58,e6e19c78,1,...) at kern_readv+0x58 read(c4dba000,e6e19cf8,c,c0cbeca6,c0d88154,...) at read+0x4f syscall(e6e19d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x283ce0b3, esp = 0xbfbfde4c, ebp = 0xbfbfde88 --- Tracing command getty pid 1055 tid 100082 td 0xc4b01480 sched_switch(c4b01480,0,104,191,785355f8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b01480,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4b01480,c4b01480,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c483a070,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c483a070,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c483a000,c483a070,e6d5cc58,1,0,...) at tty_wait+0x71 ttydisc_read(c483a000,e6d5cc58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4838000,e6d5cc58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4cdfaf0,e6d5cc58,c4578100,0,c4b01480,...) at devfs_read_f+0x7e dofileread(e6d5cc58,ffffffff,ffffffff,0,c4cdfaf0,...) at dofileread+0x96 kern_readv(c4b01480,0,e6d5cc58,e6d5cc78,1,...) at kern_readv+0x58 read(c4b01480,e6d5ccf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6d5cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1054 tid 100091 td 0xc4c5c240 sched_switch(c4c5c240,0,104,191,787d7684,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4c5c240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4c5c240,c4c5c240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c483a270,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c483a270,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c483a200,c483a270,e6da4c58,1,0,...) at tty_wait+0x71 ttydisc_read(c483a200,e6da4c58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4838100,e6da4c58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4daf310,e6da4c58,c4578100,0,c4c5c240,...) at devfs_read_f+0x7e dofileread(e6da4c58,ffffffff,ffffffff,0,c4daf310,...) at dofileread+0x96 kern_readv(c4c5c240,0,e6da4c58,e6da4c78,1,...) at kern_readv+0x58 read(c4c5c240,e6da4cf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6da4d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1053 tid 100073 td 0xc4b01900 sched_switch(c4b01900,0,104,191,785d4784,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b01900,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4b01900,c4b01900,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c468ee70,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c468ee70,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c468ee00,c468ee70,e6d2dc58,1,0,...) at tty_wait+0x71 ttydisc_read(c468ee00,e6d2dc58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4838200,e6d2dc58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4adba10,e6d2dc58,c4578100,0,c4b01900,...) at devfs_read_f+0x7e dofileread(e6d2dc58,ffffffff,ffffffff,0,c4adba10,...) at dofileread+0x96 kern_readv(c4b01900,0,e6d2dc58,e6d2dc78,1,...) at kern_readv+0x58 read(c4b01900,e6d2dcf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6d2dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1052 tid 100069 td 0xc481bd80 sched_switch(c481bd80,0,104,191,78d06644,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c481bd80,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c481bd80,c481bd80,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c468ec70,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c468ec70,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c468ec00,c468ec70,e6d1cc58,1,0,...) at tty_wait+0x71 ttydisc_read(c468ec00,e6d1cc58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4838300,e6d1cc58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4daf2d8,e6d1cc58,c4578100,0,c481bd80,...) at devfs_read_f+0x7e dofileread(e6d1cc58,ffffffff,ffffffff,0,c4daf2d8,...) at dofileread+0x96 kern_readv(c481bd80,0,e6d1cc58,e6d1cc78,1,...) at kern_readv+0x58 read(c481bd80,e6d1ccf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6d1cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1051 tid 100051 td 0xc4ac9d80 sched_switch(c4ac9d80,0,104,191,78ce4a50,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4ac9d80,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4ac9d80,c4ac9d80,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4820870,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4820870,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c4820800,c4820870,e6ccdc58,1,0,...) at tty_wait+0x71 ttydisc_read(c4820800,e6ccdc58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4838400,e6ccdc58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4af7460,e6ccdc58,c4578100,0,c4ac9d80,...) at devfs_read_f+0x7e dofileread(e6ccdc58,ffffffff,ffffffff,0,c4af7460,...) at dofileread+0x96 kern_readv(c4ac9d80,0,e6ccdc58,e6ccdc78,1,...) at kern_readv+0x58 read(c4ac9d80,e6ccdcf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6ccdd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1050 tid 100113 td 0xc4dba900 sched_switch(c4dba900,0,104,191,78b66eac,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4dba900,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4dba900,c4dba900,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4820470,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4820470,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c4820400,c4820470,e6e0dc58,1,0,...) at tty_wait+0x71 ttydisc_read(c4820400,e6e0dc58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4764500,e6e0dc58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4aeeb98,e6e0dc58,c4578100,0,c4dba900,...) at devfs_read_f+0x7e dofileread(e6e0dc58,ffffffff,ffffffff,0,c4aeeb98,...) at dofileread+0x96 kern_readv(c4dba900,0,e6e0dc58,e6e0dc78,1,...) at kern_readv+0x58 read(c4dba900,e6e0dcf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6e0dd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1049 tid 100052 td 0xc4ac9b40 sched_switch(c4ac9b40,0,104,191,785acc34,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4ac9b40,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4ac9b40,c4ac9b40,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c468ea70,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c468ea70,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c468ea00,c468ea70,e6cd1c58,1,0,...) at tty_wait+0x71 ttydisc_read(c468ea00,e6cd1c58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4821400,e6cd1c58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4aeeb28,e6cd1c58,c4578100,0,c4ac9b40,...) at devfs_read_f+0x7e dofileread(e6cd1c58,ffffffff,ffffffff,0,c4aeeb28,...) at dofileread+0x96 kern_readv(c4ac9b40,0,e6cd1c58,e6cd1c78,1,...) at kern_readv+0x58 read(c4ac9b40,e6cd1cf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6cd1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command getty pid 1048 tid 100119 td 0xc4b5b900 sched_switch(c4b5b900,0,104,191,78e0251c,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b5b900,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,c4b5b900,c4b5b900,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c468e670,0,c0ca573f,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c468e670,c0df9ef0,c0ca50f6,510,0,...) at _cv_wait_sig+0x240 tty_wait(c468e600,c468e670,e6e24c58,1,0,...) at tty_wait+0x71 ttydisc_read(c468e600,e6e24c58,0,9f,0,...) at ttydisc_read+0x22c ttydev_read(c4821300,e6e24c58,0,0,1,...) at ttydev_read+0xaa devfs_read_f(c4daf3f0,e6e24c58,c4578100,0,c4b5b900,...) at devfs_read_f+0x7e dofileread(e6e24c58,ffffffff,ffffffff,0,c4daf3f0,...) at dofileread+0x96 kern_readv(c4b5b900,0,e6e24c58,e6e24c78,1,...) at kern_readv+0x58 read(c4b5b900,e6e24cf8,c,c0cb4dc0,c0d88154,...) at read+0x4f syscall(e6e24d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (3, FreeBSD ELF32, read), eip = 0x2818e0b3, esp = 0xbfbfedbc, ebp = 0xbfbfede8 --- Tracing command inetd pid 1026 tid 100129 td 0xc4b33240 sched_switch(c4b33240,0,104,191,63113144,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b33240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4ac4410,0,c0c9b36c,c4b33240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac4424,0,e6e42a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4ac4424,c4ac4410,c0ca33c2,603,c4b268f8,...) at _cv_wait_sig+0x240 seltdwait(c4b268f8,58,c4578100,c4b33240,4,...) at seltdwait+0xa2 kern_select(c4b33240,8,bfbfdfd0,0,0,0,20,0,281b6498) at kern_select+0x4f4 select(c4b33240,e6e42cf8,14,c0ca39a8,c0d88b2c,...) at select+0x66 syscall(e6e42d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x281a2033, esp = 0xbfbfdf8c, ebp = 0xbfbfee18 --- Tracing command moused pid 1002 tid 100127 td 0xc4b336c0 sched_switch(c4b336c0,0,104,191,5202710a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b336c0,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4a68950,0,c0c9b36c,c4b336c0,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4a68964,0,e6e3ca7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4a68964,c4a68950,c0ca33c2,603,c4adb070,...) at _cv_wait_sig+0x240 seltdwait(c4adb070,58,c4578100,c4b336c0,0,...) at seltdwait+0xa2 kern_select(c4b336c0,6,bfbfea34,0,0,0,20,0,0) at kern_select+0x4f4 select(c4b336c0,e6e3ccf8,14,c0cb4dc0,c0d88b2c,...) at select+0x66 syscall(e6e3cd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x281ab033, esp = 0xbfbfe9bc, ebp = 0xbfbfeb58 --- Tracing command watchdogd pid 984 tid 100062 td 0xc4b5d000 sched_switch(c4b5d000,0,104,191,1a0585dc,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4b5d000,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(ea61,c08c67e0,c4b5d000,0,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,ea61,...) at _sleep+0x31e kern_nanosleep(c4b5d000,e6cf9c64,e6cf9c6c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c4b5d000,e6cf9cf8,8,c0cb4dc0,c0d89b40,...) at nanosleep+0x6f syscall(e6cf9d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28185ad7, esp = 0xbfbfecec, ebp = 0xbfbfed18 --- Tracing command cron pid 962 tid 100114 td 0xc4dba6c0 sched_switch(c4dba6c0,0,104,191,41472eda,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c4dba6c0,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(ea61,c08c67e0,c4dba6c0,2,100,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c0dfa744,5c,c0c9de91,100,0,...) at sleepq_timedwait_sig+0x1a _sleep(c0dfa744,0,15c,c0c9de91,ea61,...) at _sleep+0x31e kern_nanosleep(c4dba6c0,e6e10c64,e6e10c6c,3c,0,...) at kern_nanosleep+0xc1 nanosleep(c4dba6c0,e6e10cf8,8,c0ca3a99,c0d89b40,...) at nanosleep+0x6f syscall(e6e10d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (240, FreeBSD ELF32, nanosleep), eip = 0x28178ad7, esp = 0xbfbfec8c, ebp = 0xbfbfecb8 --- Tracing command sendmail pid 956 tid 100111 td 0xc4dbad80 sched_switch(c4dbad80,0,104,191,52a134ba,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c4dbad80,0,c0ca113a,1a0,68,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4db1da0,68,c0c509c3,100,0,...) at sleepq_wait_sig+0x17 _sleep(c4db1da0,c4db1dd0,168,c0c509c3,0,...) at _sleep+0x354 kern_sigsuspend(c4dbad80,0,0,0,0,...) at kern_sigsuspend+0xae sigsuspend(c4dbad80,e6e07cf8,4,c0ca384b,c0d8a64c,...) at sigsuspend+0x4d syscall(e6e07d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (4, FreeBSD ELF32, write), eip = 0x28332efb, esp = 0xbfbfcf8c, ebp = 0xbfbfcfb8 --- Tracing command sendmail pid 952 tid 100110 td 0xc4b5d6c0 sched_switch(c4b5d6c0,0,104,191,519cc776,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b5d6c0,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6e04a4c,c087d44a,c4affa90,0,c4b5d6c0,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4affaa4,0,e6e04a7c,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4affaa4,c4affa90,1389,603,c4adc818,...) at _cv_timedwait_sig+0x250 seltdwait(e6e04c28,e6e04c30,c4ac1900,c4b5d6c0,c188b014,...) at seltdwait+0x8a kern_select(c4b5d6c0,5,bfbfc510,0,0,e6e04c70,20,5,0) at kern_select+0x4f4 select(c4b5d6c0,e6e04cf8,14,c0ca3d6f,c0d88b2c,...) at select+0x66 syscall(e6e04d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283d7033, esp = 0xbfbfc47c, ebp = 0xbfbfcfa8 --- Tracing command sshd pid 945 tid 100083 td 0xc4b01240 sched_switch(c4b01240,0,104,191,f8c20490,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b01240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4836e10,0,c0c9b36c,c4b01240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4836e24,0,e6d87a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4836e24,c4836e10,c0ca33c2,603,c4adc3f0,...) at _cv_wait_sig+0x240 seltdwait(c4adc3f0,58,c4a80d80,c4b01240,c0cc7799,...) at seltdwait+0xa2 kern_select(c4b01240,5,286090b0,0,0,0,20,0,8) at kern_select+0x4f4 select(c4b01240,e6d87cf8,14,c0cbeca6,c0d88b2c,...) at select+0x66 syscall(e6d87d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x283ce033, esp = 0xbfbfdf1c, ebp = 0xbfbfee38 --- Tracing command ntpd pid 908 tid 100066 td 0xc4b5bb40 sched_switch(c4b5bb40,0,104,191,35aabdaa,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b5bb40,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4affe10,0,c0c9b36c,c4b5bb40,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4affe24,0,e6d09a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4affe24,c4affe10,c0ca33c2,603,c4b26498,...) at _cv_wait_sig+0x240 seltdwait(c4b26498,58,c4578100,c4b5bb40,0,...) at seltdwait+0xa2 kern_select(c4b5bb40,1c,bfbfed28,0,0,0,20,e6d09c98,246) at kern_select+0x4f4 select(c4b5bb40,e6d09cf8,14,c4b5bb40,c0d88b2c,...) at select+0x66 syscall(e6d09d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x28353033, esp = 0xbfbfecfc, ebp = 0xbfbfedc8 --- Tracing command nfsd pid 809 tid 100107 td 0xc4afc000 sched_switch(c4afc000,0,104,191,d6174bde,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4afc000,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6df9bf8,c087d44a,c48ff180,0,c4afc000,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4ac37d0,0,e6df9c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4ac37d0,c48ff180,1388,3af,281ee6af,...) at _cv_timedwait_sig+0x250 svc_run_internal(e6df9d24,c0863018,c48ff180,e6df9d38,c0c980db,...) at svc_run_internal+0x356 svc_thread_start(c48ff180,e6df9d38,c0c980db,343,c4ac8000,...) at svc_thread_start+0x10 fork_exit(c0a82c40,c48ff180,e6df9d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x2e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 809 tid 100106 td 0xc4afc240 sched_switch(c4afc240,0,104,191,20363746,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4afc240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6df6bf8,c087d44a,c48ff180,0,c4afc240,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4a69ad0,0,e6df6c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4a69ad0,c48ff180,1388,3af,0,...) at _cv_timedwait_sig+0x250 svc_run_internal(e6df6d24,c0863018,c48ff180,e6df6d38,c0c980db,...) at svc_run_internal+0x356 svc_thread_start(c48ff180,e6df6d38,c0c980db,343,c4ac8000,...) at svc_thread_start+0x10 fork_exit(c0a82c40,c48ff180,e6df6d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x2e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 809 tid 100105 td 0xc4afc480 sched_switch(c4afc480,0,104,191,d616f2ee,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4afc480,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6df3bf8,c087d44a,c48ff180,0,c4afc480,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4a3b790,0,e6df3c28,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4a3b790,c48ff180,1388,3af,0,...) at _cv_timedwait_sig+0x250 svc_run_internal(e6df3d24,c0863018,c48ff180,e6df3d38,c0c980db,...) at svc_run_internal+0x356 svc_thread_start(c48ff180,e6df3d38,c0c980db,343,c4ac8000,...) at svc_thread_start+0x10 fork_exit(c0a82c40,c48ff180,e6df3d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0x2e, eip = 0xc, esp = 0x33, ebp = 0 --- Tracing command nfsd pid 809 tid 100055 td 0xc4ac96c0 sched_switch(c4ac96c0,0,104,191,d61d0856,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4ac96c0,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6cddae8,c087d44a,c48ff180,0,c4ac96c0,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4ac4c50,0,e6cddb18,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4ac4c50,c48ff180,1388,3af,e6cddb60,...) at _cv_timedwait_sig+0x250 svc_run_internal(c4ac9824,14,c0cc042d,c0cbeee1,e6cddc3c,...) at svc_run_internal+0x356 svc_run(c48ff180,0,c0cbf1e5,1fd,0,...) at svc_run+0x7f nfssvc_nfsd(bfbfe8b0,e6cddc3c,c,c4578100,e6cddc50,...) at nfssvc_nfsd+0xad nfssvc_nfsserver(c4ac96c0,e6cddcf8,bfbfe8b0,c4ac96c0,c4ac8000,...) at nfssvc_nfsserver+0x24f nfssvc(c4ac96c0,e6cddcf8,8,c0ca3d6f,c0d891f4,...) at nfssvc+0x83 syscall(e6cddd38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (155, FreeBSD ELF32, nfssvc), eip = 0x280daadb, esp = 0xbfbfe86c, ebp = 0xbfbfead8 --- Tracing command nfsd pid 808 tid 100060 td 0xc4b5d240 sched_switch(c4b5d240,0,104,191,7b5773ce,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4b5d240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4836ad0,0,c0c9b36c,c4b5d240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4836ae4,0,e6cf1a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4836ae4,c4836ad0,c0ca33c2,603,c4adcb98,...) at _cv_wait_sig+0x240 seltdwait(c4adcb98,58,c4578100,c4b5d240,ebe,...) at seltdwait+0xa2 kern_select(c4b5d240,5,bfbfece0,0,0,0,20,bfbffff4,1) at kern_select+0x4f4 select(c4b5d240,e6cf1cf8,14,c4b5d240,c0d88b2c,...) at select+0x66 syscall(e6cf1d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x2817e033, esp = 0xbfbfeadc, ebp = 0xbfbfee18 --- Tracing command mountd pid 806 tid 100102 td 0xc4c5b240 sched_switch(c4c5b240,0,104,191,5318d4c8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4c5b240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4ac3390,0,c0c9b36c,c4c5b240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac33a4,0,e6deaa7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4ac33a4,c4ac3390,c0ca33c2,603,c4cdf620,...) at _cv_wait_sig+0x240 seltdwait(c4cdf620,58,c4578100,c4c5b240,c0f3a7e8,...) at seltdwait+0xa2 kern_select(c4c5b240,9,bfbfed8c,0,0,0,20,0,281a6498) at kern_select+0x4f4 select(c4c5b240,e6deacf8,14,c0cbeca6,c0d88b2c,...) at select+0x66 syscall(e6dead38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x28192033, esp = 0xbfbfed5c, ebp = 0xbfbfee28 --- Tracing command rpcbind pid 711 tid 100068 td 0xc4ac9000 sched_switch(c4ac9000,0,104,191,f4a4680,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4ac9000,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(e6d18aa8,c087d44a,c4ac3d10,0,c4ac9000,...) at sleepq_catch_signals+0xb7 sleepq_timedwait_sig(c4ac3d24,0,e6d18ad8,101,0,...) at sleepq_timedwait_sig+0x1a _cv_timedwait_sig(c4ac3d24,c4ac3d10,7531,603,e6d18b8c,...) at _cv_timedwait_sig+0x250 seltdwait(e6d18c5c,e6d18c64,511,c4ac9000,e6d18b5c,...) at seltdwait+0x8a poll(c4ac9000,e6d18cf8,c,c0ca3a99,c0d897dc,...) at poll+0x300 syscall(e6d18d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (209, FreeBSD ELF32, poll), eip = 0x2813f01f, esp = 0xbfbfcc0c, ebp = 0xbfbfedd8 --- Tracing command syslogd pid 691 tid 100096 td 0xc4c5b6c0 sched_switch(c4c5b6c0,0,104,191,906e8918,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4c5b6c0,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4ac4d90,0,c0c9b36c,c4c5b6c0,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4ac4da4,0,e6db3a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4ac4da4,c4ac4d90,c0ca33c2,603,c4aee5b0,...) at _cv_wait_sig+0x240 seltdwait(c4aee5b0,58,c4578100,c4c5b6c0,0,...) at seltdwait+0xa2 kern_select(c4c5b6c0,9,282290ac,0,0,0,20,0,281a5498) at kern_select+0x4f4 select(c4c5b6c0,e6db3cf8,14,c0ca394b,c0d88b2c,...) at select+0x66 syscall(e6db3d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x28191033, esp = 0xbfbfe2ac, ebp = 0xbfbfee18 --- Tracing command devd pid 561 tid 100087 td 0xc481b240 sched_switch(c481b240,0,104,191,e710a774,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c481b240,0,c0ca113a,1a0,0,...) at sleepq_switch+0x15f sleepq_catch_signals(c087d44a,c4836950,0,c0c9b36c,c481b240,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c4836964,0,e6d98a7c,101,0,...) at sleepq_wait_sig+0x17 _cv_wait_sig(c4836964,c4836950,c0ca33c2,603,c4adb3b8,...) at _cv_wait_sig+0x240 seltdwait(c4adb3b8,58,c4578100,c481b240,c0c94b8e,...) at seltdwait+0xa2 kern_select(c481b240,6,bfbfe9a0,0,0,0,20,0,10) at kern_select+0x4f4 select(c481b240,e6d98cf8,14,c0c3c109,c0d88b2c,...) at select+0x66 syscall(e6d98d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (93, FreeBSD ELF32, select), eip = 0x8088ba3, esp = 0xbfbfe96c, ebp = 0xbfbfee48 --- Tracing command flowcleaner pid 19 tid 100050 td 0xc47676c0 sched_switch(c47676c0,0,104,191,64354fbe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c47676c0,0,c0ca113a,283,c47676c0,...) at sleepq_switch+0x15f sleepq_timedwait(c0f67288,0,e4addcc4,1,0,...) at sleepq_timedwait+0x6b _cv_timedwait(c0f67288,c0f67290,2710,3f0,0,...) at _cv_timedwait+0x250 flowtable_cleaner(0,e4addd38,c0c980db,343,c4a51550,...) at flowtable_cleaner+0x1bf fork_exit(c0936040,0,e4addd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4addd70, ebp = 0 --- Tracing command softdepflush pid 18 tid 100049 td 0xc4767900 sched_switch(c4767900,0,103,18c,4eadd762,...) at sched_switch+0x406 mi_switch(103,0,c0ca19bf,2e1,c4dbb200,...) at mi_switch+0x200 turnstile_wait(c4dbb200,c5d0f240,0,1ac,c0f72a2c,...) at turnstile_wait+0x48a _mtx_lock_sleep(c0f72a2c,c4767900,0,c0cc31e4,1906,...) at _mtx_lock_sleep+0x14d _mtx_lock_flags(c0f72a2c,0,c0cc31e4,1906,1,...) at _mtx_lock_flags+0xf7 handle_workitem_remove(0,e4adac88,2,499,8,...) at handle_workitem_remove+0x8d process_worklist_item(c0f72a2c,0,c0cc31e4,44a,c4767900,...) at process_worklist_item+0x1e6 softdep_process_worklist(c4a9b5a8,0,c0cc31e4,3ce,3e8,...) at softdep_process_worklist+0x81 softdep_flush(0,e4adad38,c0c980db,343,c4a517f8,...) at softdep_flush+0x287 fork_exit(c0acaac0,0,e4adad38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4adad70, ebp = 0 --- Tracing command vnlru pid 17 tid 100048 td 0xc4767b40 sched_switch(c4767b40,0,104,191,6c5466e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,50,...) at mi_switch+0x200 sleepq_switch(c4767b40,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c4a51aa0,50,c0cab17b,0,0,...) at sleepq_timedwait+0x6b _sleep(c4a51aa0,c0f67054,250,c0cab17b,3e8,...) at _sleep+0x339 vnlru_proc(0,e4ad7d38,c0c980db,343,c4a51aa0,...) at vnlru_proc+0xe7 fork_exit(c09218e0,0,e4ad7d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ad7d70, ebp = 0 --- Tracing command syncer pid 16 tid 100047 td 0xc4767d80 sched_switch(c4767d80,0,104,191,14129d7e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4767d80,0,c0ca113a,283,c4767d80,...) at sleepq_switch+0x15f sleepq_timedwait(c0f67094,0,e4ad4c88,1,0,...) at sleepq_timedwait+0x6b _cv_timedwait(c0f67094,c0f67080,3e8,6cc,4e20,...) at _cv_timedwait+0x250 sched_sync(0,e4ad4d38,c0c980db,343,c4a51d48,...) at sched_sync+0x502 fork_exit(c0920d10,0,e4ad4d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ad4d70, ebp = 0 --- Tracing command bufdaemon pid 15 tid 100046 td 0xc481a000 sched_switch(c481a000,0,104,191,5ab77ce2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,44,...) at mi_switch+0x200 sleepq_switch(c481a000,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0f66dc8,44,c0ca86e9,0,0,...) at sleepq_timedwait+0x6b _sleep(c0f66dc8,c0f66dcc,44,c0ca86e9,3e8,...) at _sleep+0x339 buf_daemon(0,e4ad1d38,c0c980db,343,c457b2a8,...) at buf_daemon+0x138 fork_exit(c0908f20,0,e4ad1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ad1d70, ebp = 0 --- Tracing command pagezero pid 9 tid 100045 td 0xc481a240 sched_switch(c481a240,0,104,191,dc9bc1c,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c481a240,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0f73894,0,c0ccadd6,0,0,...) at sleepq_timedwait+0x6b _sleep(c0f73894,c0f73380,0,c0ccadd6,493e0,...) at _sleep+0x339 vm_pagezero(0,e4aced38,c0c980db,343,c457b550,...) at vm_pagezero+0xdc fork_exit(c0b091a0,0,e4aced38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4aced70, ebp = 0 --- Tracing command vmdaemon pid 8 tid 100044 td 0xc481a480 sched_switch(c481a480,0,104,191,dbc94c8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,68,...) at mi_switch+0x200 sleepq_switch(c481a480,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c0f734c4,68,c0ca86e9,0,0,...) at sleepq_wait+0x63 _sleep(c0f734c4,c0f734c8,68,c0ca86e9,0,...) at _sleep+0x36b vm_daemon(0,e4acbd38,c0c980db,343,c457b7f8,...) at vm_daemon+0x59 fork_exit(c0b03640,0,e4acbd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4acbd70, ebp = 0 --- Tracing command pagedaemon pid 7 tid 100043 td 0xc481a6c0 sched_switch(c481a6c0,0,104,191,519121fe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,44,...) at mi_switch+0x200 sleepq_switch(c481a6c0,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0f7348c,44,c0ca86e9,0,0,...) at sleepq_timedwait+0x6b _sleep(c0f7348c,c0f73380,44,c0ca86e9,1388,...) at _sleep+0x339 vm_pageout(0,e4ac8d38,c0c980db,343,c457baa0,...) at vm_pageout+0x2bb fork_exit(c0b044e0,0,e4ac8d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ac8d70, ebp = 0 --- Tracing command fdc0 pid 6 tid 100041 td 0xc481ab40 sched_switch(c481ab40,0,104,191,13c03afe,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c481ab40,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c468e83c,4c,c0c92561,0,0,...) at sleepq_timedwait+0x6b _sleep(c468e83c,c468e8f0,4c,c0c92561,3e8,...) at _sleep+0x339 fdc_thread(c468e800,e4ac2d38,c0c980db,343,c457bd48,...) at fdc_thread+0x27d fork_exit(c0b86720,c468e800,e4ac2d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ac2d70, ebp = 0 --- Tracing command usb pid 14 tid 100034 td 0xc47656c0 sched_switch(c47656c0,0,104,191,903bd0c0,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c47656c0,0,c0ca113a,260,c47656c0,...) at sleepq_switch+0x15f sleepq_wait(c479edac,0,c4362cbc,1,0,...) at sleepq_wait+0x63 _cv_wait(c479edac,c479ee4c,c0c8b5d3,6c,c479edb4,...) at _cv_wait+0x240 usb_process(c479eda4,c4362d38,c0c980db,343,c474b000,...) at usb_process+0x193 fork_exit(c07bf6e0,c479eda4,c4362d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4362d70, ebp = 0 --- Tracing command usb pid 14 tid 100033 td 0xc4765900 sched_switch(c4765900,0,104,191,c673012e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4765900,0,c0ca113a,260,c4765900,...) at sleepq_switch+0x15f sleepq_wait(c479ed7c,0,c435fcbc,1,0,...) at sleepq_wait+0x63 _cv_wait(c479ed7c,c479ee4c,c0c8b5d3,6c,c479ed84,...) at _cv_wait+0x240 usb_process(c479ed74,c435fd38,c0c980db,343,c474b000,...) at usb_process+0x193 fork_exit(c07bf6e0,c479ed74,c435fd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc435fd70, ebp = 0 --- Tracing command usb pid 14 tid 100032 td 0xc4765b40 sched_switch(c4765b40,0,104,191,8fc524c8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4765b40,0,c0ca113a,260,c4765b40,...) at sleepq_switch+0x15f sleepq_wait(c479ed4c,0,c435ccbc,1,0,...) at sleepq_wait+0x63 _cv_wait(c479ed4c,c479ee4c,c0c8b5d3,6c,c479ed54,...) at _cv_wait+0x240 usb_process(c479ed44,c435cd38,c0c980db,343,c474b000,...) at usb_process+0x193 fork_exit(c07bf6e0,c479ed44,c435cd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc435cd70, ebp = 0 --- Tracing command usb pid 14 tid 100031 td 0xc4765d80 sched_switch(c4765d80,0,104,191,8fc4f704,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4765d80,0,c0ca113a,260,c4765d80,...) at sleepq_switch+0x15f sleepq_wait(c479ed1c,0,c4359cbc,1,0,...) at sleepq_wait+0x63 _cv_wait(c479ed1c,c479ee4c,c0c8b5d3,6c,c479ed24,...) at _cv_wait+0x240 usb_process(c479ed14,c4359d38,c0c980db,343,c474b000,...) at usb_process+0x193 fork_exit(c07bf6e0,c479ed14,c4359d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4359d70, ebp = 0 --- Tracing command xpt_thrd pid 5 tid 100023 td 0xc4756000 sched_switch(c4756000,0,104,191,8fc4baf4,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c4756000,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c0dc6954,4c,c0c372ba,0,0,...) at sleepq_wait+0x63 _sleep(c0dc6954,c0dc696c,4c,c0c372ba,0,...) at _sleep+0x36b xpt_scanner_thread(0,c431ad38,c0c980db,343,c474b2a8,...) at xpt_scanner_thread+0x4a fork_exit(c0484a60,0,c431ad38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc431ad70, ebp = 0 --- Tracing command yarrow pid 13 tid 100017 td 0xc457e240 sched_switch(c457e240,0,104,191,6c6b8436,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c457e240,0,c0ca113a,283,2,...) at sleepq_switch+0x15f sleepq_timedwait(c0dfa5a4,0,c0c92561,2,0,...) at sleepq_timedwait+0x6b _sleep(c0dfa5a4,0,0,c0c92561,64,...) at _sleep+0x339 pause(c0c92561,64,c0c7f55e,111,0,...) at pause+0x47 random_kthread(0,c4308d38,c0c980db,343,c474b550,...) at random_kthread+0x1ef fork_exit(c0738120,0,c4308d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4308d70, ebp = 0 --- Tracing command g_down pid 4 tid 100015 td 0xc457e6c0 sched_switch(c457e6c0,0,104,191,7170d09e,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c457e6c0,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c0df8364,4c,c0c92561,0,0,...) at sleepq_wait+0x63 _sleep(c0df8364,c0df82c8,24c,c0c92561,0,...) at _sleep+0x36b g_io_schedule_down(c457e6c0,0,c0c93c29,74,0,...) at g_io_schedule_down+0x56 g_down_procbody(0,c4302d38,c0c980db,343,c457a000,...) at g_down_procbody+0x8d fork_exit(c082a0e0,0,c4302d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4302d70, ebp = 0 --- Tracing command g_up pid 3 tid 100014 td 0xc457e900 sched_switch(c457e900,0,104,191,7172b4d2,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c457e900,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c0df8360,4c,c0c92561,0,0,...) at sleepq_wait+0x63 _sleep(c0df8360,c0df82e8,24c,c0c92561,0,...) at _sleep+0x36b g_io_schedule_up(c457e900,0,c0c93c29,5d,0,...) at g_io_schedule_up+0x11e g_up_procbody(0,c42ffd38,c0c980db,343,c457a2a8,...) at g_up_procbody+0x8d fork_exit(c082a170,0,c42ffd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42ffd70, ebp = 0 --- Tracing command g_event pid 2 tid 100013 td 0xc457eb40 sched_switch(c457eb40,0,104,191,6c76b886,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,4c,...) at mi_switch+0x200 sleepq_switch(c457eb40,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0df8358,4c,c0c92561,0,0,...) at sleepq_timedwait+0x6b _sleep(c0df8358,0,4c,c0c92561,64,...) at _sleep+0x339 g_event_procbody(0,c42fcd38,c0c980db,343,c457a550,...) at g_event_procbody+0xcb fork_exit(c082a200,0,c42fcd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42fcd70, ebp = 0 --- Tracing command intr pid 12 tid 100042 td 0xc481a900 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100040 td 0xc481ad80 sched_switch(c481ad80,0,109,191,67ecb0d2,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c47acef0,...) at mi_switch+0x200 ithread_loop(c4815b20,e4ab5d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c4815b20,e4ab5d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4ab5d70, ebp = 0 --- Tracing command intr pid 12 tid 100039 td 0xc481b000 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100038 td 0xc4756d80 sched_switch(c4756d80,0,109,191,8f4e3510,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c4578070,...) at mi_switch+0x200 ithread_loop(c480dca0,e4aafd38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c480dca0,e4aafd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4aafd70, ebp = 0 --- Tracing command intr pid 12 tid 100037 td 0xc4765000 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100036 td 0xc4765240 sched_switch(c4765240,0,109,191,7175222a,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1370,...) at mi_switch+0x200 ithread_loop(c480d820,e4aa6d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c480d820,e4aa6d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4aa6d70, ebp = 0 --- Tracing command intr pid 12 tid 100035 td 0xc4765480 sched_switch(c4765480,0,109,191,18e1f41a,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c11f0,...) at mi_switch+0x200 ithread_loop(c47afb10,e4aa0d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c47afb10,e4aa0d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xe4aa0d70, ebp = 0 --- Tracing command intr pid 12 tid 100030 td 0xc4767000 sched_switch(c4767000,0,109,191,8f1da920,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1270,...) at mi_switch+0x200 ithread_loop(c4784830,c4356d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c4784830,c4356d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4356d70, ebp = 0 --- Tracing command intr pid 12 tid 100028 td 0xc4767480 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100024 td 0xc45c3d80 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100022 td 0xc4756240 sched_switch(c4756240,0,109,191,1995ee18,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c4714b70,...) at mi_switch+0x200 ithread_loop(c4516940,c4317d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c4516940,c4317d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4317d70, ebp = 0 --- Tracing command intr pid 12 tid 100021 td 0xc4756480 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100019 td 0xc4756900 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100012 td 0xc457ed80 sched_switch(c457ed80,0,109,191,57388e3e,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1c70,...) at mi_switch+0x200 ithread_loop(c4579090,c42f9d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c4579090,c42f9d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42f9d70, ebp = 0 --- Tracing command intr pid 12 tid 100011 td 0xc45c3000 sched_switch(c45c3000,0,109,191,6c6a9d72,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1cf0,...) at mi_switch+0x200 ithread_loop(c45790a0,c42f6d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c45790a0,c42f6d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42f6d70, ebp = 0 --- Tracing command intr pid 12 tid 100010 td 0xc45c3240 sched_switch(c45c3240,0,109,191,61a69b7e,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1d70,...) at mi_switch+0x200 ithread_loop(c45790b0,c42f3d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c45790b0,c42f3d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42f3d70, ebp = 0 --- Tracing command intr pid 12 tid 100009 td 0xc45c3480 sched_switch(c45c3480,0,109,191,7113a996,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1df0,...) at mi_switch+0x200 ithread_loop(c45790c0,c42f0d38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c45790c0,c42f0d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42f0d70, ebp = 0 --- Tracing command intr pid 12 tid 100008 td 0xc457c000 fork_trampoline() at fork_trampoline Tracing command intr pid 12 tid 100007 td 0xc457c240 sched_switch(c457c240,0,109,191,444f1c7c,...) at sched_switch+0x406 mi_switch(109,0,c0c9835a,52d,c45c1ef0,...) at mi_switch+0x200 ithread_loop(c45790e0,c42ead38,c0c980db,343,c457a7f8,...) at ithread_loop+0x1f6 fork_exit(c0866000,c45790e0,c42ead38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42ead70, ebp = 0 --- Tracing command idle pid 11 tid 100006 td 0xc457c480 sched_switch(c457c480,0,108,18c,d6205816,...) at sched_switch+0x406 mi_switch(108,0,c0c9e76d,3ae,c457c480,...) at mi_switch+0x200 sched_idletd(0,c42e4d38,c0c980db,343,c457aaa0,...) at sched_idletd+0x19b fork_exit(c08afa80,0,c42e4d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42e4d70, ebp = 0 --- Tracing command idle pid 11 tid 100005 td 0xc457c6c0 sched_switch(c457c6c0,0,108,18c,edf12b4e,...) at sched_switch+0x406 mi_switch(108,0,c0c9e76d,3ae,c457c6c0,...) at mi_switch+0x200 sched_idletd(0,c42e1d38,c0c980db,343,c457aaa0,...) at sched_idletd+0x19b fork_exit(c08afa80,0,c42e1d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42e1d70, ebp = 0 --- Tracing command idle pid 11 tid 100004 td 0xc457c900 sched_switch(c457c900,0,108,18c,2b3054e2,...) at sched_switch+0x406 mi_switch(108,0,c0c9e76d,3ae,c457c900,...) at mi_switch+0x200 sched_idletd(0,c42ded38,c0c980db,343,c457aaa0,...) at sched_idletd+0x19b fork_exit(c08afa80,0,c42ded38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42ded70, ebp = 0 --- Tracing command idle pid 11 tid 100003 td 0xc457cb40 sched_switch(c457cb40,0,108,18c,d61f5a36,...) at sched_switch+0x406 mi_switch(108,0,c0c9e76d,3ae,c457cb40,...) at mi_switch+0x200 sched_idletd(0,c42dbd38,c0c980db,343,c457aaa0,...) at sched_idletd+0x19b fork_exit(c08afa80,0,c42dbd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42dbd70, ebp = 0 --- Tracing command init pid 1 tid 100002 td 0xc457cd80 sched_switch(c457cd80,0,104,191,74d7372a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,5c,...) at mi_switch+0x200 sleepq_switch(c457cd80,0,c0ca113a,1a0,5c,...) at sleepq_switch+0x15f sleepq_catch_signals(c0ca113a,160,0,100,100,...) at sleepq_catch_signals+0xb7 sleepq_wait_sig(c457ad48,5c,c0ca395c,100,0,...) at sleepq_wait_sig+0x17 _sleep(c457ad48,c457add0,15c,c0ca395c,0,...) at _sleep+0x354 kern_wait(c457cd80,ffffffff,c42d7c74,0,0,...) at kern_wait+0xb76 wait4(c457cd80,c42d7cf8,10,c457cd80,c0d881c4,...) at wait4+0x3b syscall(c42d7d38) at syscall+0x2b4 Xint0x80_syscall() at Xint0x80_syscall+0x20 --- syscall (7, FreeBSD ELF32, wait4), eip = 0x8054def, esp = 0xbfbfe90c, ebp = 0xbfbfe928 --- Tracing command audit pid 10 tid 100001 td 0xc457e000 sched_switch(c457e000,0,104,191,8fbf3b08,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c457e000,0,c0ca113a,260,c457e000,...) at sleepq_switch+0x15f sleepq_wait(c0f722c0,0,c42d4c9c,1,0,...) at sleepq_wait+0x63 _cv_wait(c0f722c0,c0f722a4,c0cc1189,194,0,...) at _cv_wait+0x240 audit_worker(0,c42d4d38,c0c980db,343,c457b000,...) at audit_worker+0x84 fork_exit(c0a92d60,0,c42d4d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc42d4d70, ebp = 0 --- Tracing command kernel pid 0 tid 100029 td 0xc4767240 sched_switch(c4767240,0,104,191,8f1d1070,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4767240,0,c0ca113a,260,c4767240,...) at sleepq_switch+0x15f sleepq_wait(c4782340,0,c0c9d7d9,c0c92561,0,...) at sleepq_wait+0x63 msleep_spin(c4782340,c4782358,c0c92561,0,c0c9b36c,...) at msleep_spin+0x21d taskqueue_thread_loop(c478a5a0,c4352d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0x94 fork_exit(c08c9200,c478a5a0,c4352d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4352d70, ebp = 0 --- Tracing command kernel pid 0 tid 100027 td 0xc45c36c0 sched_switch(c45c36c0,0,104,191,f45798a4,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c45c36c0,0,c0ca113a,260,c45c36c0,...) at sleepq_switch+0x15f sleepq_wait(c4749100,0,c0c9d7d9,c0c92561,0,...) at sleepq_wait+0x63 msleep_spin(c4749100,c4749118,c0c92561,0,c0c9b36c,...) at msleep_spin+0x21d taskqueue_thread_loop(c0dc97a0,c4326d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0x94 fork_exit(c08c9200,c0dc97a0,c4326d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4326d70, ebp = 0 --- Tracing command kernel pid 0 tid 100026 td 0xc45c3900 sched_switch(c45c3900,0,104,191,f45775b8,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c45c3900,0,c0ca113a,260,c45c3900,...) at sleepq_switch+0x15f sleepq_wait(c4749100,0,c0c9d7d9,c0c92561,0,...) at sleepq_wait+0x63 msleep_spin(c4749100,c4749118,c0c92561,0,c0c9b36c,...) at msleep_spin+0x21d taskqueue_thread_loop(c0dc97a0,c4323d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0x94 fork_exit(c08c9200,c0dc97a0,c4323d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4323d70, ebp = 0 --- Tracing command kernel pid 0 tid 100025 td 0xc45c3b40 sched_switch(c45c3b40,0,104,191,f4575098,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c45c3b40,0,c0ca113a,260,c45c3b40,...) at sleepq_switch+0x15f sleepq_wait(c4749100,0,c0c9d7d9,c0c92561,0,...) at sleepq_wait+0x63 msleep_spin(c4749100,c4749118,c0c92561,0,c0c9b36c,...) at msleep_spin+0x21d taskqueue_thread_loop(c0dc97a0,c4320d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0x94 fork_exit(c08c9200,c0dc97a0,c4320d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4320d70, ebp = 0 --- Tracing command kernel pid 0 tid 100020 td 0xc47566c0 sched_switch(c47566c0,0,104,191,eca48b4c,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c47566c0,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c4749380,0,c0c92561,0,0,...) at sleepq_wait+0x63 _sleep(c4749380,c4749398,0,c0c92561,0,...) at _sleep+0x36b taskqueue_thread_loop(c0e0cfc8,c4311d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0xba fork_exit(c08c9200,c0e0cfc8,c4311d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4311d70, ebp = 0 --- Tracing command kernel pid 0 tid 100018 td 0xc4756b40 sched_switch(c4756b40,0,104,191,f4440100,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c4756b40,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c4749600,0,c0c92561,0,0,...) at sleepq_wait+0x63 _sleep(c4749600,c4749618,0,c0c92561,0,...) at _sleep+0x36b taskqueue_thread_loop(c0df8cd0,c430bd38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0xba fork_exit(c08c9200,c0df8cd0,c430bd38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc430bd70, ebp = 0 --- Tracing command kernel pid 0 tid 100016 td 0xc457e480 sched_switch(c457e480,0,104,191,2fee0518,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,0,...) at mi_switch+0x200 sleepq_switch(c457e480,0,c0ca113a,260,0,...) at sleepq_switch+0x15f sleepq_wait(c4561dc0,0,c0c92561,0,0,...) at sleepq_wait+0x63 _sleep(c4561dc0,c4561dd8,0,c0c92561,0,...) at _sleep+0x36b taskqueue_thread_loop(c0e0ba60,c4305d38,c0c980db,343,c0df8440,...) at taskqueue_thread_loop+0xba fork_exit(c08c9200,c0e0ba60,c4305d38) at fork_exit+0xb8 fork_trampoline() at fork_trampoline+0x8 --- trap 0, eip = 0, esp = 0xc4305d70, ebp = 0 --- Tracing command kernel pid 0 tid 100000 td 0xc0df86f0 sched_switch(c0df86f0,0,104,191,4fca582a,...) at sched_switch+0x406 mi_switch(104,0,c0ca113a,1eb,44,...) at mi_switch+0x200 sleepq_switch(c0df86f0,0,c0ca113a,283,0,...) at sleepq_switch+0x15f sleepq_timedwait(c0df8440,44,c0c9efe2,0,0,...) at sleepq_timedwait+0x6b _sleep(c0df8440,0,44,c0c9efe2,2710,...) at _sleep+0x339 scheduler(0,141ec00,141ec00,141e000,1425000,...) at scheduler+0x23e mi_startup() at mi_startup+0x96 begin() at begin+0x2c db:0:allt> call doadump Physical memory: 1007 MB Dumping 195 MB: 180 164 148 132 116 100 84 68 52 36 20 4 Dump complete = 0xf db:0:doadump> reset (kgdb) bt #0 doadump () at pcpu.h:246 #1 0xc04d0989 in db_fncall (dummy1=0xc08bc9ba, dummy2=0x0, dummy3=0xffffffff, dummy4=0xe6fe12d8 "ì\022þæ") at ../../../ddb/db_command.c:548 #2 0xc04d0dbf in db_command (last_cmdp=0xc0dc797c, cmd_table=0x0, dopager=0x0) at ../../../ddb/db_command.c:445 #3 0xc04d0e74 in db_command_script (command=0xc0dc8888 "call doadump") at ../../../ddb/db_command.c:516 #4 0xc04d4ff0 in db_script_exec (scriptname=0xc0dc81e0 "doadump", warnifnotfound=Variable "warnifnotfound" is not available. ) at ../../../ddb/db_script.c:302 #5 0xc04d5081 in db_run_cmd (addr=0x1, have_addr=0x0, count=0xc0fc71e0, modif=0xe6fe1410 "") at ../../../ddb/db_script.c:375 #6 0xc04d0d81 in db_command (last_cmdp=0xc0dc797c, cmd_table=0x0, dopager=0x1) at ../../../ddb/db_command.c:445 #7 0xc04d0eda in db_command_loop () at ../../../ddb/db_command.c:498 #8 0xc04d2d7d in db_trap (type=0x3, code=0x0) at ../../../ddb/db_main.c:229 #9 0xc08bc836 in kdb_trap (type=0x3, code=0x0, tf=0xe6fe15b8) at ../../../kern/subr_kdb.c:535 #10 0xc0bcb6ab in trap (frame=0xe6fe15b8) at ../../../i386/i386/trap.c:690 #11 0xc0bad10b in calltrap () at ../../../i386/i386/exception.s:165 #12 0xc08bc9ba in kdb_enter (why=0xc0c9cbe4 "panic", msg=0xc0c9cbe4 "panic") at cpufunc.h:71 #13 0xc088ce16 in panic (fmt=0xc0cc5365 "flush_pagedep_deps: MKDIR_BODY") at ../../../kern/kern_shutdown.c:562 #14 0xc0acc2e5 in softdep_sync_metadata (vp=0xc50ce570) at ../../../ufs/ffs/ffs_softdep.c:9175 #15 0xc0ad3412 in ffs_syncvnode (vp=0xc50ce570, waitfor=0x1) at ../../../ufs/ffs/ffs_vnops.c:333 #16 0xc0ab25d6 in ffs_truncate (vp=0xc50ce570, length=0x5200, flags=0x880, cred=0xc4aa0580, td=0xc95f1b40) at ../../../ufs/ffs/ffs_inode.c:285 #17 0xc0adbb86 in ufs_direnter (dvp=0xc50ce570, tvp=0xc63af6cc, dirp=0xe6fe19f8, cnp=0xe6fe1c00, newdirbp=0x0) at ../../../ufs/ufs/ufs_lookup.c:988 #18 0xc0ae1085 in ufs_makeinode (mode=0x11b6, dvp=0xc50ce570, vpp=0xe6fe1bec, cnp=0xe6fe1c00) at ../../../ufs/ufs/ufs_vnops.c:2540 #19 0xc0ae12a5 in ufs_mknod (ap=0xe6fe1c28) at ../../../ufs/ufs/ufs_vnops.c:222 #20 0xc0be4aa5 in VOP_MKNOD_APV (vop=0xc0dab200, a=0xe6fe1c28) at vnode_if.c:379 #21 0xc0926427 in kern_mkfifoat (td=0xc95f1b40, fd=0xffffff9c, path=0x804d240
, pathseg=UIO_USERSPACE, mode=Variable "mode" is not available. ) at vnode_if.h:164 #22 0xc09264ce in kern_mkfifo (td=0xc95f1b40, path=0x804d240
, pathseg=UIO_USERSPACE, mode=0x1b6) at ../../../kern/vfs_syscalls.c:1402 #23 0xc09264f9 in mkfifo (td=0xc95f1b40, uap=0xe6fe1cf8) at ../../../kern/vfs_syscalls.c:1380 #24 0xc0bcae34 in syscall (frame=0xe6fe1d38) at ../../../i386/i386/trap.c:1076 #25 0xc0bad170 in Xint0x80_syscall () at ../../../i386/i386/exception.s:261 #26 0x00000033 in ?? () Previous frame inner to this frame (corrupt stack?) (kgdb) f 14 #14 0xc0acc2e5 in softdep_sync_metadata (vp=0xc50ce570) at ../../../ufs/ffs/ffs_softdep.c:9175 9175 panic("flush_pagedep_deps: MKDIR_BODY"); (kgdb) l 9170 * If that cleared dependencies, go on to next. 9171 */ 9172 if (dap != LIST_FIRST(diraddhdp)) 9173 continue; 9174 if (dap->da_state & MKDIR_BODY) 9175 panic("flush_pagedep_deps: MKDIR_BODY"); 9176 } 9177 /* 9178 * Flush the inode on which the directory entry depends. 9179 * Having accounted for MKDIR_PARENT and MKDIR_BODY above, (kgdb) p *vp $1 = {v_type = VDIR, v_tag = 0xc0c957ae "ufs", v_op = 0xc0daad00, v_data = 0xc4c42ae0, v_mount = 0xc4a9b5a8, v_nmntvnodes = {tqe_next = 0xc50ce414, tqe_prev = 0xc50ceaf4}, v_un = {vu_mount = 0x0, vu_socket = 0x0, vu_cdev = 0x0, vu_fifoinfo = 0x0, vu_yield = 0x0}, v_hashlist = {le_next = 0x0, le_prev = 0xc4859c84}, v_hash = 0x78c00, v_cache_src = {lh_first = 0xc53e8048}, v_cache_dst = {tqh_first = 0x0, tqh_last = 0xc50ce5a0}, v_cache_dd = 0x0, v_cstart = 0x0, v_lasta = 0x0, v_lastw = 0x0, v_clen = 0x0, v_lock = {lock_object = {lo_name = 0xc0c957ae "ufs", lo_flags = 0x57b0000, lo_data = 0x0, lo_witness = 0xc453b228}, lk_lock = 0xc95f1b42, lk_exslpfail = 0x0, lk_timo = 0x33, lk_pri = 0x50, lk_stack = {depth = 0xb, pcs = {0xc0875612, 0xc0ad3671, 0xc0be3c65, 0xc092c7f8, 0xc0913416, 0xc09147cf, 0xc0926278, 0xc09264ce, 0xc09264f9, 0xc0bcae34, 0xc0bad170, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, v_interlock = {lock_object = {lo_name = 0xc0ca31e4 "vnode interlock", lo_flags = 0x1030000, lo_data = 0x0, lo_witness = 0xc4535248}, mtx_lock = 0x4}, v_vnlock = 0xc50ce5c8, v_holdcnt = 0x68, v_usecount = 0x63, v_iflag = 0x0, v_vflag = 0x0, v_writecount = 0x0, v_freelist = {tqe_next = 0x0, tqe_prev = 0x0}, v_bufobj = {bo_mtx = {lock_object = {lo_name = 0xc0cab150 "bufobj interlock", lo_flags = 0x1030000, lo_data = 0x0, lo_witness = 0xc4539d08}, mtx_lock = 0x4}, bo_clean = {bv_hd = {tqh_first = 0x0, tqh_last = 0xc50ce67c}, bv_root = 0x0, bv_cnt = 0x0}, bo_dirty = {bv_hd = { tqh_first = 0xd852ebe0, tqh_last = 0xd86bb418}, bv_root = 0xd86bb3e0, bv_cnt = 0x2}, bo_numoutput = 0x0, bo_flag = 0x1, bo_ops = 0xc0d98920, bo_bsize = 0x4000, bo_object = 0xc514e000, bo_synclist = {le_next = 0xc6054a7c, le_prev = 0xc480b31c}, bo_private = 0xc50ce570, __bo_vnode = 0xc50ce570}, v_pollinfo = 0x0, v_label = 0x0, v_lockf = 0x0} (kgdb) $ svn diff -x -p /usr/src/sys Index: /usr/src/sys/ufs/ufs/ufs_dirhash.c =================================================================== --- /usr/src/sys/ufs/ufs/ufs_dirhash.c (revision 200565) +++ /usr/src/sys/ufs/ufs/ufs_dirhash.c (working copy) @@ -68,8 +68,6 @@ __FBSDID("$FreeBSD$"); static MALLOC_DEFINE(M_DIRHASH, "ufs_dirhash", "UFS directory hash tables"); -static SYSCTL_NODE(_vfs, OID_AUTO, ufs, CTLFLAG_RD, 0, "UFS filesystem"); - static int ufs_mindirhashsize = DIRBLKSIZ * 5; SYSCTL_INT(_vfs_ufs, OID_AUTO, dirhash_minsize, CTLFLAG_RW, &ufs_mindirhashsize, Index: /usr/src/sys/ufs/ufs/ufs_vnops.c =================================================================== --- /usr/src/sys/ufs/ufs/ufs_vnops.c (revision 200565) +++ /usr/src/sys/ufs/ufs/ufs_vnops.c (working copy) @@ -114,6 +114,8 @@ static vop_close_t ufsfifo_close; static vop_kqfilter_t ufsfifo_kqfilter; static vop_pathconf_t ufsfifo_pathconf; +SYSCTL_NODE(_vfs, OID_AUTO, ufs, CTLFLAG_RD, 0, "UFS filesystem"); + /* * A virgin directory (no blushing please). */ @@ -902,6 +904,9 @@ ufs_link(ap) error = EXDEV; goto out; } + if (VTOI(tdvp)->i_effnlink < 2) + panic("ufs_link: Bad link count %d on parent", + VTOI(tdvp)->i_effnlink); ip = VTOI(vp); if ((nlink_t)ip->i_nlink >= LINK_MAX) { error = EMLINK; @@ -916,7 +921,7 @@ ufs_link(ap) DIP_SET(ip, i_nlink, ip->i_nlink); ip->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(vp)) - softdep_change_linkcnt(ip); + softdep_setup_link(VTOI(tdvp), ip); error = UFS_UPDATE(vp, !(DOINGSOFTDEP(vp) | DOINGASYNC(vp))); if (!error) { ufs_makedirentry(ip, cnp, &newdir); @@ -929,7 +934,7 @@ ufs_link(ap) DIP_SET(ip, i_nlink, ip->i_nlink); ip->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(vp)) - softdep_change_linkcnt(ip); + softdep_revert_link(VTOI(tdvp), ip); } out: return (error); @@ -990,6 +995,11 @@ ufs_whiteout(ap) return (error); } +static volatile int rename_restarts; +SYSCTL_INT(_vfs_ufs, OID_AUTO, rename_restarts, CTLFLAG_RD, + __DEVOLATILE(int *, &rename_restarts), 0, + "Times rename had to restart due to lock contention"); + /* * Rename system call. * rename("foo", "bar"); @@ -1029,14 +1039,16 @@ ufs_rename(ap) struct vnode *tdvp = ap->a_tdvp; struct vnode *fvp = ap->a_fvp; struct vnode *fdvp = ap->a_fdvp; + struct vnode *nvp; struct componentname *tcnp = ap->a_tcnp; struct componentname *fcnp = ap->a_fcnp; struct thread *td = fcnp->cn_thread; - struct inode *ip, *xp, *dp; + struct inode *ip, *xp, *tdp, *fdp; struct direct newdir; - int doingdirectory = 0, oldparent = 0, newparent = 0; + int doingdirectory, newparent; int error = 0, ioflag; - ino_t fvp_ino; + struct mount *mp; + ino_t ino; #ifdef INVARIANTS if ((tcnp->cn_flags & HASBUF) == 0 || @@ -1049,7 +1061,6 @@ ufs_rename(ap) if ((fvp->v_mount != tdvp->v_mount) || (tvp && (fvp->v_mount != tvp->v_mount))) { error = EXDEV; -abortit: if (tdvp == tvp) vrele(tdvp); else @@ -1060,63 +1071,202 @@ ufs_rename(ap) vrele(fvp); return (error); } - + mp = tdvp->v_mount; + VOP_UNLOCK(tdvp, 0); + if (tvp && tvp != tdvp) + VOP_UNLOCK(tvp, 0); + error = vfs_busy(mp, 0); + if (error) { + mp = NULL; + goto releout; + } +relock: + /* + * We need to acquire 2 to 4 locks depending on whether tvp is NULL + * and fdvp and tdvp are the same directory. Subsequently we need + * to double-check all paths and in the directory rename case we + * need to verify that we are not creating a directory loop. To + * handle this we acquire fdvp and fvp in order using blocking + * locks followed by non-blocking acquisitions for all remaining + * locks. If we fail to acquire any lock in the path we will + * drop all held locks, acquire the new lock in a blocking fashion, + * and then release it and restart the rename. This acquire/release + * step ensures that we do not spin on a lock waiting for release. + */ + error = vn_lock(fdvp, LK_EXCLUSIVE); + if (error) + goto releout; + error = vn_lock(fvp, LK_EXCLUSIVE); + if (error) { + VOP_UNLOCK(fdvp, 0); + goto releout; + } + if (vn_lock(tdvp, LK_EXCLUSIVE | LK_NOWAIT) != 0) { + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(fvp, 0); + error = vn_lock(tdvp, LK_EXCLUSIVE); + if (error) + goto releout; + VOP_UNLOCK(tdvp, 0); + atomic_add_int(&rename_restarts, 1); + goto relock; + } + /* + * If vn_lock fails due to VI_DOOMED being set on fdvp, fvp, or tdvp + * it is a fatal condition. If it occurs on tvp we carry on as if + * it was removed and ufs_lookup_ino() below will resolve the + * condition that cleared it. + */ + if (tvp && vn_lock(tvp, LK_EXCLUSIVE | LK_NOWAIT) != 0) { + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(tdvp, 0); + VOP_UNLOCK(fvp, 0); + error = vn_lock(tvp, LK_EXCLUSIVE); + if (error) + tvp = NULL; + else + VOP_UNLOCK(tvp, 0); + atomic_add_int(&rename_restarts, 1); + goto relock; + } + fdp = VTOI(fdvp); + ip = VTOI(fvp); + tdp = VTOI(tdvp); + xp = NULL; + if (tvp) + xp = VTOI(tvp); + /* + * Re-resolve fvp to be certain it still exists at the same inode + * number. If the lookup fails abort the rename. If the inode + * number has changed we need to VGET it and then restart the + * whole lock operation. + */ + error = ufs_lookup_ino(fdvp, NULL, fcnp, &ino); + if (error) + goto unlockout; + if (ino != ip->i_number) { + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(tdvp, 0); + vput(fvp); + if (tvp) + VOP_UNLOCK(tvp, 0); + error = VFS_VGET(mp, ino, LK_EXCLUSIVE, &fvp); + if (error) + goto releout; + VOP_UNLOCK(fvp, 0); + atomic_add_int(&rename_restarts, 1); + goto relock; + } + /* + * Re-lookup to now that all of the locks are held. + */ + error = ufs_lookup_ino(tdvp, NULL, tcnp, &ino); + if (error != 0 && error != EJUSTRETURN) + goto unlockout; + /* + * If tvp disappeared we just need to restart. + */ + if (error == EJUSTRETURN && tvp != NULL) { + vput(tvp); + tvp = NULL; + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(tdvp, 0); + VOP_UNLOCK(fvp, 0); + atomic_add_int(&rename_restarts, 1); + goto relock; + } + /* + * If tvp changed out from under us we need to drop the old one, + * VGET the new one, and restart. + */ + if (error == 0 && (tvp == NULL || xp->i_number != ino)) { + if (tvp != NULL) + vput(tvp); + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(tdvp, 0); + VOP_UNLOCK(fvp, 0); + error = VFS_VGET(mp, ino, LK_EXCLUSIVE, &tvp); + if (error) + tvp = NULL; + else + VOP_UNLOCK(tvp, 0); + atomic_add_int(&rename_restarts, 1); + goto relock; + } if (tvp && ((VTOI(tvp)->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || (VTOI(tdvp)->i_flags & APPEND))) { error = EPERM; - goto abortit; + goto unlockout; } - /* * Renaming a file to itself has no effect. The upper layers should - * not call us in that case. Temporarily just warn if they do. + * not call us in that case. */ - if (fvp == tvp) { - printf("ufs_rename: fvp == tvp (can't happen)\n"); - error = 0; - goto abortit; - } - - if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0) - goto abortit; - dp = VTOI(fdvp); - ip = VTOI(fvp); + if (fvp == tvp) + panic("ufs_rename: fvp == tvp (can't happen)\n"); + doingdirectory = 0; + newparent = 0; + ino = ip->i_number; if (ip->i_nlink >= LINK_MAX) { - VOP_UNLOCK(fvp, 0); error = EMLINK; - goto abortit; + goto unlockout; } if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) - || (dp->i_flags & APPEND)) { - VOP_UNLOCK(fvp, 0); + || (fdp->i_flags & APPEND)) { error = EPERM; - goto abortit; + goto unlockout; } if ((ip->i_mode & IFMT) == IFDIR) { /* * Avoid ".", "..", and aliases of "." for obvious reasons. */ if ((fcnp->cn_namelen == 1 && fcnp->cn_nameptr[0] == '.') || - dp == ip || (fcnp->cn_flags | tcnp->cn_flags) & ISDOTDOT || - (ip->i_flag & IN_RENAME)) { - VOP_UNLOCK(fvp, 0); + fdp == ip || (fcnp->cn_flags | tcnp->cn_flags) & ISDOTDOT) { error = EINVAL; - goto abortit; + goto unlockout; } - ip->i_flag |= IN_RENAME; - oldparent = dp->i_number; + if (fdp->i_number != tdp->i_number) + newparent = tdp->i_number; doingdirectory = 1; } - vrele(fdvp); /* - * When the target exists, both the directory - * and target vnodes are returned locked. + * If ".." must be changed (ie the directory gets a new + * parent) then the source directory must not be in the + * directory hierarchy above the target, as this would + * orphan everything below the source directory. Also + * the user must have write permission in the source so + * as to be able to change "..". */ - dp = VTOI(tdvp); - xp = NULL; - if (tvp) - xp = VTOI(tvp); + if (doingdirectory && newparent) { + error = VOP_ACCESS(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_thread); + if (error) + goto unlockout; + error = ufs_checkpath(ino, fdp->i_number, tdp, tcnp->cn_cred, + &ino); + /* + * We encountered a lock that we have to wait for. Unlock + * everything else and VGET before restarting. + */ + if (ino) { + VOP_UNLOCK(tdvp, 0); + VOP_UNLOCK(fdvp, 0); + VOP_UNLOCK(fvp, 0); + if (tvp) + VOP_UNLOCK(tvp, 0); + error = VFS_VGET(mp, ino, LK_EXCLUSIVE, &nvp); + if (error == 0) + vput(nvp); + atomic_add_int(&rename_restarts, 1); + goto relock; + } + if (error) + goto unlockout; + if ((tcnp->cn_flags & SAVESTART) == 0) + panic("ufs_rename: lost to startdir"); + } + if (ip->i_effnlink == 0 || fdp->i_effnlink == 0 || tdp->i_effnlink == 0) + panic("Bad effnlink ip %p, fdp %p, tdp %p", ip, fdp, tdp); /* * 1) Bump link count while we're moving stuff @@ -1129,49 +1279,12 @@ ufs_rename(ap) DIP_SET(ip, i_nlink, ip->i_nlink); ip->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(fvp)) - softdep_change_linkcnt(ip); - if ((error = UFS_UPDATE(fvp, !(DOINGSOFTDEP(fvp) | - DOINGASYNC(fvp)))) != 0) { - VOP_UNLOCK(fvp, 0); + softdep_setup_link(tdp, ip); + error = UFS_UPDATE(fvp, !(DOINGSOFTDEP(fvp) | DOINGASYNC(fvp))); + if (error) goto bad; - } /* - * If ".." must be changed (ie the directory gets a new - * parent) then the source directory must not be in the - * directory hierarchy above the target, as this would - * orphan everything below the source directory. Also - * the user must have write permission in the source so - * as to be able to change "..". We must repeat the call - * to namei, as the parent directory is unlocked by the - * call to checkpath(). - */ - error = VOP_ACCESS(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_thread); - fvp_ino = ip->i_number; - VOP_UNLOCK(fvp, 0); - if (oldparent != dp->i_number) - newparent = dp->i_number; - if (doingdirectory && newparent) { - if (error) /* write access check above */ - goto bad; - if (xp != NULL) - vput(tvp); - error = ufs_checkpath(fvp_ino, dp, tcnp->cn_cred); - if (error) - goto out; - if ((tcnp->cn_flags & SAVESTART) == 0) - panic("ufs_rename: lost to startdir"); - VREF(tdvp); - error = relookup(tdvp, &tvp, tcnp); - if (error) - goto out; - vrele(tdvp); - dp = VTOI(tdvp); - xp = NULL; - if (tvp) - xp = VTOI(tvp); - } - /* * 2) If target doesn't exist, link the target * to the source and unlink the source. * Otherwise, rewrite the target directory @@ -1179,46 +1292,27 @@ ufs_rename(ap) * expunge the original entry's existence. */ if (xp == NULL) { - if (dp->i_dev != ip->i_dev) + if (tdp->i_dev != ip->i_dev) panic("ufs_rename: EXDEV"); - /* - * Account for ".." in new directory. - * When source and destination have the same - * parent we don't fool with the link count. - */ if (doingdirectory && newparent) { - if ((nlink_t)dp->i_nlink >= LINK_MAX) { + /* + * Account for ".." in new directory. + * When source and destination have the same + * parent we don't adjust the link count. The + * actual link modification is completed when + * .. is rewritten below. + */ + if ((nlink_t)tdp->i_nlink >= LINK_MAX) { error = EMLINK; goto bad; } - dp->i_effnlink++; - dp->i_nlink++; - DIP_SET(dp, i_nlink, dp->i_nlink); - dp->i_flag |= IN_CHANGE; - if (DOINGSOFTDEP(tdvp)) - softdep_change_linkcnt(dp); - error = UFS_UPDATE(tdvp, !(DOINGSOFTDEP(tdvp) | - DOINGASYNC(tdvp))); - if (error) - goto bad; } ufs_makedirentry(ip, tcnp, &newdir); error = ufs_direnter(tdvp, NULL, &newdir, tcnp, NULL); - if (error) { - if (doingdirectory && newparent) { - dp->i_effnlink--; - dp->i_nlink--; - DIP_SET(dp, i_nlink, dp->i_nlink); - dp->i_flag |= IN_CHANGE; - if (DOINGSOFTDEP(tdvp)) - softdep_change_linkcnt(dp); - (void)UFS_UPDATE(tdvp, 1); - } + if (error) goto bad; - } - vput(tdvp); } else { - if (xp->i_dev != dp->i_dev || xp->i_dev != ip->i_dev) + if (xp->i_dev != tdp->i_dev || xp->i_dev != ip->i_dev) panic("ufs_rename: EXDEV"); /* * Short circuit rename(foo, foo). @@ -1231,7 +1325,7 @@ ufs_rename(ap) * destination of the rename. This implements append-only * directories. */ - if ((dp->i_mode & S_ISTXT) && + if ((tdp->i_mode & S_ISTXT) && VOP_ACCESS(tdvp, VADMIN, tcnp->cn_cred, td) && VOP_ACCESS(tvp, VADMIN, tcnp->cn_cred, td)) { error = EPERM; @@ -1242,9 +1336,9 @@ ufs_rename(ap) * to it. Also, ensure source and target are compatible * (both directories, or both not directories). */ - if ((xp->i_mode&IFMT) == IFDIR) { + if ((xp->i_mode & IFMT) == IFDIR) { if ((xp->i_effnlink > 2) || - !ufs_dirempty(xp, dp->i_number, tcnp->cn_cred)) { + !ufs_dirempty(xp, tdp->i_number, tcnp->cn_cred)) { error = ENOTEMPTY; goto bad; } @@ -1257,16 +1351,16 @@ ufs_rename(ap) error = EISDIR; goto bad; } - error = ufs_dirrewrite(dp, xp, ip->i_number, + error = ufs_dirrewrite(tdp, xp, ip->i_number, IFTODT(ip->i_mode), (doingdirectory && newparent) ? newparent : doingdirectory); if (error) goto bad; if (doingdirectory) { if (!newparent) { - dp->i_effnlink--; + tdp->i_effnlink--; if (DOINGSOFTDEP(tdvp)) - softdep_change_linkcnt(dp); + softdep_change_linkcnt(tdp); } xp->i_effnlink--; if (DOINGSOFTDEP(tvp)) @@ -1285,9 +1379,9 @@ ufs_rename(ap) * them now. */ if (!newparent) { - dp->i_nlink--; - DIP_SET(dp, i_nlink, dp->i_nlink); - dp->i_flag |= IN_CHANGE; + tdp->i_nlink--; + DIP_SET(tdp, i_nlink, tdp->i_nlink); + tdp->i_flag |= IN_CHANGE; } xp->i_nlink--; DIP_SET(xp, i_nlink, xp->i_nlink); @@ -1295,105 +1389,80 @@ ufs_rename(ap) ioflag = IO_NORMAL; if (!DOINGASYNC(tvp)) ioflag |= IO_SYNC; + /* Don't go to bad here as the new link exists. */ if ((error = UFS_TRUNCATE(tvp, (off_t)0, ioflag, tcnp->cn_cred, tcnp->cn_thread)) != 0) - goto bad; + goto unlockout; } - vput(tdvp); - vput(tvp); - xp = NULL; } /* - * 3) Unlink the source. + * 3) Unlink the source. We have to resolve the path again to + * fixup the directory offset and count for ufs_dirremove. */ - fcnp->cn_flags &= ~MODMASK; - fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; - if ((fcnp->cn_flags & SAVESTART) == 0) - panic("ufs_rename: lost from startdir"); - VREF(fdvp); - error = relookup(fdvp, &fvp, fcnp); - if (error == 0) - vrele(fdvp); - if (fvp != NULL) { - xp = VTOI(fvp); - dp = VTOI(fdvp); - } else { - /* - * From name has disappeared. IN_RENAME is not sufficient - * to protect against directory races due to timing windows, - * so we have to remove the panic. XXX the only real way - * to solve this issue is at a much higher level. By the - * time we hit ufs_rename() it's too late. - */ -#if 0 - if (doingdirectory) - panic("ufs_rename: lost dir entry"); -#endif - vrele(ap->a_fvp); - return (0); + if (fdvp == tdvp) { + error = ufs_lookup_ino(fdvp, NULL, fcnp, &ino); + if (error) + panic("ufs_rename: from entry went away!"); } /* - * Ensure that the directory entry still exists and has not - * changed while the new name has been entered. If the source is - * a file then the entry may have been unlinked or renamed. In - * either case there is no further work to be done. If the source - * is a directory then it cannot have been rmdir'ed; the IN_RENAME - * flag ensures that it cannot be moved by another rename or removed - * by a rmdir. + * If the source is a directory with a + * new parent, the link count of the old + * parent directory must be decremented + * and ".." set to point to the new parent. */ - if (xp != ip) { + if (doingdirectory && newparent) { /* - * From name resolves to a different inode. IN_RENAME is - * not sufficient protection against timing window races - * so we can't panic here. XXX the only real way - * to solve this issue is at a much higher level. By the - * time we hit ufs_rename() it's too late. + * If xp exists we simply use its link, otherwise we must + * add a new one. */ -#if 0 - if (doingdirectory) - panic("ufs_rename: lost dir entry"); -#endif - } else { - /* - * If the source is a directory with a - * new parent, the link count of the old - * parent directory must be decremented - * and ".." set to point to the new parent. - */ - if (doingdirectory && newparent) { - xp->i_offset = mastertemplate.dot_reclen; - ufs_dirrewrite(xp, dp, newparent, DT_DIR, 0); - cache_purge(fdvp); + if (xp == NULL) { + tdp->i_effnlink++; + tdp->i_nlink++; + DIP_SET(tdp, i_nlink, tdp->i_nlink); + tdp->i_flag |= IN_CHANGE; + if (DOINGSOFTDEP(tdvp)) + softdep_setup_dotdot_link(tdp, ip); + error = UFS_UPDATE(tdvp, !(DOINGSOFTDEP(tdvp) | + DOINGASYNC(tdvp))); + /* Don't go to bad here as the new link exists. */ + if (error) + goto unlockout; } - error = ufs_dirremove(fdvp, xp, fcnp->cn_flags, 0); - xp->i_flag &= ~IN_RENAME; + ip->i_offset = mastertemplate.dot_reclen; + ufs_dirrewrite(ip, fdp, newparent, DT_DIR, 0); + cache_purge(fdvp); } - if (dp) - vput(fdvp); - if (xp) - vput(fvp); - vrele(ap->a_fvp); + error = ufs_dirremove(fdvp, ip, fcnp->cn_flags, 0); + +unlockout: + vput(tdvp); + vput(fdvp); + vput(fvp); + if (tvp) + vput(tvp); + if (mp) + vfs_unbusy(mp); return (error); bad: - if (xp) - vput(ITOV(xp)); - vput(ITOV(dp)); -out: - if (doingdirectory) - ip->i_flag &= ~IN_RENAME; - if (vn_lock(fvp, LK_EXCLUSIVE) == 0) { - ip->i_effnlink--; - ip->i_nlink--; - DIP_SET(ip, i_nlink, ip->i_nlink); - ip->i_flag |= IN_CHANGE; - ip->i_flag &= ~IN_RENAME; - if (DOINGSOFTDEP(fvp)) - softdep_change_linkcnt(ip); - vput(fvp); - } else - vrele(fvp); + ip->i_effnlink--; + ip->i_nlink--; + DIP_SET(ip, i_nlink, ip->i_nlink); + ip->i_flag |= IN_CHANGE; + if (DOINGSOFTDEP(fvp)) + softdep_revert_link(tdp, ip); + goto unlockout; + +releout: + vrele(tdvp); + if (tvp) + vrele(tvp); + vrele(fdvp); + vrele(fvp); + if (mp) + vfs_unbusy(mp); + return (error); } @@ -1565,8 +1634,7 @@ ufs_mkdir(ap) ip->i_effnlink = 2; ip->i_nlink = 2; DIP_SET(ip, i_nlink, 2); - if (DOINGSOFTDEP(tvp)) - softdep_change_linkcnt(ip); + if (cnp->cn_flags & ISWHITEOUT) { ip->i_flags |= UF_OPAQUE; DIP_SET(ip, i_flags, ip->i_flags); @@ -1582,8 +1650,8 @@ ufs_mkdir(ap) DIP_SET(dp, i_nlink, dp->i_nlink); dp->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(dvp)) - softdep_change_linkcnt(dp); - error = UFS_UPDATE(tvp, !(DOINGSOFTDEP(dvp) | DOINGASYNC(dvp))); + softdep_setup_mkdir(dp, ip); + error = UFS_UPDATE(dvp, !(DOINGSOFTDEP(dvp) | DOINGASYNC(dvp))); if (error) goto bad; #ifdef MAC @@ -1701,8 +1769,6 @@ bad: dp->i_nlink--; DIP_SET(dp, i_nlink, dp->i_nlink); dp->i_flag |= IN_CHANGE; - if (DOINGSOFTDEP(dvp)) - softdep_change_linkcnt(dp); /* * No need to do an explicit VOP_TRUNCATE here, vrele will * do this for us because we set the link count to 0. @@ -1712,7 +1778,8 @@ bad: DIP_SET(ip, i_nlink, 0); ip->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(tvp)) - softdep_change_linkcnt(ip); + softdep_revert_mkdir(dp, ip); + vput(tvp); } out: @@ -1748,10 +1815,13 @@ ufs_rmdir(ap) * tries to remove a locally mounted on directory). */ error = 0; - if ((ip->i_flag & IN_RENAME) || ip->i_effnlink < 2) { + if (ip->i_effnlink < 2) { error = EINVAL; goto out; } + if (dp->i_effnlink < 3) + panic("ufs_dirrem: Bad link count %d on parent", + dp->i_effnlink); if (!ufs_dirempty(ip, dp->i_number, cnp->cn_cred)) { error = ENOTEMPTY; goto out; @@ -1775,18 +1845,14 @@ ufs_rmdir(ap) */ dp->i_effnlink--; ip->i_effnlink--; - if (DOINGSOFTDEP(vp)) { - softdep_change_linkcnt(dp); - softdep_change_linkcnt(ip); - } + if (DOINGSOFTDEP(vp)) + softdep_setup_rmdir(dp, ip); error = ufs_dirremove(dvp, ip, cnp->cn_flags, 1); if (error) { dp->i_effnlink++; ip->i_effnlink++; - if (DOINGSOFTDEP(vp)) { - softdep_change_linkcnt(dp); - softdep_change_linkcnt(ip); - } + if (DOINGSOFTDEP(vp)) + softdep_revert_rmdir(dp, ip); goto out; } cache_purge(dvp); @@ -2282,6 +2348,9 @@ ufs_makeinode(mode, dvp, vpp, cnp) if ((mode & IFMT) == 0) mode |= IFREG; + if (VTOI(dvp)->i_effnlink < 2) + panic("ufs_makeinode: Bad link count %d on parent", + VTOI(dvp)->i_effnlink); error = UFS_VALLOC(dvp, mode, cnp->cn_cred, &tvp); if (error) return (error); @@ -2411,7 +2480,7 @@ ufs_makeinode(mode, dvp, vpp, cnp) ip->i_nlink = 1; DIP_SET(ip, i_nlink, 1); if (DOINGSOFTDEP(tvp)) - softdep_change_linkcnt(ip); + softdep_setup_create(VTOI(dvp), ip); if ((ip->i_mode & ISGID) && !groupmember(ip->i_gid, cnp->cn_cred) && priv_check_cred(cnp->cn_cred, PRIV_VFS_SETGID, 0)) { ip->i_mode &= ~ISGID; @@ -2484,7 +2553,7 @@ bad: DIP_SET(ip, i_nlink, 0); ip->i_flag |= IN_CHANGE; if (DOINGSOFTDEP(tvp)) - softdep_change_linkcnt(ip); + softdep_revert_create(VTOI(dvp), ip); vput(tvp); return (error); } Index: /usr/src/sys/ufs/ufs/ufsmount.h =================================================================== --- /usr/src/sys/ufs/ufs/ufsmount.h (revision 200565) +++ /usr/src/sys/ufs/ufs/ufsmount.h (working copy) @@ -57,6 +57,7 @@ struct ucred; struct uio; struct vnode; struct ufs_extattr_per_mount; +struct jblocks; /* This structure describes the UFS specific mount structure data. */ struct ufsmount { @@ -75,6 +76,10 @@ struct ufsmount { long um_numindirdeps; /* outstanding indirdeps */ struct workhead softdep_workitem_pending; /* softdep work queue */ struct worklist *softdep_worklist_tail; /* Tail pointer for above */ + struct workhead softdep_journal_pending; /* journal work queue */ + struct worklist *softdep_journal_tail; /* Tail pointer for above */ + struct jblocks *softdep_jblocks; /* Journal block information */ + 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 */ int softdep_deps; /* Total dependency count */ Index: /usr/src/sys/ufs/ufs/ufs_lookup.c =================================================================== --- /usr/src/sys/ufs/ufs/ufs_lookup.c (revision 200565) +++ /usr/src/sys/ufs/ufs/ufs_lookup.c (working copy) @@ -77,9 +77,6 @@ SYSCTL_INT(_debug, OID_AUTO, dircheck, CTLFLAG_RW, /* true if old FS format...*/ #define OFSFMT(vp) ((vp)->v_mount->mnt_maxsymlinklen <= 0) -static int ufs_lookup_(struct vnode *, struct vnode **, struct componentname *, - ino_t *); - /* * Convert a component of a pathname into a pointer to a locked inode. * This is a very central and rather complicated routine. @@ -134,11 +131,11 @@ ufs_lookup(ap) } */ *ap; { - return (ufs_lookup_(ap->a_dvp, ap->a_vpp, ap->a_cnp, NULL)); + return (ufs_lookup_ino(ap->a_dvp, ap->a_vpp, ap->a_cnp, NULL)); } -static int -ufs_lookup_(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp, +int +ufs_lookup_ino(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp, ino_t *dd_ino) { struct inode *dp; /* inode for directory being searched */ @@ -464,6 +461,8 @@ notfound: return (ENOENT); found: + if (dd_ino != NULL) + *dd_ino = ino; if (numdirpasses == 2) nchstats.ncs_pass2++; /* @@ -486,11 +485,6 @@ found: if ((flags & ISLASTCN) && nameiop == LOOKUP) dp->i_diroff = i_offset &~ (DIRBLKSIZ - 1); - if (dd_ino != NULL) { - *dd_ino = ino; - return (0); - } - /* * If deleting, and at end of pathname, return * parameters which can be used to remove file. @@ -520,6 +514,8 @@ found: dp->i_count = 0; else dp->i_count = dp->i_offset - prevoff; + if (dd_ino != NULL) + return (0); if (dp->i_number == ino) { VREF(vdp); *vpp = vdp; @@ -560,6 +556,8 @@ found: dp->i_offset = i_offset; if (dp->i_number == ino) return (EISDIR); + if (dd_ino != NULL) + return (0); if ((error = VFS_VGET(vdp->v_mount, ino, LK_EXCLUSIVE, &tdp)) != 0) return (error); @@ -567,6 +565,8 @@ found: cnp->cn_flags |= SAVENAME; return (0); } + if (dd_ino != NULL) + return (0); /* * Step through the translation in the name. We do not `vput' the @@ -598,7 +598,7 @@ found: * to the inode we looked up before vdp lock was * dropped. */ - error = ufs_lookup_(pdp, NULL, cnp, &ino1); + error = ufs_lookup_ino(pdp, NULL, cnp, &ino1); if (error) { vput(tdp); return (error); @@ -819,29 +819,12 @@ ufs_direnter(dvp, tvp, dirp, cnp, newdirbp) (bp->b_data + blkoff))->d_reclen = DIRBLKSIZ; blkoff += DIRBLKSIZ; } - if (softdep_setup_directory_add(bp, dp, dp->i_offset, - dirp->d_ino, newdirbp, 1) == 0) { - bdwrite(bp); - return (UFS_UPDATE(dvp, 0)); - } - /* We have just allocated a directory block in an - * indirect block. Rather than tracking when it gets - * claimed by the inode, we simply do a VOP_FSYNC - * now to ensure that it is there (in case the user - * does a future fsync). Note that we have to unlock - * the inode for the entry that we just entered, as - * the VOP_FSYNC may need to lock other inodes which - * can lead to deadlock if we also hold a lock on - * the newly entered node. - */ - if ((error = bwrite(bp))) - return (error); - if (tvp != NULL) - VOP_UNLOCK(tvp, 0); - error = VOP_FSYNC(dvp, MNT_WAIT, td); - if (tvp != NULL) - vn_lock(tvp, LK_EXCLUSIVE | LK_RETRY); - return (error); + softdep_setup_directory_add(bp, dp, dp->i_offset, + dirp->d_ino, newdirbp, 1); + if (newdirbp) + bdwrite(newdirbp); + bdwrite(bp); + return (UFS_UPDATE(dvp, 0)); } if (DOINGASYNC(dvp)) { bdwrite(bp); @@ -976,6 +959,8 @@ ufs_direnter(dvp, tvp, dirp, cnp, newdirbp) (void) softdep_setup_directory_add(bp, dp, dp->i_offset + (caddr_t)ep - dirbuf, dirp->d_ino, newdirbp, 0); + if (newdirbp) + bdwrite(newdirbp); bdwrite(bp); } else { if (DOINGASYNC(dvp)) { @@ -1084,7 +1069,7 @@ out: if (DOINGSOFTDEP(dvp)) { if (ip) { ip->i_effnlink--; - softdep_change_linkcnt(ip); + softdep_setup_unlink(dp, ip); softdep_setup_remove(bp, dp, ip, isrmdir); } if (softdep_slowdown(dvp)) { @@ -1146,7 +1131,7 @@ ufs_dirrewrite(dp, oip, newinum, newtype, isrmdir) ep->d_type = newtype; oip->i_effnlink--; if (DOINGSOFTDEP(vdp)) { - softdep_change_linkcnt(oip); + softdep_setup_unlink(dp, oip); softdep_setup_directory_change(bp, dp, oip, newinum, isrmdir); bdwrite(bp); } else { @@ -1267,25 +1252,25 @@ ufs_dir_dd_ino(struct vnode *vp, struct ucred *cre /* * Check if source directory is in the path of the target directory. - * Target is supplied locked, source is unlocked. - * The target is always vput before returning. */ int -ufs_checkpath(ino_t source_ino, struct inode *target, struct ucred *cred) +ufs_checkpath(ino_t source_ino, ino_t parent_ino, struct inode *target, struct ucred *cred, ino_t *wait_ino) { - struct vnode *vp, *vp1; + struct mount *mp; + struct vnode *tvp, *vp, *vp1; int error; ino_t dd_ino; - vp = ITOV(target); - if (target->i_number == source_ino) { - error = EEXIST; - goto out; - } - error = 0; + vp = tvp = ITOV(target); + mp = vp->v_mount; + *wait_ino = 0; + if (target->i_number == source_ino) + return (EEXIST); + if (target->i_number == parent_ino) + return (0); if (target->i_number == ROOTINO) - goto out; - + return (0); + error = 0; for (;;) { error = ufs_dir_dd_ino(vp, cred, &dd_ino); if (error != 0) @@ -1296,9 +1281,13 @@ int } if (dd_ino == ROOTINO) break; - error = vn_vget_ino(vp, dd_ino, LK_EXCLUSIVE, &vp1); - if (error != 0) + if (dd_ino == parent_ino) break; + error = VFS_VGET(mp, dd_ino, LK_EXCLUSIVE | LK_NOWAIT, &vp1); + if (error != 0) { + *wait_ino = dd_ino; + break; + } /* Recheck that ".." still points to vp1 after relock of vp */ error = ufs_dir_dd_ino(vp, cred, &dd_ino); if (error != 0) { @@ -1310,14 +1299,14 @@ int vput(vp1); continue; } - vput(vp); + if (vp != tvp) + vput(vp); vp = vp1; } -out: if (error == ENOTDIR) - printf("checkpath: .. not a directory\n"); - if (vp != NULL) + panic("checkpath: .. not a directory\n"); + if (vp != tvp) vput(vp); return (error); } Index: /usr/src/sys/ufs/ufs/ufs_extern.h =================================================================== --- /usr/src/sys/ufs/ufs/ufs_extern.h (revision 200565) +++ /usr/src/sys/ufs/ufs/ufs_extern.h (working copy) @@ -57,7 +57,7 @@ int ufs_bmap(struct vop_bmap_args *); int ufs_bmaparray(struct vnode *, ufs2_daddr_t, ufs2_daddr_t *, struct buf *, int *, int *); int ufs_fhtovp(struct mount *, struct ufid *, struct vnode **); -int ufs_checkpath(ino_t, struct inode *, struct ucred *); +int ufs_checkpath(ino_t, ino_t, struct inode *, struct ucred *, ino_t *); void ufs_dirbad(struct inode *, doff_t, char *); int ufs_dirbadentry(struct vnode *, struct direct *, int); int ufs_dirempty(struct inode *, ino_t, struct ucred *); @@ -69,6 +69,8 @@ int ufs_direnter(struct vnode *, struct vnode *, struct componentname *, struct buf *); int ufs_dirremove(struct vnode *, struct inode *, int, int); int ufs_dirrewrite(struct inode *, struct inode *, ino_t, int, int); +int ufs_lookup_ino(struct vnode *, struct vnode **, struct componentname *, + ino_t *); int ufs_getlbns(struct vnode *, ufs2_daddr_t, struct indir *, int *); int ufs_inactive(struct vop_inactive_args *); int ufs_init(struct vfsconf *); @@ -81,6 +83,9 @@ vfs_root_t ufs_root; int ufs_uninit(struct vfsconf *); int ufs_vinit(struct mount *, struct vop_vector *, struct vnode **); +#include +SYSCTL_DECL(_vfs_ufs); + /* * Soft update function prototypes. */ @@ -94,6 +99,17 @@ void softdep_setup_directory_change(struct buf *, void softdep_change_linkcnt(struct inode *); void softdep_releasefile(struct inode *); int softdep_slowdown(struct vnode *); +void softdep_setup_create(struct inode *, struct inode *); +void softdep_setup_dotdot_link(struct inode *, struct inode *); +void softdep_setup_link(struct inode *, struct inode *); +void softdep_setup_mkdir(struct inode *, struct inode *); +void softdep_setup_rmdir(struct inode *, struct inode *); +void softdep_setup_unlink(struct inode *, struct inode *); +void softdep_revert_create(struct inode *, struct inode *); +void softdep_revert_dotdot_link(struct inode *, struct inode *); +void softdep_revert_link(struct inode *, struct inode *); +void softdep_revert_mkdir(struct inode *, struct inode *); +void softdep_revert_rmdir(struct inode *, struct inode *); /* * Flags to low-level allocation routines. The low 16-bits are reserved Index: /usr/src/sys/ufs/ffs/ffs_vfsops.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_vfsops.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_vfsops.c (working copy) @@ -858,6 +858,7 @@ ffs_mountfs(devvp, mp, td) */ bzero(fs->fs_fsmnt, MAXMNTLEN); strlcpy(fs->fs_fsmnt, mp->mnt_stat.f_mntonname, MAXMNTLEN); + mp->mnt_stat.f_iosize = fs->fs_bsize; if( mp->mnt_flag & MNT_ROOTFS) { /* @@ -899,7 +900,6 @@ ffs_mountfs(devvp, mp, td) * This would all happen while the filesystem was busy/not * available, so would effectively be "atomic". */ - mp->mnt_stat.f_iosize = fs->fs_bsize; (void) ufs_extattr_autostart(mp, td); #endif /* !UFS_EXTATTR_AUTOSTART */ #endif /* !UFS_EXTATTR */ @@ -1829,9 +1829,6 @@ ffs_bufwrite(struct buf *bp) } BO_UNLOCK(bp->b_bufobj); - /* Mark the buffer clean */ - bundirty(bp); - /* * If this buffer is marked for background writing and we * do not have to wait for it, make a copy and write the @@ -1872,9 +1869,16 @@ ffs_bufwrite(struct buf *bp) newbp->b_flags &= ~B_INVAL; #ifdef SOFTUPDATES - /* move over the dependencies */ - if (!LIST_EMPTY(&bp->b_dep)) - softdep_move_dependencies(bp, newbp); + /* + * Move over the dependencies. If there are rollbacks, + * leave the parent buffer dirtied as it will need to + * be written again. + */ + if (LIST_EMPTY(&bp->b_dep) || + softdep_move_dependencies(bp, newbp) == 0) + bundirty(bp); +#else + bundirty(bp); #endif /* @@ -1887,8 +1891,11 @@ ffs_bufwrite(struct buf *bp) */ bqrelse(bp); bp = newbp; - } + } else + /* Mark the buffer clean */ + bundirty(bp); + /* Let the normal bufwrite do the rest for us */ normal_write: return (bufwrite(bp)); Index: /usr/src/sys/ufs/ffs/ffs_softdep.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_softdep.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_softdep.c (working copy) @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -130,10 +131,12 @@ softdep_setup_inomapdep(bp, ip, newinum) } void -softdep_setup_blkmapdep(bp, mp, newblkno) +softdep_setup_blkmapdep(bp, mp, newblkno, frags, oldfrags) struct buf *bp; struct mount *mp; ufs2_daddr_t newblkno; + int frags; + int oldfrags; { panic("softdep_setup_blkmapdep called"); @@ -403,24 +406,6 @@ softdep_get_depcounts(struct mount *mp, * These definitions need to be adapted to the system to which * this file is being ported. */ -/* - * malloc types defined for the softdep system. - */ -static MALLOC_DEFINE(M_PAGEDEP, "pagedep","File page dependencies"); -static MALLOC_DEFINE(M_INODEDEP, "inodedep","Inode dependencies"); -static MALLOC_DEFINE(M_NEWBLK, "newblk","New block allocation"); -static MALLOC_DEFINE(M_BMSAFEMAP, "bmsafemap","Block or frag allocated from cyl group map"); -static MALLOC_DEFINE(M_ALLOCDIRECT, "allocdirect","Block or frag dependency for an inode"); -static MALLOC_DEFINE(M_INDIRDEP, "indirdep","Indirect block dependencies"); -static MALLOC_DEFINE(M_ALLOCINDIR, "allocindir","Block dependency for an indirect block"); -static MALLOC_DEFINE(M_FREEFRAG, "freefrag","Previously used frag for an inode"); -static MALLOC_DEFINE(M_FREEBLKS, "freeblks","Blocks freed from an inode"); -static MALLOC_DEFINE(M_FREEFILE, "freefile","Inode deallocated"); -static MALLOC_DEFINE(M_DIRADD, "diradd","New directory entry"); -static MALLOC_DEFINE(M_MKDIR, "mkdir","New directory"); -static MALLOC_DEFINE(M_DIRREM, "dirrem","Directory entry deleted"); -static MALLOC_DEFINE(M_NEWDIRBLK, "newdirblk","Unclaimed new directory block"); -static MALLOC_DEFINE(M_SAVEDINO, "savedino","Saved inodes"); #define M_SOFTDEP_FLAGS (M_WAITOK | M_USE_RESERVE) @@ -438,8 +423,62 @@ softdep_get_depcounts(struct mount *mp, #define D_MKDIR 11 #define D_DIRREM 12 #define D_NEWDIRBLK 13 -#define D_LAST D_NEWDIRBLK +#define D_FREEWORK 14 +#define D_FREEDEP 15 +#define D_JADDREF 16 +#define D_JREMREF 17 +#define D_JNEWBLK 18 +#define D_JFREEBLK 19 +#define D_JFREEFRAG 20 +#define D_JSEG 21 +#define D_JSEGDEP 22 +#define D_LAST D_JSEGDEP +unsigned long dep_current[D_LAST + 1]; +unsigned long dep_total[D_LAST + 1]; + + +SYSCTL_NODE(_debug, OID_AUTO, softdep, CTLFLAG_RW, 0, "soft updates stats"); +SYSCTL_NODE(_debug_softdep, OID_AUTO, total, CTLFLAG_RW, 0, + "total dependencies allocated"); +SYSCTL_NODE(_debug_softdep, OID_AUTO, current, CTLFLAG_RW, 0, + "current dependencies allocated"); + +#define SOFTDEP_TYPE(type, str, long) \ + static MALLOC_DEFINE(M_ ## type, #str, long); \ + SYSCTL_LONG(_debug_softdep_total, OID_AUTO, str, CTLFLAG_RD, \ + &dep_total[D_ ## type], 0, ""); \ + SYSCTL_LONG(_debug_softdep_current, OID_AUTO, str, CTLFLAG_RD, \ + &dep_current[D_ ## type], 0, ""); + +SOFTDEP_TYPE(PAGEDEP, pagedep, "File page dependencies"); +SOFTDEP_TYPE(INODEDEP, inodedep, "Inode dependencies"); +SOFTDEP_TYPE(NEWBLK, newblk, "New block allocation"); +SOFTDEP_TYPE(BMSAFEMAP, bmsafemap, + "Block or frag allocated from cyl group map"); +SOFTDEP_TYPE(ALLOCDIRECT, allocdirect, "Block or frag dependency for an inode"); +SOFTDEP_TYPE(INDIRDEP, indirdep, "Indirect block dependencies"); +SOFTDEP_TYPE(ALLOCINDIR, allocindir, "Block dependency for an indirect block"); +SOFTDEP_TYPE(FREEFRAG, freefrag, "Previously used frag for an inode"); +SOFTDEP_TYPE(FREEBLKS, freeblks, "Blocks freed from an inode"); +SOFTDEP_TYPE(FREEFILE, freefile, "Inode deallocated"); +SOFTDEP_TYPE(DIRADD, diradd, "New directory entry"); +SOFTDEP_TYPE(MKDIR, mkdir, "New directory"); +SOFTDEP_TYPE(DIRREM, dirrem, "Directory entry deleted"); +SOFTDEP_TYPE(NEWDIRBLK, newdirblk, "Unclaimed new directory block"); +SOFTDEP_TYPE(FREEWORK, freework, "free an inode block"); +SOFTDEP_TYPE(FREEDEP, freedep, "track a block free"); +SOFTDEP_TYPE(JADDREF, jaddref, "Journal inode ref add"); +SOFTDEP_TYPE(JREMREF, jremref, "Journal inode ref remove"); +SOFTDEP_TYPE(JNEWBLK, jnewblk, "Journal new block"); +SOFTDEP_TYPE(JFREEBLK, jfreeblk, "Journal free block"); +SOFTDEP_TYPE(JFREEFRAG, jfreefrag, "Journal free frag"); +SOFTDEP_TYPE(JSEG, jseg, "Journal segment"); +SOFTDEP_TYPE(JSEGDEP, jsegdep, "Journal segment complete"); + +static MALLOC_DEFINE(M_SAVEDINO, "savedino", "Saved inodes"); +static MALLOC_DEFINE(M_JBLOCKS, "jblocks", "Journal block locations"); + /* * translate from workitem type to memory type * MUST match the defines above, such that memtype[D_XXX] == M_XXX @@ -458,7 +497,16 @@ static struct malloc_type *memtype[] = { M_DIRADD, M_MKDIR, M_DIRREM, - M_NEWDIRBLK + M_NEWDIRBLK, + M_FREEWORK, + M_FREEDEP, + M_JADDREF, + M_JREMREF, + M_JNEWBLK, + M_JFREEBLK, + M_JFREEFRAG, + M_JSEG, + M_JSEGDEP }; #define DtoM(type) (memtype[type]) @@ -467,17 +515,21 @@ static struct malloc_type *memtype[] = { * Names of malloc types. */ #define TYPENAME(type) \ - ((unsigned)(type) < D_LAST ? memtype[type]->ks_shortdesc : "???") + ((unsigned)(type) <= D_LAST ? memtype[type]->ks_shortdesc : "???") /* * End system adaptation definitions. */ +#define DOTDOT_OFFSET offsetof(struct dirtemplate, dotdot_ino) +#define DOT_OFFSET offsetof(struct dirtemplate, dot_ino) + /* * Forward declarations. */ struct inodedep_hashhead; struct newblk_hashhead; struct pagedep_hashhead; +struct bmsafemap_hashhead; /* * Internal function prototypes. @@ -493,53 +545,128 @@ static int flush_inodedep_deps(struct mount *, ino static int flush_deplist(struct allocdirectlst *, int, int *); static int handle_written_filepage(struct pagedep *, struct buf *); static void diradd_inode_written(struct diradd *, struct inodedep *); +static int handle_written_indirdep(struct indirdep *, struct buf *, + struct buf**); static int handle_written_inodeblock(struct inodedep *, struct buf *); -static void handle_allocdirect_partdone(struct allocdirect *); +static int handle_written_bmsafemap(struct bmsafemap *, struct buf *); +static void handle_written_jaddref(struct jaddref *, struct jsegdep *); +static void handle_written_jremref(struct jremref *, struct jsegdep *); +static void handle_written_jseg(struct jseg *, struct buf *); +static void handle_written_jnewblk(struct jnewblk *, struct jsegdep *); +static void handle_written_jfreeblk(struct jfreeblk *, struct jsegdep *); +static void handle_written_jfreefrag(struct jfreefrag *, struct jsegdep *); +static void jseg_write(struct jblocks *, struct jseg *, uint8_t *); +static void jaddref_write(struct jaddref *, uint8_t *); +static void jremref_write(struct jremref *, uint8_t *); +static void jnewblk_write(struct jnewblk *, uint8_t *); +static void jfreeblk_write(struct jfreeblk *, uint8_t *); +static void jfreefrag_write(struct jfreefrag *, uint8_t *); +static void handle_allocdirect_partdone(struct allocdirect *, + struct workhead *); +static void allocdirect_jwork(struct allocdirect *, struct workhead *, + short type); +static void handle_workitem_indirdep(struct indirdep *); +static void indirdep_attach(struct indirdep *, struct buf *); +static void indirdep_complete(struct indirdep *); 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 *); static void handle_written_mkdir(struct mkdir *, int); +static void initiate_write_bmsafemap(struct bmsafemap *, struct buf *); static void initiate_write_inodeblock_ufs1(struct inodedep *, struct buf *); static void initiate_write_inodeblock_ufs2(struct inodedep *, struct buf *); static void handle_workitem_freefile(struct freefile *); static void handle_workitem_remove(struct dirrem *, struct vnode *); static struct dirrem *newdirrem(struct buf *, struct inode *, struct inode *, int, struct dirrem **); -static void free_diradd(struct diradd *); -static void free_allocindir(struct allocindir *, struct inodedep *); +static void free_indirdep(struct indirdep *); +static void free_diradd(struct diradd *, struct workhead *); +static void merge_diradd(struct inodedep *, struct diradd *); +static void complete_diradd(struct diradd *); +static struct diradd *diradd_lookup(struct pagedep *, int); +static void cancel_diradd_dotdot(struct inode *, struct dirrem *); +static void free_allocindir(struct allocindir *, struct inodedep *, + struct workhead *, short); +static void cancel_allocindir(struct allocindir *, struct inodedep *, + struct freeblks *); +static void complete_mkdir(struct mkdir *); static void free_newdirblk(struct newdirblk *); -static int indir_trunc(struct freeblks *, ufs2_daddr_t, int, ufs_lbn_t, - ufs2_daddr_t *); -static void deallocate_dependencies(struct buf *, struct inodedep *); -static void free_allocdirect(struct allocdirectlst *, - struct allocdirect *, int); +static void free_jremref(struct jremref *); +static void free_jaddref(struct jaddref *); +static void free_jsegdep(struct jsegdep *); +static void free_jseg(struct jseg *); +static void free_jnewblk(struct jnewblk *); +static void free_jfreeblk(struct jfreeblk *); +static void free_jfreefrag(struct jfreefrag *); +static void free_freedep(struct freedep *); +static void cancel_jnewblk(struct jnewblk *, struct workhead *); +static void cancel_jaddref(struct jaddref *, struct inodedep *, + struct workhead *); +static void cancel_jfreefrag(struct jfreefrag *); +static int indir_trunc(struct freework *, ufs2_daddr_t, ufs_lbn_t); +static int deallocate_dependencies(struct buf *, struct inodedep *, + struct freeblks *); +static void free_allocdirect(struct allocdirect *); +static void cancel_allocdirect(struct allocdirectlst *, + struct allocdirect *, struct freeblks *, int); static int check_inode_unwritten(struct inodedep *); static int free_inodedep(struct inodedep *); +static void freework_freeblock(struct freework *); +static void freework_freeindir(struct freework *); static void handle_workitem_freeblocks(struct freeblks *, int); +static void handle_complete_freeblocks(struct freeblks *); +static void handle_workitem_indirblk(struct freework *); +static void handle_written_freework(struct freework *); static void merge_inode_lists(struct allocdirectlst *,struct allocdirectlst *); static void setup_allocindir_phase2(struct buf *, struct inode *, - struct allocindir *); + struct inodedep *, struct allocindir *, ufs_lbn_t); static struct allocindir *newallocindir(struct inode *, int, ufs2_daddr_t, - ufs2_daddr_t); + ufs2_daddr_t, ufs_lbn_t); static void handle_workitem_freefrag(struct freefrag *); -static struct freefrag *newfreefrag(struct inode *, ufs2_daddr_t, long); +static struct freefrag *newfreefrag(struct inode *, ufs2_daddr_t, long, + ufs_lbn_t); static void allocdirect_merge(struct allocdirectlst *, struct allocdirect *, struct allocdirect *); -static struct bmsafemap *bmsafemap_lookup(struct mount *, struct buf *); +static struct freefrag *allocindir_merge(struct allocindir *, + struct allocindir *); +static int bmsafemap_find(struct bmsafemap_hashhead *, struct mount *, int, + struct bmsafemap **); +static struct bmsafemap *bmsafemap_lookup(struct mount *, struct buf *, + int cg); static int newblk_find(struct newblk_hashhead *, struct fs *, ufs2_daddr_t, struct newblk **); static int newblk_lookup(struct fs *, ufs2_daddr_t, int, struct newblk **); static int inodedep_find(struct inodedep_hashhead *, struct fs *, ino_t, struct inodedep **); static int inodedep_lookup(struct mount *, ino_t, int, struct inodedep **); -static int pagedep_lookup(struct inode *, ufs_lbn_t, int, struct pagedep **); +static int pagedep_lookup(struct mount *, ino_t, ufs_lbn_t, int, + struct pagedep **); static int pagedep_find(struct pagedep_hashhead *, ino_t, ufs_lbn_t, struct mount *mp, int, struct pagedep **); static void pause_timer(void *); static int request_cleanup(struct mount *, int); static int process_worklist_item(struct mount *, int); +static void jwork_move(short, short, struct workhead *, struct workhead *); static void add_to_worklist(struct worklist *); static void softdep_flush(void); static int softdep_speedup(void); +static int journal_mount(struct mount *, struct fs *, struct ucred *); +static void add_to_journal(struct worklist *); +static void remove_from_journal(struct worklist *); +static void softdep_process_journal(struct mount *, int); +static struct jremref *newjremref(struct dirrem *, struct inode *, + struct inode *ip, off_t); +static struct jaddref *newjaddref(struct inode *, ino_t, off_t, int16_t, + uint16_t); +static struct jfreeblk *newjfreeblk(struct freeblks *, ufs_lbn_t, + ufs2_daddr_t, int); +static struct freework *newfreework(struct freeblks *, struct freework *, + ufs_lbn_t, ufs2_daddr_t, int, int); +static void jwait(struct worklist *wk); +static struct inodedep *inodedep_lookup_ip(struct inode *); +static int bmsafemap_rollbacks(struct bmsafemap *); +static struct freefile *handle_bufwait(struct inodedep *, struct workhead *); +static void handle_jwork(struct workhead *); /* * Exported softdep operations. @@ -572,40 +699,134 @@ MTX_SYSINIT(softdep_lock, &lk, "Softdep Lock", MTX (item)->wk_state &= ~ONWORKLIST; \ LIST_REMOVE(item, wk_list); \ } while (0) +#define WORKLIST_INSERT_UNLOCKED WORKLIST_INSERT +#define WORKLIST_REMOVE_UNLOCKED WORKLIST_REMOVE + #else /* DEBUG */ -static void worklist_insert(struct workhead *, struct worklist *); -static void worklist_remove(struct worklist *); +static void worklist_insert(struct workhead *, struct worklist *, int); +static void worklist_remove(struct worklist *, int); -#define WORKLIST_INSERT(head, item) worklist_insert(head, item) -#define WORKLIST_REMOVE(item) worklist_remove(item) +#define WORKLIST_INSERT(head, item) worklist_insert(head, item, 1) +#define WORKLIST_INSERT_UNLOCKED(head, item) worklist_insert(head, item, 0) +#define WORKLIST_REMOVE(item) worklist_remove(item, 1) +#define WORKLIST_REMOVE_UNLOCKED(item) worklist_remove(item, 0) static void -worklist_insert(head, item) +worklist_insert(head, item, locked) struct workhead *head; struct worklist *item; + int locked; { - mtx_assert(&lk, MA_OWNED); + if (locked) + mtx_assert(&lk, MA_OWNED); if (item->wk_state & ONWORKLIST) - panic("worklist_insert: already on list"); + panic("worklist_insert: %p %s(0x%X) already on list", + item, TYPENAME(item->wk_type), item->wk_state); item->wk_state |= ONWORKLIST; LIST_INSERT_HEAD(head, item, wk_list); } static void -worklist_remove(item) +worklist_remove(item, locked) struct worklist *item; + int locked; { - mtx_assert(&lk, MA_OWNED); + if (locked) + mtx_assert(&lk, MA_OWNED); if ((item->wk_state & ONWORKLIST) == 0) - panic("worklist_remove: not on list"); + panic("worklist_remove: %p %s(0x%X) not on list", + item, TYPENAME(item->wk_type), item->wk_state); item->wk_state &= ~ONWORKLIST; LIST_REMOVE(item, wk_list); } #endif /* DEBUG */ /* + * Merge two jsegdeps keeping only the oldest one as newer references + * can't be discarded until after older references. + */ +static inline struct jsegdep * +jsegdep_merge(struct jsegdep *one, struct jsegdep *two) +{ + struct jsegdep *swp; + + if (two == NULL) + return (one); + + if (one->jd_seg->js_seq > two->jd_seg->js_seq) { + swp = one; + one = two; + two = swp; + } + WORKLIST_REMOVE(&two->jd_list); + free_jsegdep(two); + + return (one); +} + +/* + * If two freedeps are compatible free one to reduce list size. + */ +static inline struct freedep * +freedep_merge(struct freedep *one, struct freedep *two) +{ + if (two == NULL) + return (one); + + if (one->fd_freework == two->fd_freework) { + WORKLIST_REMOVE(&two->fd_list); + free_freedep(two); + } + return (one); +} + +/* + * Move journal work from one list to another. Duplicate freedeps and + * jsegdeps are coalesced to keep the lists as small as possible. + */ +static void +jwork_move(type, line, dst, src) + short type; + short line; + struct workhead *dst; + struct workhead *src; +{ + struct freedep *freedep; + struct jsegdep *jsegdep; + struct worklist *wkn; + struct worklist *wk; + + KASSERT(dst != src, + ("jwork_move: dst == src")); + freedep = NULL; + jsegdep = NULL; + LIST_FOREACH_SAFE(wk, dst, wk_list, wkn) { + if (wk->wk_type == D_JSEGDEP) + jsegdep = jsegdep_merge(WK_JSEGDEP(wk), jsegdep); + if (wk->wk_type == D_FREEDEP) + freedep = freedep_merge(WK_FREEDEP(wk), freedep); + } + + mtx_assert(&lk, MA_OWNED); + while ((wk = LIST_FIRST(src)) != NULL) { + WORKLIST_REMOVE(wk); + WORKLIST_INSERT(dst, wk); + if (wk->wk_type == D_JSEGDEP) { + jsegdep = jsegdep_merge(WK_JSEGDEP(wk), jsegdep); +#ifdef DEBUG + jsegdep->jd_type = type; + jsegdep->jd_line = line; +#endif + continue; + } + if (wk->wk_type == D_FREEDEP) + freedep = freedep_merge(WK_FREEDEP(wk), freedep); + } +} + +/* * Routines for tracking and managing workitems. */ static void workitem_free(struct worklist *, int); @@ -623,13 +844,16 @@ workitem_free(item, type) #ifdef DEBUG if (item->wk_state & ONWORKLIST) - panic("workitem_free: still on list"); + panic("workitem_free: %s(0x%X) still on list", + TYPENAME(item->wk_type), item->wk_state); if (item->wk_type != type) - panic("workitem_free: type mismatch"); + panic("workitem_free: type mismatch %s != %s", + TYPENAME(item->wk_type), TYPENAME(type)); #endif ump = VFSTOUFS(item->wk_mp); if (--ump->softdep_deps == 0 && ump->softdep_req) wakeup(&ump->softdep_deps); + dep_current[type]--; free(item, DtoM(type)); } @@ -643,6 +867,8 @@ workitem_alloc(item, type, mp) item->wk_mp = mp; item->wk_state = 0; ACQUIRE_LOCK(&lk); + dep_current[type]++; + dep_total[type]++; VFSTOUFS(mp)->softdep_deps++; VFSTOUFS(mp)->softdep_accdeps++; FREE_LOCK(&lk); @@ -696,6 +922,9 @@ SYSCTL_INT(_debug, OID_AUTO, dir_entry, CTLFLAG_RW SYSCTL_DECL(_vfs_ffs); +LIST_HEAD(bmsafemap_hashhead, bmsafemap) *bmsafemap_hashtbl; +static u_long bmsafemap_hash; /* size of hash table - 1 */ + static int compute_summary_at_mount = 0; /* Whether to recompute the summary at mount time */ SYSCTL_INT(_vfs_ffs, OID_AUTO, compute_summary_at_mount, CTLFLAG_RW, &compute_summary_at_mount, 0, "Recompute summary at mount"); @@ -779,7 +1008,7 @@ softdep_speedup(void) req_pending = 1; wakeup(&req_pending); } - + /* XXX Don't we really want to speedup the buf daemon? */ return speedup_syncer(); } @@ -799,7 +1028,8 @@ add_to_worklist(wk) mtx_assert(&lk, MA_OWNED); ump = VFSTOUFS(wk->wk_mp); if (wk->wk_state & ONWORKLIST) - panic("add_to_worklist: already on list"); + panic("add_to_worklist: %s(0x%X) already on list", + TYPENAME(wk->wk_type), wk->wk_state); wk->wk_state |= ONWORKLIST; if (LIST_EMPTY(&ump->softdep_workitem_pending)) LIST_INSERT_HEAD(&ump->softdep_workitem_pending, wk, wk_list); @@ -838,6 +1068,7 @@ softdep_process_worklist(mp, full) ACQUIRE_LOCK(&lk); loopcount = 1; starttime = time_second; + softdep_process_journal(mp, 0); while (ump->softdep_on_worklist > 0) { if ((cnt = process_worklist_item(mp, 0)) == -1) break; @@ -969,6 +1200,15 @@ process_worklist_item(mp, flags) handle_workitem_freefile(WK_FREEFILE(wk)); break; + case D_FREEWORK: + /* Final block in an indirect was freed. */ + handle_workitem_indirblk(WK_FREEWORK(wk)); + break; + + case D_INDIRDEP: + handle_workitem_indirdep(WK_INDIRDEP(wk)); + break; + default: panic("%s_process_worklist: Unknown type %s", "softdep", TYPENAME(wk->wk_type)); @@ -982,19 +1222,22 @@ process_worklist_item(mp, flags) /* * Move dependencies from one buffer to another. */ -void +int softdep_move_dependencies(oldbp, newbp) struct buf *oldbp; struct buf *newbp; { struct worklist *wk, *wktail; + int dirty; - if (!LIST_EMPTY(&newbp->b_dep)) - panic("softdep_move_dependencies: need merge code"); - wktail = 0; + dirty = 0; + wktail = NULL; ACQUIRE_LOCK(&lk); while ((wk = LIST_FIRST(&oldbp->b_dep)) != NULL) { LIST_REMOVE(wk, wk_list); + if (wk->wk_type == D_BMSAFEMAP && + bmsafemap_rollbacks(WK_BMSAFEMAP(wk))) + dirty = 1; if (wktail == 0) LIST_INSERT_HEAD(&newbp->b_dep, wk, wk_list); else @@ -1002,6 +1245,8 @@ softdep_move_dependencies(oldbp, newbp) wktail = wk; } FREE_LOCK(&lk); + + return (dirty); } /* @@ -1198,23 +1443,22 @@ pagedep_find(pagedephd, ino, lbn, mp, flags, paged * This routine must be called with splbio interrupts blocked. */ static int -pagedep_lookup(ip, lbn, flags, pagedeppp) - struct inode *ip; +pagedep_lookup(mp, ino, lbn, flags, pagedeppp) + struct mount *mp; + ino_t ino; ufs_lbn_t lbn; int flags; struct pagedep **pagedeppp; { struct pagedep *pagedep; struct pagedep_hashhead *pagedephd; - struct mount *mp; int ret; int i; mtx_assert(&lk, MA_OWNED); - mp = ITOV(ip)->v_mount; - pagedephd = PAGEDEP_HASH(mp, ip->i_number, lbn); + pagedephd = PAGEDEP_HASH(mp, ino, lbn); - ret = pagedep_find(pagedephd, ip->i_number, lbn, mp, flags, pagedeppp); + ret = pagedep_find(pagedephd, ino, lbn, mp, flags, pagedeppp); if (*pagedeppp || (flags & DEPALLOC) == 0) return (ret); FREE_LOCK(&lk); @@ -1222,12 +1466,12 @@ static int M_PAGEDEP, M_SOFTDEP_FLAGS|M_ZERO); workitem_alloc(&pagedep->pd_list, D_PAGEDEP, mp); ACQUIRE_LOCK(&lk); - ret = pagedep_find(pagedephd, ip->i_number, lbn, mp, flags, pagedeppp); + ret = pagedep_find(pagedephd, ino, lbn, mp, flags, pagedeppp); if (*pagedeppp) { WORKITEM_FREE(pagedep, D_PAGEDEP); return (ret); } - pagedep->pd_ino = ip->i_number; + pagedep->pd_ino = ino; pagedep->pd_lbn = lbn; LIST_INIT(&pagedep->pd_dirremhd); LIST_INIT(&pagedep->pd_pendinghd); @@ -1314,10 +1558,12 @@ inodedep_lookup(mp, inum, flags, inodedeppp) inodedep->id_savedino1 = NULL; inodedep->id_savedsize = -1; inodedep->id_savedextsize = -1; - inodedep->id_buf = NULL; + inodedep->id_bmsafemap = NULL; + inodedep->id_mkdiradd = NULL; LIST_INIT(&inodedep->id_pendinghd); LIST_INIT(&inodedep->id_inowait); LIST_INIT(&inodedep->id_bufwait); + LIST_INIT(&inodedep->id_jaddrefhd); TAILQ_INIT(&inodedep->id_inoupdt); TAILQ_INIT(&inodedep->id_newinoupdt); TAILQ_INIT(&inodedep->id_extupdt); @@ -1405,6 +1651,7 @@ softdep_initialize() &pagedep_hash); inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, &inodedep_hash); newblk_hashtbl = hashinit(64, M_NEWBLK, &newblk_hash); + bmsafemap_hashtbl = hashinit(1024, M_BMSAFEMAP, &bmsafemap_hash); /* initialise bioops hack */ bioops.io_start = softdep_disk_io_initiation; @@ -1428,6 +1675,7 @@ softdep_uninitialize() hashdestroy(pagedep_hashtbl, M_PAGEDEP, pagedep_hash); hashdestroy(inodedep_hashtbl, M_INODEDEP, inodedep_hash); hashdestroy(newblk_hashtbl, M_NEWBLK, newblk_hash); + hashdestroy(bmsafemap_hashtbl, M_BMSAFEMAP, bmsafemap_hash); } /* @@ -1457,9 +1705,14 @@ softdep_mount(devvp, mp, fs, cred) MNT_IUNLOCK(mp); ump = VFSTOUFS(mp); LIST_INIT(&ump->softdep_workitem_pending); + LIST_INIT(&ump->softdep_journal_pending); ump->softdep_worklist_tail = NULL; ump->softdep_on_worklist = 0; ump->softdep_deps = 0; + if ((error = journal_mount(mp, fs, cred)) != 0) { + printf("Failed to start journal: %d\n", error); + return (error); + } /* * When doing soft updates, the counters in the * superblock may have gotten out of sync. Recomputation @@ -1493,7 +1746,1492 @@ softdep_mount(devvp, mp, fs, cred) return (0); } +struct jblocks { + struct jseglst jb_segs; /* TAILQ of current segments. */ + struct jextent *jb_extent; /* Extent array. */ + uint64_t jb_nextseq; /* Next sequence number. */ + uint64_t jb_oldestseq; /* Oldest active sequence number. */ + int jb_avail; /* Available extents. */ + int jb_used; /* Last used extent. */ + int jb_head; /* Allocator head. */ + int jb_off; /* Allocator extent offset. */ + int jb_blocks; /* Total disk blocks covered. */ + int jb_free; /* Total disk blocks free. */ +}; +struct jextent { + ufs2_daddr_t je_daddr; /* Disk block address. */ + int je_blocks; /* Disk block count. */ +}; + +static struct jblocks * +jblocks_create(void) +{ + struct jblocks *jblocks; + + jblocks = malloc(sizeof(*jblocks), M_JBLOCKS, M_WAITOK | M_ZERO); + TAILQ_INIT(&jblocks->jb_segs); + jblocks->jb_avail = 10; + jblocks->jb_extent = malloc(sizeof(struct jextent) * jblocks->jb_avail, + M_JBLOCKS, M_WAITOK | M_ZERO); + + return (jblocks); +} + +static ufs2_daddr_t +jblocks_alloc(struct jblocks *jblocks, int bytes, int *actual) +{ + ufs2_daddr_t daddr; + struct jextent *jext; + int freecnt; + int blocks; + + blocks = bytes / DEV_BSIZE; + jext = &jblocks->jb_extent[jblocks->jb_head]; + freecnt = jext->je_blocks - jblocks->jb_off; + if (freecnt == 0) { + jblocks->jb_off = 0; + if (++jblocks->jb_head > jblocks->jb_used) + jblocks->jb_head = 0; + jext = &jblocks->jb_extent[jblocks->jb_head]; + freecnt = jext->je_blocks; + } + if (freecnt > blocks) + freecnt = blocks; + *actual = freecnt * DEV_BSIZE; + daddr = jext->je_daddr + jblocks->jb_off; + jblocks->jb_off += freecnt; + jblocks->jb_free -= freecnt; + + return (daddr); +} + +static void +jblocks_free(struct jblocks *jblocks, int bytes) +{ + + if (jblocks->jb_free == 0) + wakeup(jblocks); + jblocks->jb_free += bytes / DEV_BSIZE; +} + +static void +jblocks_destroy(struct jblocks *jblocks) +{ + + if (jblocks->jb_extent) + free(jblocks->jb_extent, M_JBLOCKS); + free(jblocks, M_JBLOCKS); +} + +static void +jblocks_add(struct jblocks *jblocks, ufs2_daddr_t daddr, int blocks) +{ + struct jextent *jext; + + jblocks->jb_blocks += blocks; + jblocks->jb_free += blocks; + jext = &jblocks->jb_extent[jblocks->jb_used]; + /* Adding the first block. */ + if (jext->je_daddr == 0) { + jext->je_daddr = daddr; + jext->je_blocks = blocks; + return; + } + /* Extending the last extent. */ + if (jext->je_daddr + jext->je_blocks == daddr) { + jext->je_blocks += blocks; + return; + } + /* Adding a new extent. */ + if (++jblocks->jb_used == jblocks->jb_avail) { + jblocks->jb_avail *= 2; + jext = malloc(sizeof(struct jextent) * jblocks->jb_avail, + M_JBLOCKS, M_WAITOK | M_ZERO); + memcpy(jext, jblocks->jb_extent, + sizeof(struct jextent) * jblocks->jb_used); + free(jblocks->jb_extent, M_JBLOCKS); + jblocks->jb_extent = jext; + } + jext = &jblocks->jb_extent[jblocks->jb_used]; + jext->je_daddr = daddr; + jext->je_blocks = blocks; + return; +} + +static int +journal_mount(mp, fs, cred) + struct mount *mp; + struct fs *fs; + struct ucred *cred; +{ + struct jblocks *jblocks; + struct vnode *vp; + struct inode *ip; + ufs2_daddr_t blkno; + int bcount; + int error; + int i; + + error = VFS_VGET(mp, fs->fs_sujournal, LK_EXCLUSIVE, &vp); + if (error) + return (error); + ip = VTOI(vp); + if (ip->i_size < 1 * 1024 * 1024) { + error = ENOSPC; + goto out; + } + bcount = lblkno(fs, ip->i_size); /* Only use whole blocks. */ + jblocks = jblocks_create(); + for (i = 0; i < bcount; i++) { + error = ufs_bmaparray(vp, i, &blkno, NULL, NULL, NULL); + if (error) + break; + jblocks_add(jblocks, blkno, fsbtodb(fs, fs->fs_frag)); + } + if (error) + jblocks_destroy(jblocks); + else + VFSTOUFS(mp)->softdep_jblocks = jblocks; +out: + vput(vp); + return (error); +} + /* + * Called when a journal record is ready to be written. Space is allocated + * and the journal entry is created when the journal is flushed to stable + * store. + */ +static void +add_to_journal(wk) + struct worklist *wk; +{ + struct ufsmount *ump; + + mtx_assert(&lk, MA_OWNED); + if ((wk->wk_state & DEPCOMPLETE) == 0) + panic("add_to_journal: Invalid wk state 0x%X", wk->wk_state); + ump = VFSTOUFS(wk->wk_mp); + if (wk->wk_state & ONWORKLIST) + panic("add_to_journal: %s(0x%X) already on list", + TYPENAME(wk->wk_type), wk->wk_state); + wk->wk_state |= ONWORKLIST; + if (LIST_EMPTY(&ump->softdep_journal_pending)) + LIST_INSERT_HEAD(&ump->softdep_journal_pending, wk, wk_list); + else + LIST_INSERT_AFTER(ump->softdep_journal_tail, wk, wk_list); + ump->softdep_journal_tail = wk; + ump->softdep_on_journal += 1; +} + +/* + * Remove an arbitrary item for the journal worklist maintain the tail + * pointer. This happens when a new operation obviates the need to + * journal an old operation. + */ +static void +remove_from_journal(wk) + struct worklist *wk; +{ + struct ufsmount *ump; + + mtx_assert(&lk, MA_OWNED); + ump = VFSTOUFS(wk->wk_mp); +#ifdef DEBUG /* XXX Expensive, temporary. */ + { + struct worklist *wkn; + + LIST_FOREACH(wkn, &ump->softdep_journal_pending, wk_list) + if (wkn == wk) + break; + if (wkn == NULL) + panic("remove_from_journal: %p is not in journal", wk); + } +#endif + /* + * We emulate a TAILQ to save space in most structures which do not + * require TAILQ semantics. Here we must update the tail position + * when removing the tail which is not the final entry. + */ + if (ump->softdep_journal_tail == wk) + ump->softdep_journal_tail = + (struct worklist *)wk->wk_list.le_prev; + + WORKLIST_REMOVE(wk); + ump->softdep_on_journal -= 1; +} + +#if 0 +#ifdef DDB +DB_SHOW_COMMAND(softdepsegs, db_show_softdepsegs) +{ + struct jsegdep *jsegdep; + struct jseg *jseg; + int i; + + TAILQ_FOREACH(jseg, &allsegs, js_next) { + db_printf("%p (%ld): %d refs\n", + jseg, jseg->js_seq, jseg->js_refs); + if (jseg->js_refs == 0) + continue; + for (i = 0; i < jseg->js_cnt; i++) { + jsegdep = &jseg->js_deps[i]; + if ((jsegdep->jd_state & ATTACHED) == 0) + continue; + db_printf("\tseg %p allocated to %s @ %d\n", + jsegdep, TYPENAME(jsegdep->jd_type), + jsegdep->jd_line); + } + } +} + +#endif +#endif + +static void +jseg_write(jblocks, jseg, data) + struct jblocks *jblocks; + struct jseg *jseg; + uint8_t *data; +{ + struct jsegrec *rec; + + rec = (struct jsegrec *)data; + rec->jsr_seq = jseg->js_seq; + rec->jsr_oldest = jblocks->jb_oldestseq; + rec->jsr_cnt = jseg->js_cnt; + rec->jsr_crc = 0; +} + +static void +jaddref_write(jaddref, data) + struct jaddref *jaddref; + uint8_t *data; +{ + struct jrefrec *rec; + + rec = (struct jrefrec *)data; + rec->jr_op = JOP_ADDREF; + rec->jr_ino = jaddref->ja_ino; + rec->jr_parent = jaddref->ja_parent; + rec->jr_nlink = jaddref->ja_nlink; + rec->jr_mode = jaddref->ja_mode; + rec->jr_diroff = jaddref->ja_diroff; +} + +static void +jremref_write(jremref, data) + struct jremref *jremref; + uint8_t *data; +{ + struct jrefrec *rec; + + rec = (struct jrefrec *)data; + rec->jr_op = JOP_REMREF; + rec->jr_ino = jremref->jr_ino; + rec->jr_parent = jremref->jr_parent; + rec->jr_nlink = jremref->jr_nlink; + rec->jr_mode = jremref->jr_mode; + rec->jr_diroff = jremref->jr_diroff; +} + +static void +jnewblk_write(jnewblk, data) + struct jnewblk *jnewblk; + uint8_t *data; +{ + struct jblkrec *rec; + + rec = (struct jblkrec *)data; + rec->jb_op = JOP_NEWBLK; + rec->jb_ino = jnewblk->jn_ino; + rec->jb_blkno = jnewblk->jn_blkno; + rec->jb_lbn = jnewblk->jn_lbn; + rec->jb_frags = jnewblk->jn_frags; + rec->jb_oldfrags = jnewblk->jn_oldfrags; +} + +static void +jfreeblk_write(jfreeblk, data) + struct jfreeblk *jfreeblk; + uint8_t *data; +{ + struct jblkrec *rec; + + rec = (struct jblkrec *)data; + rec->jb_op = JOP_FREEBLK; + rec->jb_ino = jfreeblk->jf_ino; + rec->jb_blkno = jfreeblk->jf_blkno; + rec->jb_lbn = jfreeblk->jf_lbn; + rec->jb_frags = jfreeblk->jf_frags; + rec->jb_oldfrags = 0; +} + +static void +jfreefrag_write(jfreefrag, data) + struct jfreefrag *jfreefrag; + uint8_t *data; +{ + struct jblkrec *rec; + + rec = (struct jblkrec *)data; + rec->jb_op = JOP_FREEBLK; + rec->jb_ino = jfreefrag->fr_ino; + rec->jb_blkno = jfreefrag->fr_blkno; + rec->jb_lbn = jfreefrag->fr_lbn; + rec->jb_frags = jfreefrag->fr_frags; + rec->jb_oldfrags = 0; +} + +/* + * Flush some journal records to disk. + */ +static void +softdep_process_journal(mp, flags) + struct mount *mp; + int flags; +{ + struct jblocks *jblocks; + struct ufsmount *ump; + struct worklist *wk; + struct jseg *jseg; + struct buf *bp; + uint8_t *data; + struct fs *fs; + int segwritten; + int jrecpb; /* records per fs block. */ + int jrecpf; /* records per fs frag. */ + int size; + int cnt; + int i; + + ump = VFSTOUFS(mp); + fs = ump->um_fs; + jblocks = ump->softdep_jblocks; + jrecpb = fs->fs_bsize / JREC_SIZE; + jrecpf = fs->fs_fsize / JREC_SIZE; + segwritten = 0; + while ((cnt = ump->softdep_on_journal) != 0) { + /* + * Create a new segment to hold as many as 'cnt' journal + * entries and add them to the segment. Notice cnt is + * off by one to account for the space required by the + * jsegrec. If we don't have a full block to log skip it + * unless flags == MNT_WAIT and we haven't written anything. + */ + cnt++; + if (cnt < jrecpb && (flags != MNT_WAIT || segwritten != 0)) + return; + if (cnt < jrecpb) + cnt = roundup2(cnt, jrecpf); + else + cnt = jrecpb; + /* + * If there is no space try to clean up some entries. + */ + while (jblocks->jb_free == 0) { + if (flags != MNT_WAIT) + return; + /* + * Items in the worklist should release journal + * space when they free storage. Process them + * until we have enough space to proceed. If + * we can't process an item we need to flush more + * bufs and wait. + */ +#if 0 /* + * XXX Currently this deadlocks because bufs are + * held locked while waiting on journal writes in + * truncate and softdep_update_inodeblock(). + */ + printf("softdep: Out of journal space!\n"); + if (process_worklist_item(mp, LK_NOWAIT) != -1) + continue; +#endif + printf("softdep: Out of journal space, no progress."); + softdep_speedup(); + msleep(jblocks, &lk, PRIBIO, "jblocks", 0); + } + FREE_LOCK(&lk); + cnt--; /* Temporarily forget the segment record. */ + size = sizeof(*jseg) + (sizeof(struct jsegdep) * cnt); + jseg = malloc(size, M_JSEG, M_SOFTDEP_FLAGS); + workitem_alloc(&jseg->js_list, D_JSEG, mp); + LIST_INIT(&jseg->js_entries); + jseg->js_refs = 1; /* Self reference. */ + jseg->js_jblocks = jblocks; + for (i = 0; i < cnt; i++) { + jseg->js_deps[i].jd_list.wk_mp = mp; + jseg->js_deps[i].jd_list.wk_type = D_JSEGDEP; + jseg->js_deps[i].jd_list.wk_state = 0; + jseg->js_deps[i].jd_seg = jseg; + } + size = fragroundup(fs, (cnt+1) * JREC_SIZE); + bp = geteblk(size, 0); + ACQUIRE_LOCK(&lk); + /* + * If there was a race while we were allocating the block + * and jseg the entry we care about was likely written. + * We bail out in both the WAIT and NOWAIT case and assume + * the caller will loop if the entry it cares about is + * not written. + */ + if (ump->softdep_on_journal == 0 || jblocks->jb_free == 0) { + bp->b_flags |= B_INVAL | B_NOCACHE; + WORKITEM_FREE(jseg, D_JSEG); + FREE_LOCK(&lk); + brelse(bp); + ACQUIRE_LOCK(&lk); + return; + } + /* + * XXX If we didn't preallocate jsegdeps we could go up to + * the size available in the block. + */ + cnt = MIN(ump->softdep_on_journal, cnt); + size = fragroundup(fs, (cnt + 1) * JREC_SIZE); + /* + * Allocate a disk block for this journal data and account + * for truncation of the requested size if enough contiguous + * space was not available. + */ + bp->b_blkno = bp->b_lblkno = jblocks_alloc(jblocks, size, + &size); + bp->b_offset = bp->b_blkno * DEV_BSIZE; + bp->b_bcount = size; + bp->b_bufobj = &ump->um_devvp->v_bufobj; + bp->b_flags &= ~B_INVAL; + /* + * Initialize our jseg with as many as cnt - 1 records. + * Assign the next sequence number to it and link it + * in-order. + */ + cnt = MIN(ump->softdep_on_journal, (size / JREC_SIZE) - 1); + jseg->js_buf = bp; + jseg->js_cnt = cnt; + jseg->js_size = size; + jseg->js_seq = jblocks->jb_nextseq++; + if (TAILQ_EMPTY(&jblocks->jb_segs)) + jblocks->jb_oldestseq = jseg->js_seq; + TAILQ_INSERT_TAIL(&jblocks->jb_segs, jseg, js_next); + /* + * Start filling in records from the pending list. + */ + data = bp->b_data; + jseg_write(jblocks, jseg, data); + data += JREC_SIZE; + while ((wk = LIST_FIRST(&ump->softdep_journal_pending)) + != NULL) { + remove_from_journal(wk); + wk->wk_state |= IOSTARTED; + WORKLIST_INSERT(&jseg->js_entries, wk); + switch (wk->wk_type) { + case D_JADDREF: + jaddref_write(WK_JADDREF(wk), data); + break; + case D_JREMREF: + jremref_write(WK_JREMREF(wk), data); + break; + case D_JNEWBLK: + jnewblk_write(WK_JNEWBLK(wk), data); + break; + case D_JFREEBLK: + jfreeblk_write(WK_JFREEBLK(wk), data); + break; + case D_JFREEFRAG: + jfreefrag_write(WK_JFREEFRAG(wk), data); + break; + default: + panic("process_journal: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + data += JREC_SIZE; + if (--cnt == 0) + break; + } + /* + * Write this one buffer and continue. + */ +#if 1 + WORKLIST_INSERT(&bp->b_dep, &jseg->js_list); + FREE_LOCK(&lk); + BO_LOCK(bp->b_bufobj); + bgetvp(ump->um_devvp, bp); + BO_UNLOCK(bp->b_bufobj); + /* + * XXX bawrite? Completion ordering? We may permit writing + * the journal out of order but then we must complete + * those segments in order by delaying handle_written_jseg + * until all predecessors have completed. + */ + bwrite(bp); + ACQUIRE_LOCK(&lk); +#else + handle_written_jseg(jseg, bp); + FREE_LOCK(&lk); + brelse(bp); + ACQUIRE_LOCK(&lk); +#endif + segwritten++; + } +} + +/* + * Complete a jseg write, allowing all dependencies awaiting journal writes + * to proceed. Each journal dependency also attaches a jsegdep to dependent + * structures so that the journal segment can be freed to reclaim space. + */ +static void +handle_written_jseg(jseg, bp) + struct jseg *jseg; + struct buf *bp; +{ + struct worklist *wk; + struct jsegdep *jsegdep; + int waiting; + int i; + + if (jseg->js_refs == 0) + panic("handle_written_jseg: No self-reference on %p", jseg); + /* + * We'll never need this buffer again, set flags so it will be + * discarded. + */ + bp->b_flags |= B_INVAL | B_NOCACHE; + i = 0; + while ((wk = LIST_FIRST(&jseg->js_entries)) != NULL) { + WORKLIST_REMOVE(wk); + waiting = wk->wk_state & IOWAITING; + wk->wk_state &= ~(IOSTARTED | IOWAITING); + wk->wk_state |= COMPLETE; + KASSERT(i < jseg->js_cnt, + ("handle_written_jseg: overflow %d >= %d", + i, jseg->js_cnt)); + jsegdep = &jseg->js_deps[i++]; +#ifdef DEBUG + if (jsegdep->jd_state != 0) + panic("Invalid jsegdep: %p jseg %p", jsegdep, jseg); + jsegdep->jd_state = ATTACHED; + jsegdep->jd_type = wk->wk_type; + jsegdep->jd_line = __LINE__; +#endif + jseg->js_refs++; + switch (wk->wk_type) { + case D_JADDREF: + handle_written_jaddref(WK_JADDREF(wk), jsegdep); + break; + case D_JREMREF: + handle_written_jremref(WK_JREMREF(wk), jsegdep); + break; + case D_JNEWBLK: + handle_written_jnewblk(WK_JNEWBLK(wk), jsegdep); + break; + case D_JFREEBLK: + handle_written_jfreeblk(WK_JFREEBLK(wk), jsegdep); + break; + case D_JFREEFRAG: + handle_written_jfreefrag(WK_JFREEFRAG(wk), jsegdep); + break; + default: + panic("handle_written_jseg: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + if (waiting) + wakeup(wk); + } + /* Reset the cnt for the real number of jsegdeps handed out. */ + jseg->js_cnt = i; + /* Release the self reference so the structure may be freed. */ + free_jseg(jseg); +} + +/* + * Called once a jremref has made it to stable store. The jremref is marked + * complete and we attempt to free it. Any pagedeps writes sleeping waiting + * for the jremref to complete will be awoken by free_jremref. + */ +static void +handle_written_jremref(jremref, jsegdep) + struct jremref *jremref; + struct jsegdep *jsegdep; +{ + struct dirrem *dirrem; + + dirrem = jremref->jr_dirrem; + 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); + if (LIST_EMPTY(&dirrem->dm_jremrefhd) && + (dirrem->dm_state & COMPLETE) != 0) + add_to_worklist(&dirrem->dm_list); + free_jremref(jremref); +} + +/* + * Called once a jaddref has made it to stable store. The dependency is + * marked complete and any dependent structures are added to the inode + * bufwait list to be completed as soon as it is written. If a bitmap + * write depends on this entry we move the inode into the inodedephd + * of the bmsafemap dependency and attempt to remove the jaddref from + * the bmsafemap. + */ +static void +handle_written_jaddref(jaddref, jsegdep) + struct jaddref *jaddref; + struct jsegdep *jsegdep; +{ + struct inodedep *inodedep; + struct diradd *diradd; + struct mkdir *mkdir; + + mkdir = NULL; + diradd = NULL; + if (inodedep_lookup(jaddref->ja_list.wk_mp, jaddref->ja_ino, + 0, &inodedep) == 0) + panic("handle_written_jaddref: Lost inodedep."); + if (jaddref->ja_diradd == NULL) + panic("handle_written_jaddref: No dependency"); + if (jaddref->ja_diradd->da_list.wk_type == D_DIRADD) { + diradd = jaddref->ja_diradd; + WORKLIST_INSERT(&inodedep->id_bufwait, &diradd->da_list); + } else if (jaddref->ja_state & MKDIR_PARENT) { + mkdir = jaddref->ja_mkdir; + WORKLIST_INSERT(&inodedep->id_bufwait, &mkdir->md_list); + } else if (jaddref->ja_state & MKDIR_BODY) + mkdir = jaddref->ja_mkdir; + else + panic("handle_written_jaddref: Unknown dependency %p", + jaddref->ja_diradd); + jaddref->ja_diradd = NULL; /* also clears ja_mkdir */ + /* + * The mkdir may be waiting on the jaddref to clear before freeing. + */ + if (mkdir) { + KASSERT(mkdir->md_list.wk_type == D_MKDIR, + ("handle_written_jaddref: Incorrect type for mkdir %s", + TYPENAME(mkdir->md_list.wk_type))); + mkdir->md_jaddref = NULL; + diradd = mkdir->md_diradd; + mkdir->md_state |= DEPCOMPLETE; + complete_mkdir(mkdir); + } + WORKLIST_INSERT(&diradd->da_jwork, &jsegdep->jd_list); + if (jaddref->ja_state & NEWBLOCK) { + LIST_REMOVE(jaddref, ja_inodeps); + jaddref->ja_state &= ~ONDEPLIST; + inodedep->id_state |= ONDEPLIST; + LIST_INSERT_HEAD(&inodedep->id_bmsafemap->sm_inodedephd, + inodedep, id_deps); + } + free_jaddref(jaddref); +} + +/* + * Called once a jnewblk journal is written. The allocdirect or allocindir + * is placed in the bmsafemap to await notification of a written bitmap. + */ +static void +handle_written_jnewblk(jnewblk, jsegdep) + struct jnewblk *jnewblk; + struct jsegdep *jsegdep; +{ + struct bmsafemap *bmsafemap; + struct allocdirect *adp; + struct allocindir *aip; + + if (jnewblk->jn_dep == NULL) + panic("handle_written_jnewblk: No dependency for the segdep."); + jsegdep->jd_type = jnewblk->jn_dep->wk_type; + if (jnewblk->jn_dep->wk_type == D_ALLOCDIRECT) { + adp = WK_ALLOCDIRECT(jnewblk->jn_dep); + adp->ad_jnewblk = NULL; + WORKLIST_INSERT(&adp->ad_jwork, &jsegdep->jd_list); + bmsafemap = adp->ad_bmsafemap; + adp->ad_state |= ONDEPLIST; + LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps); + } else if (jnewblk->jn_dep->wk_type == D_ALLOCINDIR) { + aip = WK_ALLOCINDIR(jnewblk->jn_dep); + aip->ai_jnewblk = NULL; + WORKLIST_INSERT(&aip->ai_jwork, &jsegdep->jd_list); + bmsafemap = aip->ai_bmsafemap; + aip->ai_state |= ONDEPLIST; + LIST_INSERT_HEAD(&bmsafemap->sm_allocindirhd, aip, ai_deps); + } else + panic("handle_written_jnewblk: Unexpected type %s", + TYPENAME(jnewblk->jn_dep->wk_type)); + jnewblk->jn_dep = NULL; + free_jnewblk(jnewblk); +} + +static void +cancel_jfreefrag(jfreefrag) + struct jfreefrag *jfreefrag; +{ + struct freefrag *freefrag; + + freefrag = jfreefrag->fr_freefrag; + jfreefrag->fr_freefrag = NULL; + freefrag->ff_jfreefrag = NULL; + free_jfreefrag(jfreefrag); + freefrag->ff_state |= DEPCOMPLETE; +} + +/* + * Free a jfreefrag when the parent freefrag is rendered obsolete. + */ +static void +free_jfreefrag(jfreefrag) + struct jfreefrag *jfreefrag; +{ + + if (jfreefrag->fr_state & IOSTARTED) + WORKLIST_REMOVE(&jfreefrag->fr_list); + else if (jfreefrag->fr_state & ONWORKLIST) + remove_from_journal(&jfreefrag->fr_list); + if (jfreefrag->fr_freefrag != NULL) + panic("free_jfreefrag: Still attached to a freefrag."); + WORKITEM_FREE(jfreefrag, D_JFREEFRAG); +} + +/* + * Called when the journal write for a jfreefrag completes. The parent + * freefrag is added to the worklist if this completes its dependencies. + */ +static void +handle_written_jfreefrag(jfreefrag, jsegdep) + struct jfreefrag *jfreefrag; + struct jsegdep *jsegdep; +{ + struct freefrag *freefrag; + + freefrag = jfreefrag->fr_freefrag; + if (freefrag == NULL) + panic("handle_written_jfreefrag: No freefrag."); + freefrag->ff_state |= DEPCOMPLETE; + freefrag->ff_jfreefrag = NULL; + WORKLIST_INSERT(&freefrag->ff_jwork, &jsegdep->jd_list); + if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) + add_to_worklist(&freefrag->ff_list); + jfreefrag->fr_freefrag = NULL; + free_jfreefrag(jfreefrag); +} + +/* + * Called when the journal write for a jfreeblk completes. The jfreeblk + * is removed from the freeblks list of pending journal writes and the + * jsegdep is moved to the freeblks jwork to be completed when all blocks + * have been reclaimed. + */ +static void +handle_written_jfreeblk(jfreeblk, jsegdep) + struct jfreeblk *jfreeblk; + struct jsegdep *jsegdep; +{ + struct freeblks *freeblks; + + freeblks = jfreeblk->jf_freeblks; + LIST_REMOVE(jfreeblk, jf_deps); + WORKLIST_INSERT(&freeblks->fb_jwork, &jsegdep->jd_list); + + /* + * 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); + add_to_worklist(&freeblks->fb_list); + } + + free_jfreeblk(jfreeblk); +} + +/* + * Allocate a new jremref that tracks the removal of ip from dp with the + * directory entry offset of diroff. Mark the entry as ATTACHED and + * DEPCOMPLETE as we have all the information required for the journal write + * and the directory has already been removed from the buffer. The caller + * is responsible for linking the jremref into the pagedep and adding it + * to the journal to write. The MKDIR_PARENT flag is set if we're doing + * a DOTDOT addition so handle_workitem_remove() can properly assign + * the jsegdep when we're done. + */ +static struct jremref * +newjremref(dirrem, dp, ip, diroff) + struct dirrem *dirrem; + struct inode *dp; + struct inode *ip; + off_t diroff; +{ + struct jremref *jremref; + + jremref = malloc(sizeof(*jremref), M_JREMREF, M_SOFTDEP_FLAGS); + workitem_alloc(&jremref->jr_list, D_JREMREF, UFSTOVFS(dp->i_ump)); + jremref->jr_state = ATTACHED | DEPCOMPLETE; + jremref->jr_dirrem = dirrem; + jremref->jr_diroff = diroff; + jremref->jr_ino = ip->i_number; + jremref->jr_parent = dp->i_number; + jremref->jr_mode = ip->i_mode; + jremref->jr_nlink = ip->i_nlink; + + return (jremref); +} + +/* + * Allocate a new jaddref to track the addition of ino to dp at diroff. The + * directory offset may not be known until later. The caller is responsible + * adding the entry to the journal when this information is available. nlink + * should be the link count prior to the addition and mode is only required + * to have the correct FMT. + */ +static struct jaddref * +newjaddref(dp, ino, diroff, nlink, mode) + struct inode *dp; + ino_t ino; + off_t diroff; + int16_t nlink; + uint16_t mode; +{ + struct jaddref *jaddref; + + jaddref = malloc(sizeof(*jaddref), M_JADDREF, M_SOFTDEP_FLAGS); + workitem_alloc(&jaddref->ja_list, D_JADDREF, UFSTOVFS(dp->i_ump)); + jaddref->ja_mkdir = NULL; + jaddref->ja_state = ATTACHED | DEPCOMPLETE | ONDEPLIST; + jaddref->ja_diroff = diroff; + jaddref->ja_ino = ino; + jaddref->ja_parent = dp->i_number; + jaddref->ja_mode = mode; + jaddref->ja_nlink = nlink; + + return (jaddref); +} + +/* + * Create a new free dependency for a freework. The caller is responsible + * for adjusting the reference count when it has the lock held. The freedep + * will track an outstanding bitmap write that will ultimately clear the + * freework to continue. + */ +static struct freedep * +newfreedep(struct freework *freework) +{ + struct freedep *freedep; + + freedep = malloc(sizeof(*freedep), M_FREEDEP, M_SOFTDEP_FLAGS); + workitem_alloc(&freedep->fd_list, D_FREEDEP, freework->fw_list.wk_mp); + freedep->fd_freework = freework; + + return (freedep); +} + +/* + * Free a freedep structure once the buffer it is linked to is written. If + * this is the last reference to the freework schedule it for completion. + */ +static void +free_freedep(freedep) + struct freedep *freedep; +{ + + if (--freedep->fd_freework->fw_ref == 0) + add_to_worklist(&freedep->fd_freework->fw_list); + WORKITEM_FREE(freedep, D_FREEDEP); +} + +/* + * Allocate a new freework structure that may be a level in an indirect + * when parent is not NULL or a top level block when it is. The top level + * freework structures are allocated without lk held and before the freeblks + * is visible outside of softdep_setup_freeblocks(). + */ +static struct freework * +newfreework(freeblks, parent, lbn, nb, frags, journal) + struct freeblks *freeblks; + struct freework *parent; + ufs_lbn_t lbn; + ufs2_daddr_t nb; + int frags; + int journal; +{ + 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_freeblks = freeblks; + freework->fw_parent = parent; + freework->fw_lbn = lbn; + freework->fw_blkno = nb; + freework->fw_frags = frags; + freework->fw_ref = 0; + LIST_INIT(&freework->fw_jwork); + + if (parent == NULL) { + WORKLIST_INSERT_UNLOCKED(&freeblks->fb_freeworkhd, + &freework->fw_list); + freeblks->fb_ref++; + } + if (journal) + newjfreeblk(freeblks, lbn, nb, frags); + + return (freework); +} + +/* + * 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) + struct freeblks *freeblks; + ufs_lbn_t lbn; + ufs2_daddr_t blkno; + int frags; +{ + struct jfreeblk *jfreeblk; + + jfreeblk = malloc(sizeof(*jfreeblk), M_JFREEBLK, M_SOFTDEP_FLAGS); + workitem_alloc(&jfreeblk->jf_list, D_JFREEBLK, freeblks->fb_list.wk_mp); + jfreeblk->jf_state = ATTACHED | DEPCOMPLETE; + jfreeblk->jf_ino = freeblks->fb_previousinum; + jfreeblk->jf_lbn = lbn; + jfreeblk->jf_blkno = blkno; + jfreeblk->jf_frags = frags; + jfreeblk->jf_freeblks = freeblks; + LIST_INSERT_HEAD(&freeblks->fb_jfreeblkhd, jfreeblk, jf_deps); + + return (jfreeblk); +} + +/* + * Cancel a jaddref either before it has been written or while it is being + * written. This happens when a link is removed before the add reaches + * the disk. The jaddref dependency is kept linked into the bmsafemap + * and inode to prevent the link count or bitmap from reaching the disk + * until handle_workitem_remove() re-adjusts the counts and bitmaps as + * required. + */ +static void +cancel_jaddref(jaddref, inodedep, wkhd) + struct jaddref *jaddref; + struct inodedep *inodedep; + struct workhead *wkhd; +{ + struct jaddref *jaddrefn; + + /* + * If we're canceling a new bitmap we have to search for another ref + * to move into the bmsafemap dep. This might be better expressed + * with another structure. + */ + if (jaddref->ja_state & NEWBLOCK && inodedep != NULL) { + LIST_FOREACH(jaddrefn, &inodedep->id_jaddrefhd, ja_inodeps) { + if (jaddrefn == jaddref) + continue; + if ((jaddrefn->ja_state & GOINGAWAY) != 0) + continue; + jaddrefn->ja_state &= ~(ATTACHED | UNDONE); + jaddrefn->ja_state |= + jaddref->ja_state & (ATTACHED | UNDONE | NEWBLOCK); + jaddref->ja_state &= ~(ATTACHED | UNDONE | NEWBLOCK); + jaddref->ja_state |= ATTACHED; + LIST_REMOVE(jaddref, ja_bmdeps); + LIST_INSERT_HEAD(&inodedep->id_bmsafemap->sm_jaddrefhd, + jaddrefn, ja_bmdeps); + } + } + if (jaddref->ja_state & IOWAITING) { + jaddref->ja_state &= ~IOWAITING; + wakeup(&jaddref->ja_list); + } + jaddref->ja_state |= GOINGAWAY; + jaddref->ja_mkdir = NULL; + if (jaddref->ja_state & IOSTARTED) { + jaddref->ja_state &= ~IOSTARTED; + WORKLIST_REMOVE(&jaddref->ja_list); + } else + remove_from_journal(&jaddref->ja_list); + if (wkhd == NULL) + return; + /* + * Leave the head of the list for jsegdeps for fast merging. + */ + if (LIST_FIRST(wkhd) != NULL) { + jaddref->ja_state |= ONWORKLIST; + LIST_INSERT_AFTER(LIST_FIRST(wkhd), &jaddref->ja_list, wk_list); + } else + WORKLIST_INSERT(wkhd, &jaddref->ja_list); +} + +/* + * Attempt to free a jaddref structure when some work completes. This + * should only succeed once the entry is written and all dependencies have + * been notified. + */ +static void +free_jaddref(jaddref) + struct jaddref *jaddref; +{ + + if ((jaddref->ja_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + if (jaddref->ja_state & NEWBLOCK) + LIST_REMOVE(jaddref, ja_bmdeps); + if (jaddref->ja_state & ONDEPLIST) + LIST_REMOVE(jaddref, ja_inodeps); + if (jaddref->ja_state & (IOSTARTED | ONWORKLIST)) + panic("free_jaddref: Bad state %p(0x%X)", + jaddref, jaddref->ja_state); + if (jaddref->ja_mkdir != NULL) + panic("free_jaddref: Work pending, 0x%X\n", jaddref->ja_state); + WORKITEM_FREE(jaddref, D_JADDREF); +} + +/* + * Free a jremref structure once all dependencies are complete. + */ +static void +free_jremref(jremref) + struct jremref *jremref; +{ + + if ((jremref->jr_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + /* If we were never written remove ourselves from the worklist. */ + if (jremref->jr_state & IOSTARTED) + panic("free_jremref: IO still pending"); + WORKITEM_FREE(jremref, D_JREMREF); +} + +/* + * Free a jnewblk structure. + */ +static void +free_jnewblk(jnewblk) + struct jnewblk *jnewblk; +{ + + if ((jnewblk->jn_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + LIST_REMOVE(jnewblk, jn_deps); + if (jnewblk->jn_dep != NULL) + panic("free_jnewblk: Dependency still attached."); + WORKITEM_FREE(jnewblk, D_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. + */ +static void +cancel_jnewblk(jnewblk, wkhd) + struct jnewblk *jnewblk; + struct workhead *wkhd; +{ + + if (jnewblk->jn_state & IOWAITING) { + jnewblk->jn_state &= ~IOWAITING; + wakeup(&jnewblk->jn_list); + } + jnewblk->jn_dep = NULL; + jnewblk->jn_state |= GOINGAWAY; + if (jnewblk->jn_state & IOSTARTED) { + jnewblk->jn_state &= ~IOSTARTED; + WORKLIST_REMOVE(&jnewblk->jn_list); + } else + remove_from_journal(&jnewblk->jn_list); + /* + * Leave the head of the list for jsegdeps for fast merging. + */ + if (LIST_FIRST(wkhd) != NULL) { + jnewblk->jn_state |= ONWORKLIST; + LIST_INSERT_AFTER(LIST_FIRST(wkhd), &jnewblk->jn_list, wk_list); + } else + WORKLIST_INSERT(wkhd, &jnewblk->jn_list); +} + +static void +free_jfreeblk(jfreeblk) + struct jfreeblk *jfreeblk; +{ + + WORKITEM_FREE(jfreeblk, D_JFREEBLK); +} + +/* + * Release one reference to a jseg and free it if the count reaches 0. This + * should eventually reclaim journal space as well. + */ +static void +free_jseg(jseg) + struct jseg *jseg; +{ + struct jblocks *jblocks; + struct jsegdep *jsegdep; + + + KASSERT(jseg->js_refs > 0, + ("free_jseg: Invalid refcnt %d", jseg->js_refs)); + if (--jseg->js_refs != 0) + return; +#ifdef DEBUG + { + int errors; + int i; + errors = 0; + for (i = 0; i < jseg->js_cnt; i++) { + jsegdep = &jseg->js_deps[i]; + if (jsegdep->jd_state != 0) { + printf("free_jseg: %p(0x%X) allocated " + "to %s:%d\n", jsegdep, jsegdep->jd_state, + TYPENAME(jsegdep->jd_type), + jsegdep->jd_line); + errors = 1; + } + } + if (errors) + panic("errors"); + } +#endif + jblocks = jseg->js_jblocks; + /* + * Free only those jsegs which have none allocated before them to + * preserve the journal space ordering. + */ + while ((jseg = TAILQ_FIRST(&jblocks->jb_segs)) != NULL) { + jblocks->jb_oldestseq = jseg->js_seq; + if (jseg->js_refs != 0) + break; + TAILQ_REMOVE(&jblocks->jb_segs, jseg, js_next); + jblocks_free(jblocks, jseg->js_size); + KASSERT(LIST_EMPTY(&jseg->js_entries), + ("free_jseg: Freed jseg has valid entries.")); + WORKITEM_FREE(jseg, D_JSEG); + } +} + +/* + * Release a jsegdep and decrement the jseg count. + */ +static void +free_jsegdep(jsegdep) + struct jsegdep *jsegdep; +{ + +#ifdef DEBUG + if (jsegdep->jd_state != ATTACHED) + panic("free_jsegdep: Illegal state 0x%X.", jsegdep->jd_state); + jsegdep->jd_state &= ~ATTACHED; +#endif + free_jseg(jsegdep->jd_seg); +} + +/* + * Wait for a journal item to make it to disk. Initiate journal processing + * if required. + */ +static void +jwait(wk) + struct worklist *wk; +{ + + /* + * If IO has not started we process the journal. We can't mark the + * worklist item as IOWAITING because we drop the lock while + * processing the journal and the worklist entry may be freed after + * this point. The caller may call back in and re-issue the request. + */ + if ((wk->wk_state & IOSTARTED) == 0) { + softdep_process_journal(wk->wk_mp, MNT_WAIT); + return; + } + wk->wk_state |= IOWAITING; + msleep(wk, &lk, PRIBIO, "jwait", 0); +} + +/* + * Lookup an inodedep based on an inode pointer and set the nlinkdelta as + * appropriate. This is a convenience function to reduce duplicate code + * for the setup and revert functions below. + */ +static struct inodedep * +inodedep_lookup_ip(ip) + struct inode *ip; +{ + struct inodedep *inodedep; + + KASSERT(ip->i_nlink >= ip->i_effnlink, + ("inodedep_lookup_ip: bad delta")); + (void) inodedep_lookup(UFSTOVFS(ip->i_ump), ip->i_number, + DEPALLOC, &inodedep); + inodedep->id_nlinkdelta = ip->i_nlink - ip->i_effnlink; + + return (inodedep); +} + +/* + * 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 + * nlinkdelta. + */ +void +softdep_setup_create(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + KASSERT(ip->i_nlink == 1, + ("softdep_setup_create: Invalid link count.")); + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(ip); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + KASSERT(jaddref != NULL && + jaddref->ja_parent == dp->i_number && jaddref->ja_nlink == 0, + ("softdep_setup_create: No addref structure present.")); + jaddref->ja_mode = ip->i_mode; + FREE_LOCK(&lk); +} + +/* + * Create a jaddref structure to track the addition of a DOTDOT link when + * we are reparenting an inode as part of a rename. This jaddref will be + * found by softdep_setup_directory_change. + */ +void +softdep_setup_dotdot_link(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + /* + * We don't set MKDIR_PARENT as this is not tied to a mkdir and + * is used as a normal link would be. + */ + jaddref = newjaddref(ip, dp->i_number, DOTDOT_OFFSET, dp->i_nlink - 1, + dp->i_mode); + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(dp); + LIST_INSERT_HEAD(&inodedep->id_jaddrefhd, jaddref, ja_inodeps); + FREE_LOCK(&lk); +} + +/* + * Create a jaddref structure to track a new link to an inode. The directory + * offset is not known until softdep_setup_directory_add or + * softdep_setup_directory_change. + */ +void +softdep_setup_link(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + jaddref = newjaddref(dp, ip->i_number, 0, ip->i_nlink - 1, ip->i_mode); + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(ip); + LIST_INSERT_HEAD(&inodedep->id_jaddrefhd, jaddref, ja_inodeps); + FREE_LOCK(&lk); +} + +/* + * Called to create the jaddref structures to track . and .. references as + * well as lookup and further initialize the incomplete jaddref created + * by softdep_setup_inomapdep when the inode was allocated.A + */ +void +softdep_setup_mkdir(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *dotdotaddref; + struct jaddref *dotaddref; + struct jaddref *jaddref; + + dotaddref = newjaddref(ip, ip->i_number, DOT_OFFSET, 1, ip->i_mode); + dotaddref->ja_state |= MKDIR_BODY; + dotdotaddref = newjaddref(ip, dp->i_number, DOTDOT_OFFSET, + dp->i_nlink - 1, dp->i_mode); + dotdotaddref->ja_state |= MKDIR_PARENT; + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(ip); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + KASSERT(jaddref != NULL, + ("softdep_setup_mkdir: No addref structure present.")); + KASSERT(jaddref->ja_parent == dp->i_number && jaddref->ja_nlink == 0, + ("softdep_setup_mkdir: bad parent/link %d/%d", + jaddref->ja_parent, jaddref->ja_nlink)); + jaddref->ja_mode = ip->i_mode; + LIST_INSERT_AFTER(jaddref, dotaddref, ja_inodeps); + inodedep = inodedep_lookup_ip(dp); + LIST_INSERT_HEAD(&inodedep->id_jaddrefhd, dotdotaddref, ja_inodeps); + FREE_LOCK(&lk); +} + +/* + * Called to track nlinkdelta of the inode and parent directories prior to + * unlinking a directory. + */ +void +softdep_setup_rmdir(dp, ip) + struct inode *dp; + struct inode *ip; +{ + + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup_ip(ip); + (void) inodedep_lookup_ip(dp); + FREE_LOCK(&lk); +} + +/* + * Called to track nlinkdelta of the inode and parent directories prior to + * unlink. + */ +void +softdep_setup_unlink(dp, ip) + struct inode *dp; + struct inode *ip; +{ + + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup_ip(ip); + (void) inodedep_lookup_ip(dp); + FREE_LOCK(&lk); +} + +/* + * Called to release the journal structures created by a failed non-directory + * creation. + */ +void +softdep_revert_create(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(ip); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == dp->i_number, + ("softdep_revert_create: addref parent mismatch")); + free_jaddref(jaddref); + FREE_LOCK(&lk); +} + +/* + * Called to release the journal structures created by a failed dotdot link + * creation. + */ +void +softdep_revert_dotdot_link(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(dp); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == ip->i_number, + ("softdep_revert_dotdot_link: addref parent mismatch")); + free_jaddref(jaddref); + FREE_LOCK(&lk); +} + +/* + * Called to release the journal structures created by a failed link + * addition. + */ +void +softdep_revert_link(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(ip); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == dp->i_number, + ("softdep_revert_link: addref parent mismatch")); + free_jaddref(jaddref); + FREE_LOCK(&lk); +} + +/* + * Called to release the journal structures created by a failed mkdir + * attempt. + */ +void +softdep_revert_mkdir(dp, ip) + struct inode *dp; + struct inode *ip; +{ + struct inodedep *inodedep; + struct jaddref *jaddref; + + ACQUIRE_LOCK(&lk); + inodedep = inodedep_lookup_ip(dp); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == ip->i_number, + ("softdep_revert_mkdir: dotdot addref parent mismatch")); + free_jaddref(jaddref); + inodedep = inodedep_lookup_ip(ip); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == dp->i_number, + ("softdep_revert_mkdir: addref parent mismatch")); + free_jaddref(jaddref); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + jaddref->ja_state |= COMPLETE | DEPCOMPLETE; + KASSERT(jaddref->ja_parent == ip->i_number, + ("softdep_revert_mkdir: dot addref parent mismatch")); + free_jaddref(jaddref); + FREE_LOCK(&lk); +} + +/* + * Called to correct nlinkdelta after a failed rmdir. + */ +void +softdep_revert_rmdir(dp, ip) + struct inode *dp; + struct inode *ip; +{ + + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup_ip(ip); + (void) inodedep_lookup_ip(dp); + FREE_LOCK(&lk); +} + +/* * Protecting the freemaps (or bitmaps). * * To eliminate the need to execute fsck before mounting a filesystem @@ -1536,8 +3274,16 @@ softdep_setup_inomapdep(bp, ip, newinum) { struct inodedep *inodedep; struct bmsafemap *bmsafemap; + struct jaddref *jaddref; /* + * Allocate the journal reference add structure so that the bitmap + * can be dependent on it. + */ + jaddref = newjaddref(ip, newinum, 0, 0, 0); + jaddref->ja_state |= NEWBLOCK; + + /* * Create a dependency for the newly allocated inode. * Panic if it already exists as something is seriously wrong. * Otherwise add it to the dependency list for the buffer holding @@ -1546,12 +3292,14 @@ softdep_setup_inomapdep(bp, ip, newinum) ACQUIRE_LOCK(&lk); if ((inodedep_lookup(UFSTOVFS(ip->i_ump), newinum, DEPALLOC|NODELAY, &inodedep))) - panic("softdep_setup_inomapdep: dependency for new inode " - "already exists"); - inodedep->id_buf = bp; + panic("softdep_setup_inomapdep: dependency %p for new" + "inode already exists", inodedep); + bmsafemap = bmsafemap_lookup(UFSTOVFS(ip->i_ump), bp, + ino_to_cg(ip->i_ump->um_fs, newinum)); + LIST_INSERT_HEAD(&bmsafemap->sm_jaddrefhd, jaddref, ja_bmdeps); + inodedep->id_bmsafemap = bmsafemap; inodedep->id_state &= ~DEPCOMPLETE; - bmsafemap = bmsafemap_lookup(inodedep->id_list.wk_mp, bp); - LIST_INSERT_HEAD(&bmsafemap->sm_inodedephd, inodedep, id_deps); + LIST_INSERT_HEAD(&inodedep->id_jaddrefhd, jaddref, ja_inodeps); FREE_LOCK(&lk); } @@ -1560,13 +3308,16 @@ softdep_setup_inomapdep(bp, ip, newinum) * allocate block or fragment. */ void -softdep_setup_blkmapdep(bp, mp, newblkno) +softdep_setup_blkmapdep(bp, mp, newblkno, frags, oldfrags) struct buf *bp; /* buffer for cylgroup block with block map */ struct mount *mp; /* filesystem doing allocation */ ufs2_daddr_t newblkno; /* number of newly allocated block */ + int frags; /* Number of fragments. */ + int oldfrags; /* Previous number of fragments for extend. */ { struct newblk *newblk; struct bmsafemap *bmsafemap; + struct jnewblk *jnewblk; struct fs *fs; fs = VFSTOUFS(mp)->um_fs; @@ -1575,14 +3326,70 @@ void * Add it to the dependency list for the buffer holding * the cylinder group map from which it was allocated. */ + jnewblk = malloc(sizeof(*jnewblk), M_JNEWBLK, M_SOFTDEP_FLAGS); + workitem_alloc(&jnewblk->jn_list, D_JNEWBLK, mp); + jnewblk->jn_state = ATTACHED; + jnewblk->jn_dep = NULL; + jnewblk->jn_blkno = newblkno; + jnewblk->jn_frags = frags; + jnewblk->jn_oldfrags = oldfrags; +#ifdef DEBUG + { + struct cg *cgp; + uint8_t *blksfree; + long bno; + int i; + + cgp = (struct cg *)bp->b_data; + blksfree = cg_blksfree(cgp); + bno = dtogd(fs, jnewblk->jn_blkno); + for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; i++) { + if (isset(blksfree, bno + i)) + panic("softdep_setup_blkmapdep: " + "free fragment %d from %d-%d " + "state 0x%X dep %p", i, + jnewblk->jn_oldfrags, + jnewblk->jn_frags, + jnewblk->jn_state, + jnewblk->jn_dep); + } + } +#endif ACQUIRE_LOCK(&lk); if (newblk_lookup(fs, newblkno, DEPALLOC, &newblk) != 0) panic("softdep_setup_blkmapdep: found block"); - newblk->nb_bmsafemap = bmsafemap = bmsafemap_lookup(mp, bp); - LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk, nb_deps); + newblk->nb_bmsafemap = bmsafemap = bmsafemap_lookup(mp, bp, + dtog(fs, newblkno)); + jnewblk->jn_newblk = newblk; + newblk->nb_jnewblk = jnewblk; + LIST_INSERT_HEAD(&bmsafemap->sm_jnewblkhd, jnewblk, jn_deps); FREE_LOCK(&lk); } +#define BMSAFEMAP_HASH(fs, cg) \ + (&bmsafemap_hashtbl[((((register_t)(fs)) >> 13) + (cg)) & bmsafemap_hash]) + +static int +bmsafemap_find(bmsafemaphd, mp, cg, bmsafemapp) + struct bmsafemap_hashhead *bmsafemaphd; + struct mount *mp; + int cg; + struct bmsafemap **bmsafemapp; +{ + struct bmsafemap *bmsafemap; + + LIST_FOREACH(bmsafemap, bmsafemaphd, sm_hash) + if (bmsafemap->sm_list.wk_mp == mp && bmsafemap->sm_cg == cg) + break; + if (bmsafemap) { + *bmsafemapp = bmsafemap; + return (1); + } + *bmsafemapp = NULL; + + return (0); +} + /* * Find the bmsafemap associated with a cylinder group buffer. * If none exists, create one. The buffer must be locked when @@ -1590,27 +3397,47 @@ void * splbio interrupts blocked. */ static struct bmsafemap * -bmsafemap_lookup(mp, bp) +bmsafemap_lookup(mp, bp, cg) struct mount *mp; struct buf *bp; + int cg; { - struct bmsafemap *bmsafemap; + struct bmsafemap_hashhead *bmsafemaphd; + struct bmsafemap *bmsafemap, *collision; struct worklist *wk; + struct fs *fs; mtx_assert(&lk, MA_OWNED); - LIST_FOREACH(wk, &bp->b_dep, wk_list) - if (wk->wk_type == D_BMSAFEMAP) - return (WK_BMSAFEMAP(wk)); + if (bp) + LIST_FOREACH(wk, &bp->b_dep, wk_list) + if (wk->wk_type == D_BMSAFEMAP) + return (WK_BMSAFEMAP(wk)); + fs = VFSTOUFS(mp)->um_fs; + bmsafemaphd = BMSAFEMAP_HASH(fs, cg); + if (bmsafemap_find(bmsafemaphd, mp, cg, &bmsafemap) == 1) + return (bmsafemap); FREE_LOCK(&lk); bmsafemap = malloc(sizeof(struct bmsafemap), M_BMSAFEMAP, M_SOFTDEP_FLAGS); workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp); bmsafemap->sm_buf = bp; LIST_INIT(&bmsafemap->sm_allocdirecthd); + LIST_INIT(&bmsafemap->sm_allocdirectwr); LIST_INIT(&bmsafemap->sm_allocindirhd); + LIST_INIT(&bmsafemap->sm_allocindirwr); LIST_INIT(&bmsafemap->sm_inodedephd); + LIST_INIT(&bmsafemap->sm_inodedepwr); LIST_INIT(&bmsafemap->sm_newblkhd); + LIST_INIT(&bmsafemap->sm_newblkwr); + LIST_INIT(&bmsafemap->sm_jaddrefhd); + LIST_INIT(&bmsafemap->sm_jnewblkhd); ACQUIRE_LOCK(&lk); + if (bmsafemap_find(bmsafemaphd, mp, cg, &collision) == 1) { + WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); + return (collision); + } + bmsafemap->sm_cg = cg; + LIST_INSERT_HEAD(bmsafemaphd, bmsafemap, sm_hash); WORKLIST_INSERT(&bp->b_dep, &bmsafemap->sm_list); return (bmsafemap); } @@ -1645,8 +3472,10 @@ static struct bmsafemap * * unreferenced fragments. */ void -softdep_setup_allocdirect(ip, lbn, newblkno, oldblkno, newsize, oldsize, bp) +softdep_setup_allocdirect(ip, off, lbn, newblkno, oldblkno, newsize, oldsize, + bp) struct inode *ip; /* inode to which block is being added */ + int off; /* Offset from start of di_db. */ ufs_lbn_t lbn; /* block pointer within inode */ ufs2_daddr_t newblkno; /* disk block number being added */ ufs2_daddr_t oldblkno; /* previous block number, 0 unless frag */ @@ -1657,8 +3486,10 @@ void struct allocdirect *adp, *oldadp; struct allocdirectlst *adphead; struct bmsafemap *bmsafemap; + struct freefrag *freefrag; struct inodedep *inodedep; struct pagedep *pagedep; + struct jnewblk *jnewblk; struct newblk *newblk; struct mount *mp; @@ -1666,20 +3497,23 @@ void adp = malloc(sizeof(struct allocdirect), M_ALLOCDIRECT, M_SOFTDEP_FLAGS|M_ZERO); workitem_alloc(&adp->ad_list, D_ALLOCDIRECT, mp); - adp->ad_lbn = lbn; + adp->ad_offset = off; adp->ad_newblkno = newblkno; adp->ad_oldblkno = oldblkno; adp->ad_newsize = newsize; adp->ad_oldsize = oldsize; adp->ad_state = ATTACHED; + LIST_INIT(&adp->ad_indirdeps); LIST_INIT(&adp->ad_newdirblk); + LIST_INIT(&adp->ad_jwork); + adp->ad_jnewblk = NULL; if (newblkno == oldblkno) adp->ad_freefrag = NULL; else - adp->ad_freefrag = newfreefrag(ip, oldblkno, oldsize); + adp->ad_freefrag = newfreefrag(ip, oldblkno, oldsize, lbn); ACQUIRE_LOCK(&lk); - if (lbn >= NDADDR) { + if (off >= NDADDR) { /* allocating an indirect block */ if (oldblkno != 0) panic("softdep_setup_allocdirect: non-zero indir"); @@ -1692,18 +3526,29 @@ void * deletions. */ if ((ip->i_mode & IFMT) == IFDIR && - pagedep_lookup(ip, lbn, DEPALLOC, &pagedep) == 0) + pagedep_lookup(mp, ip->i_number, off, DEPALLOC, + &pagedep) == 0) WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); } if (newblk_lookup(ip->i_fs, newblkno, 0, &newblk) == 0) panic("softdep_setup_allocdirect: lost block"); - if (newblk->nb_state == DEPCOMPLETE) { + if ((jnewblk = newblk->nb_jnewblk) != NULL) { + jnewblk->jn_dep = &adp->ad_list; + jnewblk->jn_ino = ip->i_number; + jnewblk->jn_lbn = lbn; + jnewblk->jn_state |= DEPCOMPLETE; + add_to_journal(&jnewblk->jn_list); + bmsafemap = newblk->nb_bmsafemap; + adp->ad_bmsafemap = bmsafemap; + adp->ad_jnewblk = jnewblk; + } else if (newblk->nb_state == DEPCOMPLETE) { adp->ad_state |= DEPCOMPLETE; - adp->ad_buf = NULL; + adp->ad_bmsafemap = NULL; } else { bmsafemap = newblk->nb_bmsafemap; - adp->ad_buf = bmsafemap->sm_buf; + adp->ad_bmsafemap = bmsafemap; LIST_REMOVE(newblk, nb_deps); + adp->ad_state |= ONDEPLIST; LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps); } LIST_REMOVE(newblk, nb_hash); @@ -1726,24 +3571,50 @@ void */ adphead = &inodedep->id_newinoupdt; oldadp = TAILQ_LAST(adphead, allocdirectlst); - if (oldadp == NULL || oldadp->ad_lbn <= lbn) { + if (oldadp == NULL || oldadp->ad_offset <= off) { /* insert at end of list */ TAILQ_INSERT_TAIL(adphead, adp, ad_next); - if (oldadp != NULL && oldadp->ad_lbn == lbn) + if (oldadp != NULL && oldadp->ad_offset == off) allocdirect_merge(adphead, adp, oldadp); - FREE_LOCK(&lk); - return; + goto out; } TAILQ_FOREACH(oldadp, adphead, ad_next) { - if (oldadp->ad_lbn >= lbn) + if (oldadp->ad_offset >= off) break; } if (oldadp == NULL) panic("softdep_setup_allocdirect: lost entry"); /* insert in middle of list */ TAILQ_INSERT_BEFORE(oldadp, adp, ad_next); - if (oldadp->ad_lbn == lbn) + if (oldadp->ad_offset == off) allocdirect_merge(adphead, adp, oldadp); +out: + /* + * If we have a freefrag and the inode has never been written we + * can simply free it here. Otherwise add the freefrag to the + * journal. + */ + if ((freefrag = adp->ad_freefrag) != NULL) { + struct jfreefrag *jfreefrag; + + jfreefrag = freefrag->ff_jfreefrag; +#if 0 + /* + * XXX We have to wait until we merge with the other inode + * list to see eliminate that dependency. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0) { + if (jfreefrag) + cancel_jfreefrag(jfreefrag); + /* XXX Could be handle_workitem_freefrag ? */ + add_to_worklist(&freefrag->ff_list); + adp->ad_oldblkno = 0; + adp->ad_freefrag = NULL; + } else +#endif + if (jfreefrag && (jfreefrag->fr_state & ONWORKLIST) == 0) + add_to_journal(&jfreefrag->fr_list); + } FREE_LOCK(&lk); } @@ -1761,10 +3632,11 @@ allocdirect_merge(adphead, newadp, oldadp) struct freefrag *freefrag; struct newdirblk *newdirblk; + freefrag = NULL; mtx_assert(&lk, MA_OWNED); if (newadp->ad_oldblkno != oldadp->ad_newblkno || newadp->ad_oldsize != oldadp->ad_newsize || - newadp->ad_lbn >= NDADDR) + newadp->ad_offset >= NDADDR) panic("%s %jd != new %jd || old size %ld != new %ld", "allocdirect_merge: old blkno", (intmax_t)newadp->ad_oldblkno, @@ -1788,8 +3660,8 @@ allocdirect_merge(adphead, newadp, oldadp) * the old dependency, so cannot legitimately be freed until the * conditions for the new dependency are fulfilled. */ + freefrag = newadp->ad_freefrag; if (oldadp->ad_freefrag != NULL || oldadp->ad_oldblkno == 0) { - freefrag = newadp->ad_freefrag; newadp->ad_freefrag = oldadp->ad_freefrag; oldadp->ad_freefrag = freefrag; } @@ -1804,18 +3676,66 @@ allocdirect_merge(adphead, newadp, oldadp) panic("allocdirect_merge: extra newdirblk"); WORKLIST_INSERT(&newadp->ad_newdirblk, &newdirblk->db_list); } - free_allocdirect(adphead, oldadp, 0); + TAILQ_REMOVE(adphead, oldadp, ad_next); + /* + * We need to move any journal dependencies over to the freefrag + * that releases this block if it exists. Otherwise we are + * extending an existing block and we'll wait until that is + * complete to release the journal space and extend the + * new journal to cover this old space as well. + */ + if (freefrag == NULL) { + struct jnewblk *jnewblk; + struct jnewblk *njnewblk; + + if (oldadp->ad_newblkno != newadp->ad_newblkno) + panic("allocdirect_merge: %jd != %jd", + oldadp->ad_newblkno, newadp->ad_newblkno); + jnewblk = oldadp->ad_jnewblk; + allocdirect_jwork(oldadp, &newadp->ad_jwork, D_ALLOCDIRECT); + free_allocdirect(oldadp); + /* + * We have an unwritten jnewblk, we need to merge the + * frag bits with our own. The newer adp's journal can not + * be written prior to the old one so no need to check for + * it here. + */ + if (jnewblk) { + njnewblk = newadp->ad_jnewblk; + if (jnewblk->jn_state & UNDONE) { + njnewblk->jn_state |= UNDONE | NEWBLOCK; + njnewblk->jn_state &= ~ATTACHED; + jnewblk->jn_state &= ~UNDONE; + } + njnewblk->jn_oldfrags = jnewblk->jn_oldfrags; + WORKLIST_REMOVE(&jnewblk->jn_list); + jnewblk->jn_state |= ATTACHED | COMPLETE; + free_jnewblk(jnewblk); + } + } else { + /* + * We can skip journaling for this freefrag and just complete + * any pending journal work for the allocdirect that is being + * removed after the freefrag completes. + */ + if (freefrag->ff_jfreefrag) + cancel_jfreefrag(freefrag->ff_jfreefrag); + allocdirect_jwork(oldadp, &freefrag->ff_jwork, D_FREEFRAG); + free_allocdirect(oldadp); + } } /* * Allocate a new freefrag structure if needed. */ static struct freefrag * -newfreefrag(ip, blkno, size) +newfreefrag(ip, blkno, size, lbn) struct inode *ip; ufs2_daddr_t blkno; long size; + ufs_lbn_t lbn; { + struct jfreefrag *jfreefrag; struct freefrag *freefrag; struct fs *fs; @@ -1825,11 +3745,26 @@ static struct freefrag * if (fragnum(fs, blkno) + numfrags(fs, size) > fs->fs_frag) panic("newfreefrag: frag size"); freefrag = malloc(sizeof(struct freefrag), - M_FREEFRAG, M_SOFTDEP_FLAGS); + M_FREEFRAG, M_SOFTDEP_FLAGS); workitem_alloc(&freefrag->ff_list, D_FREEFRAG, UFSTOVFS(ip->i_ump)); + freefrag->ff_state = ATTACHED; + LIST_INIT(&freefrag->ff_jwork); freefrag->ff_inum = ip->i_number; freefrag->ff_blkno = blkno; freefrag->ff_fragsize = size; + + jfreefrag = malloc(sizeof(struct jfreefrag), M_JFREEFRAG, + M_SOFTDEP_FLAGS); + workitem_alloc(&jfreefrag->fr_list, D_JFREEFRAG, UFSTOVFS(ip->i_ump)); + jfreefrag->fr_state = ATTACHED | DEPCOMPLETE; + jfreefrag->fr_ino = ip->i_number; + jfreefrag->fr_lbn = lbn; + jfreefrag->fr_blkno = blkno; + jfreefrag->fr_frags = numfrags(fs, size); + + freefrag->ff_jfreefrag = jfreefrag; + jfreefrag->fr_freefrag = freefrag; + return (freefrag); } @@ -1842,9 +3777,17 @@ handle_workitem_freefrag(freefrag) struct freefrag *freefrag; { struct ufsmount *ump = VFSTOUFS(freefrag->ff_list.wk_mp); + struct workhead wkhd; + /* + * It would be illegal to add new completion items to the + * freefrag after it was schedule to be done so it must be + * safe to modify the list head here. + */ + LIST_INIT(&wkhd); + LIST_SWAP(&freefrag->ff_jwork, &wkhd, worklist, wk_list); ffs_blkfree(ump, ump->um_fs, ump->um_devvp, freefrag->ff_blkno, - freefrag->ff_fragsize, freefrag->ff_inum); + freefrag->ff_fragsize, freefrag->ff_inum, &wkhd); ACQUIRE_LOCK(&lk); WORKITEM_FREE(freefrag, D_FREEFRAG); FREE_LOCK(&lk); @@ -1868,7 +3811,9 @@ softdep_setup_allocext(ip, lbn, newblkno, oldblkno struct allocdirect *adp, *oldadp; struct allocdirectlst *adphead; struct bmsafemap *bmsafemap; + struct freefrag *freefrag; struct inodedep *inodedep; + struct jnewblk *jnewblk; struct newblk *newblk; struct mount *mp; @@ -1876,17 +3821,20 @@ softdep_setup_allocext(ip, lbn, newblkno, oldblkno adp = malloc(sizeof(struct allocdirect), M_ALLOCDIRECT, M_SOFTDEP_FLAGS|M_ZERO); workitem_alloc(&adp->ad_list, D_ALLOCDIRECT, mp); - adp->ad_lbn = lbn; + adp->ad_offset = lbn; adp->ad_newblkno = newblkno; adp->ad_oldblkno = oldblkno; adp->ad_newsize = newsize; adp->ad_oldsize = oldsize; adp->ad_state = ATTACHED | EXTDATA; + LIST_INIT(&adp->ad_indirdeps); LIST_INIT(&adp->ad_newdirblk); + LIST_INIT(&adp->ad_jwork); + adp->ad_jnewblk = NULL; if (newblkno == oldblkno) adp->ad_freefrag = NULL; else - adp->ad_freefrag = newfreefrag(ip, oldblkno, oldsize); + adp->ad_freefrag = newfreefrag(ip, oldblkno, oldsize, -lbn); ACQUIRE_LOCK(&lk); if (newblk_lookup(ip->i_fs, newblkno, 0, &newblk) == 0) @@ -1895,13 +3843,24 @@ softdep_setup_allocext(ip, lbn, newblkno, oldblkno inodedep_lookup(mp, ip->i_number, DEPALLOC | NODELAY, &inodedep); adp->ad_inodedep = inodedep; - if (newblk->nb_state == DEPCOMPLETE) { + if ((jnewblk = newblk->nb_jnewblk) != NULL) { + jnewblk->jn_dep = &adp->ad_list; + jnewblk->jn_ino = ip->i_number; + jnewblk->jn_lbn = -1 - lbn; /* Negative lbns for ext. */ + jnewblk->jn_state |= DEPCOMPLETE; + add_to_journal(&jnewblk->jn_list); + bmsafemap = newblk->nb_bmsafemap; + adp->ad_bmsafemap = bmsafemap; + adp->ad_jnewblk = jnewblk; + /* XXX Only for the !journaling case. */ + } else if (newblk->nb_state == DEPCOMPLETE) { adp->ad_state |= DEPCOMPLETE; - adp->ad_buf = NULL; + adp->ad_bmsafemap = NULL; } else { bmsafemap = newblk->nb_bmsafemap; - adp->ad_buf = bmsafemap->sm_buf; + adp->ad_bmsafemap = bmsafemap; LIST_REMOVE(newblk, nb_deps); + adp->ad_state |= ONDEPLIST; LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps); } LIST_REMOVE(newblk, nb_hash); @@ -1925,24 +3884,50 @@ softdep_setup_allocext(ip, lbn, newblkno, oldblkno */ adphead = &inodedep->id_newextupdt; oldadp = TAILQ_LAST(adphead, allocdirectlst); - if (oldadp == NULL || oldadp->ad_lbn <= lbn) { + if (oldadp == NULL || oldadp->ad_offset <= lbn) { /* insert at end of list */ TAILQ_INSERT_TAIL(adphead, adp, ad_next); - if (oldadp != NULL && oldadp->ad_lbn == lbn) + if (oldadp != NULL && oldadp->ad_offset == lbn) allocdirect_merge(adphead, adp, oldadp); - FREE_LOCK(&lk); - return; + goto out; } TAILQ_FOREACH(oldadp, adphead, ad_next) { - if (oldadp->ad_lbn >= lbn) + if (oldadp->ad_offset >= lbn) break; } if (oldadp == NULL) panic("softdep_setup_allocext: lost entry"); /* insert in middle of list */ TAILQ_INSERT_BEFORE(oldadp, adp, ad_next); - if (oldadp->ad_lbn == lbn) + if (oldadp->ad_offset == lbn) allocdirect_merge(adphead, adp, oldadp); +out: + /* + * If we have a freefrag and the inode has never been written we + * can simply free it here. Otherwise add the freefrag to the + * journal. + */ + if ((freefrag = adp->ad_freefrag) != NULL) { + struct jfreefrag *jfreefrag; + + jfreefrag = freefrag->ff_jfreefrag; +#if 0 + /* + * XXX We have to wait until we merge with the other inode + * list to see eliminate that dependency. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0) { + if (jfreefrag) + cancel_jfreefrag(jfreefrag); + /* XXX Could be handle_workitem_freefrag ? */ + add_to_worklist(&freefrag->ff_list); + adp->ad_oldblkno = 0; + adp->ad_freefrag = NULL; + } else +#endif + if (jfreefrag && (jfreefrag->fr_state & ONWORKLIST) == 0) + add_to_journal(&jfreefrag->fr_list); + } FREE_LOCK(&lk); } @@ -1975,11 +3960,12 @@ softdep_setup_allocext(ip, lbn, newblkno, oldblkno * Allocate a new allocindir structure. */ static struct allocindir * -newallocindir(ip, ptrno, newblkno, oldblkno) +newallocindir(ip, ptrno, newblkno, oldblkno, lbn) struct inode *ip; /* inode for file being extended */ int ptrno; /* offset of pointer in indirect block */ ufs2_daddr_t newblkno; /* disk block number being added */ ufs2_daddr_t oldblkno; /* previous block number, 0 if none */ + ufs_lbn_t lbn; { struct allocindir *aip; @@ -1990,7 +3976,11 @@ static struct allocindir * aip->ai_offset = ptrno; aip->ai_newblkno = newblkno; aip->ai_oldblkno = oldblkno; - aip->ai_freefrag = newfreefrag(ip, oldblkno, ip->i_fs->fs_bsize); + aip->ai_freefrag = newfreefrag(ip, oldblkno, ip->i_fs->fs_bsize, lbn); + LIST_INIT(&aip->ai_indirdeps); + LIST_INIT(&aip->ai_newdirblk); + aip->ai_jnewblk = NULL; + LIST_INIT(&aip->ai_jwork); return (aip); } @@ -1999,31 +3989,36 @@ static struct allocindir * * to a newly allocated file page. */ void -softdep_setup_allocindir_page(ip, lbn, bp, ptrno, newblkno, oldblkno, nbp) +softdep_setup_allocindir_page(ip, bp, indir, lvl, lbn, newblkno, oldblkno, nbp) struct inode *ip; /* inode for file being extended */ - ufs_lbn_t lbn; /* allocated block number within file */ struct buf *bp; /* buffer with indirect blk referencing page */ - int ptrno; /* offset of pointer in indirect block */ + struct indir *indir; /* Indirect block path. */ + int lvl; /* Indirect block level for parent. */ + ufs_lbn_t lbn; /* Logical block number of this block. */ ufs2_daddr_t newblkno; /* disk block number being added */ ufs2_daddr_t oldblkno; /* previous block number, 0 if none */ struct buf *nbp; /* buffer holding allocated page */ { + struct inodedep *inodedep; struct allocindir *aip; struct pagedep *pagedep; + struct mount *mp; ASSERT_VOP_LOCKED(ITOV(ip), "softdep_setup_allocindir_page"); - aip = newallocindir(ip, ptrno, newblkno, oldblkno); + aip = newallocindir(ip, indir[lvl].in_off, newblkno, oldblkno, lbn); + mp = UFSTOVFS(ip->i_ump); ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); /* * If we are allocating a directory page, then we must * allocate an associated pagedep to track additions and * deletions. */ if ((ip->i_mode & IFMT) == IFDIR && - pagedep_lookup(ip, lbn, DEPALLOC, &pagedep) == 0) + 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_list); - setup_allocindir_phase2(bp, ip, aip); + setup_allocindir_phase2(bp, ip, inodedep, aip, lbn); FREE_LOCK(&lk); } @@ -2032,45 +4027,118 @@ void * newly allocated indirect block. */ void -softdep_setup_allocindir_meta(nbp, ip, bp, ptrno, newblkno) +softdep_setup_allocindir_meta(nbp, ip, bp, indir, lvl, newblkno) struct buf *nbp; /* newly allocated indirect block */ struct inode *ip; /* inode for file being extended */ struct buf *bp; /* indirect block referencing allocated block */ - int ptrno; /* offset of pointer in indirect block */ + struct indir *indir; /* Indirect block path. */ + int lvl; /* Indirect block level this block. */ ufs2_daddr_t newblkno; /* disk block number being added */ { + struct inodedep *inodedep; struct allocindir *aip; + ufs_lbn_t lbn; + lbn = indir[lvl].in_lbn; ASSERT_VOP_LOCKED(ITOV(ip), "softdep_setup_allocindir_meta"); - aip = newallocindir(ip, ptrno, newblkno, 0); + aip = newallocindir(ip, indir[lvl - 1].in_off, newblkno, 0, lbn); ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(UFSTOVFS(ip->i_ump), ip->i_number, DEPALLOC, + &inodedep); WORKLIST_INSERT(&nbp->b_dep, &aip->ai_list); - setup_allocindir_phase2(bp, ip, aip); + setup_allocindir_phase2(bp, ip, inodedep, aip, lbn); FREE_LOCK(&lk); } +static void +handle_workitem_indirdep(indirdep) + struct indirdep *indirdep; +{ + struct buf *sbp; + + sbp = indirdep->ir_savebp; + ACQUIRE_LOCK(&lk); + free_indirdep(indirdep); + FREE_LOCK(&lk); + sbp->b_flags |= B_INVAL | B_NOCACHE; + brelse(sbp); +} + +static void +indirdep_complete(indirdep) + struct indirdep *indirdep; +{ + struct allocindir *aip; + + LIST_REMOVE(indirdep, ir_next); + indirdep->ir_state &= ~ONDEPLIST; + + while ((aip = LIST_FIRST(&indirdep->ir_completehd)) != NULL) + free_allocindir(aip, NULL, NULL, 0); + if ((indirdep->ir_state & ATTACHED) && + LIST_EMPTY(&indirdep->ir_deplisthd) && + LIST_EMPTY(&indirdep->ir_donehd) && + LIST_EMPTY(&indirdep->ir_writehd)) { + if (indirdep->ir_state & ONWORKLIST) + WORKLIST_REMOVE(&indirdep->ir_list); + add_to_worklist(&indirdep->ir_list); + } +} + +static void +indirdep_attach(indirdep, bp) + struct indirdep *indirdep; + struct buf *bp; +{ + struct allocdirect *adp; + struct allocindir *aip; + struct worklist *wk; + + WORKLIST_INSERT(&bp->b_dep, &indirdep->ir_list); + + LIST_FOREACH(wk, &bp->b_dep, wk_list) { + if (wk->wk_type == D_ALLOCDIRECT) { + adp = WK_ALLOCDIRECT(wk); + indirdep->ir_state |= ONDEPLIST; + LIST_INSERT_HEAD(&adp->ad_indirdeps, indirdep, ir_next); + return; + } + if (wk->wk_type == D_ALLOCINDIR) { + aip = WK_ALLOCINDIR(wk); + indirdep->ir_state |= ONDEPLIST; + LIST_INSERT_HEAD(&aip->ai_indirdeps, indirdep, ir_next); + return; + } + } + indirdep->ir_state |= DEPCOMPLETE; + return; +} + /* * Called to finish the allocation of the "aip" allocated * by one of the two routines above. */ static void -setup_allocindir_phase2(bp, ip, aip) +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 worklist *wk; struct indirdep *indirdep, *newindirdep; struct bmsafemap *bmsafemap; struct allocindir *oldaip; struct freefrag *freefrag; + struct jnewblk *jnewblk; struct newblk *newblk; ufs2_daddr_t blkno; mtx_assert(&lk, MA_OWNED); if (bp->b_lblkno >= 0) panic("setup_allocindir_phase2: not indir blk"); - for (indirdep = NULL, newindirdep = NULL; ; ) { + for (freefrag = NULL, indirdep = NULL, newindirdep = NULL; ; ) { LIST_FOREACH(wk, &bp->b_dep, wk_list) { if (wk->wk_type != D_INDIRDEP) continue; @@ -2079,20 +4147,30 @@ static void } if (indirdep == NULL && newindirdep) { indirdep = newindirdep; - WORKLIST_INSERT(&bp->b_dep, &indirdep->ir_list); newindirdep = NULL; + indirdep_attach(indirdep, bp); } if (indirdep) { if (newblk_lookup(ip->i_fs, aip->ai_newblkno, 0, &newblk) == 0) panic("setup_allocindir: lost block"); - if (newblk->nb_state == DEPCOMPLETE) { + if ((jnewblk = newblk->nb_jnewblk) != NULL) { + jnewblk->jn_dep = &aip->ai_list; + jnewblk->jn_ino = ip->i_number; + jnewblk->jn_lbn = lbn; + jnewblk->jn_state |= DEPCOMPLETE; + add_to_journal(&jnewblk->jn_list); + bmsafemap = newblk->nb_bmsafemap; + aip->ai_bmsafemap = bmsafemap; + aip->ai_jnewblk = jnewblk; + } else if (newblk->nb_state == DEPCOMPLETE) { aip->ai_state |= DEPCOMPLETE; - aip->ai_buf = NULL; + aip->ai_bmsafemap = NULL; } else { bmsafemap = newblk->nb_bmsafemap; - aip->ai_buf = bmsafemap->sm_buf; + aip->ai_bmsafemap = bmsafemap; LIST_REMOVE(newblk, nb_deps); + aip->ai_state |= ONDEPLIST; LIST_INSERT_HEAD(&bmsafemap->sm_allocindirhd, aip, ai_deps); } @@ -2102,7 +4180,8 @@ static void /* * Check to see if there is an existing dependency * for this block. If there is, merge the old - * dependency into the new one. + * dependency into the new one. This happens + * as a result of reallocblk only. */ if (aip->ai_oldblkno == 0) oldaip = NULL; @@ -2111,17 +4190,18 @@ static void LIST_FOREACH(oldaip, &indirdep->ir_deplisthd, ai_next) if (oldaip->ai_offset == aip->ai_offset) break; - freefrag = NULL; - if (oldaip != NULL) { - if (oldaip->ai_newblkno != aip->ai_oldblkno) - panic("setup_allocindir_phase2: blkno"); - aip->ai_oldblkno = oldaip->ai_oldblkno; - freefrag = aip->ai_freefrag; - aip->ai_freefrag = oldaip->ai_freefrag; - oldaip->ai_freefrag = NULL; - free_allocindir(oldaip, NULL); - } + if (oldaip != NULL) + freefrag = allocindir_merge(aip, oldaip); + else if (aip->ai_freefrag) + add_to_journal( + &aip->ai_freefrag->ff_jfreefrag->fr_list); 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; @@ -2153,8 +4233,12 @@ static void newindirdep->ir_state = ATTACHED; if (ip->i_ump->um_fstype == UFS1) newindirdep->ir_state |= UFS1FMT; + 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); if (bp->b_blkno == bp->b_lblkno) { ufs_bmaparray(bp->b_vp, bp->b_lblkno, &blkno, bp, NULL, NULL); @@ -2168,6 +4252,33 @@ static void } } +static struct freefrag * +allocindir_merge(aip, oldaip) + struct allocindir *aip; + struct allocindir *oldaip; +{ + struct freefrag *freefrag; + + if (oldaip->ai_newblkno != aip->ai_oldblkno) + panic("allocindir_merge: blkno"); + aip->ai_oldblkno = oldaip->ai_oldblkno; + freefrag = aip->ai_freefrag; + aip->ai_freefrag = oldaip->ai_freefrag; + oldaip->ai_freefrag = NULL; + KASSERT(freefrag != NULL, ("setup_allocindir_phase2: No freefrag")); + KASSERT(LIST_EMPTY(&oldaip->ai_indirdeps), + ("setup_allocindir_phase2: Merged allocindir has children")); + /* + * We can skip journaling for this freefrag and just complete + * any pending journal work for the allocindir that is being + * removed after the freefrag completes. + */ + cancel_jfreefrag(freefrag->ff_jfreefrag); + free_allocindir(oldaip, NULL, &freefrag->ff_jwork, D_FREEFRAG); + + return (freefrag); +} + /* * Block de-allocation dependencies. * @@ -2206,6 +4317,7 @@ softdep_setup_freeblocks(ip, length, flags) struct freeblks *freeblks; struct inodedep *inodedep; struct allocdirect *adp; + struct jfreeblk *jfreeblk; struct bufobj *bo; struct vnode *vp; struct buf *bp; @@ -2213,6 +4325,13 @@ softdep_setup_freeblocks(ip, length, flags) ufs2_daddr_t extblocks, datablocks; struct mount *mp; int i, delay, error; + ufs2_daddr_t blkno; + ufs_lbn_t tmpval; + ufs_lbn_t lbn; + long oldextsize; + long oldsize; + int frags; + int needj; fs = ip->i_fs; mp = UFSTOVFS(ip->i_ump); @@ -2221,32 +4340,52 @@ softdep_setup_freeblocks(ip, length, flags) freeblks = malloc(sizeof(struct freeblks), M_FREEBLKS, M_SOFTDEP_FLAGS|M_ZERO); workitem_alloc(&freeblks->fb_list, D_FREEBLKS, mp); + LIST_INIT(&freeblks->fb_jfreeblkhd); + LIST_INIT(&freeblks->fb_jwork); freeblks->fb_state = ATTACHED; freeblks->fb_uid = ip->i_uid; freeblks->fb_previousinum = ip->i_number; freeblks->fb_devvp = ip->i_devvp; + freeblks->fb_chkcnt = 0; 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. + */ + (void) inodedep_lookup(mp, ip->i_number, DEPALLOC, &inodedep); + if ((inodedep->id_state & DEPCOMPLETE) == 0 && ip->i_nlink == 0) + needj = 0; + else + needj = 1; num_freeblkdep++; FREE_LOCK(&lk); extblocks = 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) { - freeblks->fb_oldsize = 0; - freeblks->fb_chkcnt = 0; - } else { - freeblks->fb_oldsize = ip->i_size; + if ((flags & IO_NORMAL) != 0) { + oldsize = ip->i_size; ip->i_size = 0; DIP_SET(ip, i_size, 0); freeblks->fb_chkcnt = datablocks; for (i = 0; i < NDADDR; i++) { - freeblks->fb_dblks[i] = DIP(ip, i_db[i]); + blkno = DIP(ip, i_db[i]); DIP_SET(ip, i_db[i], 0); + if (blkno == 0) + continue; + frags = sblksize(fs, oldsize, i); + frags = numfrags(fs, frags); + newfreework(freeblks, NULL, i, blkno, frags, needj); } - for (i = 0; i < NIADDR; i++) { - freeblks->fb_iblks[i] = DIP(ip, i_ib[i]); + for (i = 0, tmpval = NINDIR(fs), lbn = NDADDR; i < NIADDR; + i++, tmpval *= NINDIR(fs)) { + blkno = DIP(ip, i_ib[i]); DIP_SET(ip, i_ib[i], 0); + if (blkno) + newfreework(freeblks, NULL, -lbn - i, blkno, + fs->fs_frag, needj); + lbn += tmpval; } /* * If the file was removed, then the space being freed was @@ -2259,17 +4398,23 @@ softdep_setup_freeblocks(ip, length, flags) UFS_UNLOCK(ip->i_ump); } } - if ((flags & IO_EXT) == 0) { - freeblks->fb_oldextsize = 0; - } else { - freeblks->fb_oldextsize = ip->i_din2->di_extsize; + if ((flags & IO_EXT) != 0) { + oldextsize = ip->i_din2->di_extsize; ip->i_din2->di_extsize = 0; freeblks->fb_chkcnt += extblocks; for (i = 0; i < NXADDR; i++) { - freeblks->fb_eblks[i] = ip->i_din2->di_extb[i]; + blkno = ip->i_din2->di_extb[i]; ip->i_din2->di_extb[i] = 0; + if (blkno == 0) + continue; + frags = sblksize(fs, oldextsize, i); + frags = numfrags(fs, frags); + newfreework(freeblks, NULL, -1 - i, blkno, frags, + needj); } } + if (LIST_EMPTY(&freeblks->fb_jfreeblkhd)) + needj = 0; DIP_SET(ip, i_blocks, DIP(ip, i_blocks) - freeblks->fb_chkcnt); /* * Push the zero'ed inode to to its disk buffer so that we are free @@ -2304,7 +4449,9 @@ softdep_setup_freeblocks(ip, length, flags) */ delay = (inodedep->id_state & DEPCOMPLETE); if (delay) - WORKLIST_INSERT(&inodedep->id_bufwait, &freeblks->fb_list); + WORKLIST_INSERT(&bp->b_dep, &freeblks->fb_list); + else if (needj) + freeblks->fb_state |= DEPCOMPLETE | COMPLETE; /* * Because the file length has been truncated to zero, any * pending block allocation dependency structures associated @@ -2318,14 +4465,19 @@ softdep_setup_freeblocks(ip, length, flags) merge_inode_lists(&inodedep->id_newinoupdt, &inodedep->id_inoupdt); while ((adp = TAILQ_FIRST(&inodedep->id_inoupdt)) != 0) - free_allocdirect(&inodedep->id_inoupdt, adp, delay); + cancel_allocdirect(&inodedep->id_inoupdt, adp, + freeblks, delay); } if (flags & IO_EXT) { merge_inode_lists(&inodedep->id_newextupdt, &inodedep->id_extupdt); while ((adp = TAILQ_FIRST(&inodedep->id_extupdt)) != 0) - free_allocdirect(&inodedep->id_extupdt, adp, delay); + cancel_allocdirect(&inodedep->id_extupdt, adp, + freeblks, delay); } + LIST_FOREACH(jfreeblk, &freeblks->fb_jfreeblkhd, jf_deps) + add_to_journal(&jfreeblk->jf_list); + FREE_LOCK(&lk); bdwrite(bp); /* @@ -2349,9 +4501,9 @@ restart: BO_UNLOCK(bo); ACQUIRE_LOCK(&lk); (void) inodedep_lookup(mp, ip->i_number, 0, &inodedep); - deallocate_dependencies(bp, inodedep); + if (deallocate_dependencies(bp, inodedep, freeblks)) + bp->b_flags |= B_INVAL | B_NOCACHE; FREE_LOCK(&lk); - bp->b_flags |= B_INVAL | B_NOCACHE; brelse(bp); BO_LOCK(bo); goto restart; @@ -2361,7 +4513,7 @@ restart: if (inodedep_lookup(mp, ip->i_number, 0, &inodedep) != 0) (void) free_inodedep(inodedep); - if(delay) { + if (delay) { freeblks->fb_state |= DEPCOMPLETE; /* * If the inode with zeroed block pointers is now on disk @@ -2376,11 +4528,11 @@ restart: FREE_LOCK(&lk); /* - * 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 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 (!delay) + if (!delay && !needj) handle_workitem_freeblocks(freeblks, 0); } @@ -2389,19 +4541,22 @@ restart: * be reallocated to a new vnode. The buffer must be locked, thus, * no I/O completion operations can occur while we are manipulating * its associated dependencies. The mutex is held so that other I/O's - * associated with related dependencies do not occur. + * associated with related dependencies do not occur. Returns 1 if + * all dependencies were cleared, 0 otherwise. */ -static void -deallocate_dependencies(bp, inodedep) +static int +deallocate_dependencies(bp, inodedep, freeblks) struct buf *bp; struct inodedep *inodedep; + struct freeblks *freeblks; { struct worklist *wk; struct indirdep *indirdep; + struct newdirblk *newdirblk; struct allocindir *aip; struct pagedep *pagedep; + struct jremref *jremref; struct dirrem *dirrem; - struct diradd *dap; int i; mtx_assert(&lk, MA_OWNED); @@ -2424,15 +4579,15 @@ restart: * copy, allowing the safe copy to be freed and holding * on to the real copy for later use in indir_trunc. */ + if (bp->b_lblkno >= 0 || + bp->b_blkno != indirdep->ir_savebp->b_lblkno) + panic("deallocate_dependencies: not indir"); if (indirdep->ir_state & GOINGAWAY) panic("deallocate_dependencies: already gone"); indirdep->ir_state |= GOINGAWAY; VFSTOUFS(bp->b_vp->v_mount)->um_numindirdeps += 1; while ((aip = LIST_FIRST(&indirdep->ir_deplisthd)) != 0) - free_allocindir(aip, inodedep); - if (bp->b_lblkno >= 0 || - bp->b_blkno != indirdep->ir_savebp->b_lblkno) - panic("deallocate_dependencies: not indir"); + cancel_allocindir(aip, inodedep, freeblks); bcopy(bp->b_data, indirdep->ir_savebp->b_data, bp->b_bcount); WORKLIST_REMOVE(wk); @@ -2442,15 +4597,15 @@ restart: case D_PAGEDEP: pagedep = WK_PAGEDEP(wk); /* - * None of the directory additions will ever be - * visible, so they can simply be tossed. + * 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++) - while ((dap = - LIST_FIRST(&pagedep->pd_diraddhd[i]))) - free_diradd(dap); - while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != 0) - free_diradd(dap); + 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. @@ -2458,28 +4613,33 @@ restart: * can be dumped directly onto the work list. */ LIST_FOREACH(dirrem, &pagedep->pd_dirremhd, dm_next) { + /* + * 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) { + jwait(&jremref->jr_list); + return (0); + } LIST_REMOVE(dirrem, dm_next); dirrem->dm_dirinum = pagedep->pd_ino; if (inodedep == NULL || (inodedep->id_state & ALLCOMPLETE) == - ALLCOMPLETE) + ALLCOMPLETE) { + dirrem->dm_state |= COMPLETE; add_to_worklist(&dirrem->dm_list); - else + } else WORKLIST_INSERT(&inodedep->id_bufwait, &dirrem->dm_list); } if ((pagedep->pd_state & NEWBLOCK) != 0) { - LIST_FOREACH(wk, &inodedep->id_bufwait, wk_list) - if (wk->wk_type == D_NEWDIRBLK && - WK_NEWDIRBLK(wk)->db_pagedep == - pagedep) - break; - if (wk != NULL) { - WORKLIST_REMOVE(wk); - free_newdirblk(WK_NEWDIRBLK(wk)); - } else - panic("deallocate_dependencies: " - "lost pagedep"); + newdirblk = pagedep->pd_newdirblk; + WORKLIST_REMOVE(&newdirblk->db_list); + free_newdirblk(newdirblk); } WORKLIST_REMOVE(&pagedep->pd_list); LIST_REMOVE(pagedep, pd_hash); @@ -2487,7 +4647,8 @@ restart: continue; case D_ALLOCINDIR: - free_allocindir(WK_ALLOCINDIR(wk), inodedep); + aip = WK_ALLOCINDIR(wk); + cancel_allocindir(aip, inodedep, freeblks); continue; case D_ALLOCDIRECT: @@ -2502,45 +4663,126 @@ restart: /* NOTREACHED */ } } + + return (1); } /* - * Free an allocdirect. Generate a new freefrag work request if appropriate. - * This routine must be called with splbio interrupts blocked. + * An allocdirect is being canceled due to a truncate. We must make sure + * the journal entry is released in concert with the blkfree that releases + * the storage. Completed journal entries must not be released until the + * space is no longer pointed to by the inode or in the bitmap. */ static void -free_allocdirect(adphead, adp, delay) +cancel_allocdirect(adphead, adp, freeblks, delay) struct allocdirectlst *adphead; struct allocdirect *adp; + struct freeblks *freeblks; int delay; { + struct freework *freework; + struct indirdep *indirdep; + struct worklist *wk; + ufs_lbn_t lbn; + + TAILQ_REMOVE(adphead, adp, ad_next); + while ((indirdep = LIST_FIRST(&adp->ad_indirdeps)) != NULL) { + LIST_REMOVE(indirdep, ir_next); + indirdep->ir_state &= ~ONDEPLIST; + } + /* + * If the journal hasn't been written the jnewblk must be passed + * to the call to ffs_freeblk that reclaims the space. We accomplish + * this by linking the journal dependency into the freework to be + * freed when freework_freeblock() is called. If the journal has + * been written we can simply reclaim the journal space when the + * freeblks work is complete. + */ + if (adp->ad_jnewblk == NULL) { + allocdirect_jwork(adp, &freeblks->fb_jwork, D_FREEBLKS); + goto found; + } + lbn = adp->ad_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; + allocdirect_jwork(adp, &freework->fw_jwork, D_FREEWORK); + goto found; + } + panic("cancel_allocdirect: Freework not found for lbn %jd\n", lbn); +found: + if (delay) { + if (adp->ad_state & ONWORKLIST) + WORKLIST_REMOVE(&adp->ad_list); + WORKLIST_INSERT(&adp->ad_inodedep->id_bufwait, &adp->ad_list); + } else + free_allocdirect(adp); + return; +} + + +static void +allocdirect_jwork(adp, wkhd, type) + struct allocdirect *adp; + struct workhead *wkhd; + short type; +{ + /* + * If the journal entry hasn't been written we hold onto the dep + * until it is safe to free along with the other journal work. + */ + if (adp->ad_jnewblk != NULL) { + cancel_jnewblk(adp->ad_jnewblk, wkhd); + adp->ad_jnewblk = NULL; + } + if (!LIST_EMPTY(&adp->ad_jwork)) + jwork_move(type, __LINE__, wkhd, &adp->ad_jwork); +} + +/* + * Free an allocdirect. Generate a new freefrag work request if appropriate. + * This must be called after the inode pointer is valid or removed via + * truncate or frag extension. + */ +static void +free_allocdirect(adp) + struct allocdirect *adp; +{ + struct indirdep *indirdep; struct newdirblk *newdirblk; + struct freefrag *freefrag; struct worklist *wk; mtx_assert(&lk, MA_OWNED); - if ((adp->ad_state & DEPCOMPLETE) == 0) + if (adp->ad_state & ONDEPLIST) LIST_REMOVE(adp, ad_deps); - TAILQ_REMOVE(adphead, adp, ad_next); - if ((adp->ad_state & COMPLETE) == 0) + if (adp->ad_state & ONWORKLIST) WORKLIST_REMOVE(&adp->ad_list); - if (adp->ad_freefrag != NULL) { - if (delay) - WORKLIST_INSERT(&adp->ad_inodedep->id_bufwait, - &adp->ad_freefrag->ff_list); - else - add_to_worklist(&adp->ad_freefrag->ff_list); + if ((freefrag = adp->ad_freefrag) != NULL) { + freefrag->ff_state |= COMPLETE; + if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) + add_to_worklist(&freefrag->ff_list); } if ((wk = LIST_FIRST(&adp->ad_newdirblk)) != NULL) { newdirblk = WK_NEWDIRBLK(wk); WORKLIST_REMOVE(&newdirblk->db_list); if (!LIST_EMPTY(&adp->ad_newdirblk)) panic("free_allocdirect: extra newdirblk"); - if (delay) - WORKLIST_INSERT(&adp->ad_inodedep->id_bufwait, - &newdirblk->db_list); - else - free_newdirblk(newdirblk); + free_newdirblk(newdirblk); } + while ((indirdep = LIST_FIRST(&adp->ad_indirdeps)) != NULL) { + indirdep->ir_state |= DEPCOMPLETE; + indirdep_complete(indirdep); + } + KASSERT(adp->ad_jnewblk == NULL, + ("free_allocdirect; jnewblk %p still attached", adp->ad_jnewblk)); + handle_jwork(&adp->ad_jwork); WORKITEM_FREE(adp, D_ALLOCDIRECT); } @@ -2554,6 +4796,7 @@ free_newdirblk(newdirblk) { struct pagedep *pagedep; struct diradd *dap; + struct worklist *wk; int i; mtx_assert(&lk, MA_OWNED); @@ -2571,7 +4814,7 @@ free_newdirblk(newdirblk) pagedep->pd_state &= ~NEWBLOCK; if ((pagedep->pd_state & ONWORKLIST) == 0) while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != NULL) - free_diradd(dap); + free_diradd(dap, NULL); /* * If no dependencies remain, the pagedep will be freed. */ @@ -2579,9 +4822,16 @@ free_newdirblk(newdirblk) if (!LIST_EMPTY(&pagedep->pd_diraddhd[i])) break; if (i == DAHASHSZ && (pagedep->pd_state & ONWORKLIST) == 0) { + 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); } + /* Should only ever be one item in the list. */ + while ((wk = LIST_FIRST(&newdirblk->db_mkdir)) != NULL) { + WORKLIST_REMOVE(wk); + handle_written_mkdir(WK_MKDIR(wk), MKDIR_BODY); + } WORKITEM_FREE(newdirblk, D_NEWDIRBLK); } @@ -2608,6 +4858,7 @@ softdep_freefile(pvp, ino, mode) freefile->fx_mode = mode; freefile->fx_oldinum = ino; freefile->fx_devvp = ip->i_devvp; + LIST_INIT(&freefile->fx_jwork); if ((ip->i_flag & IN_SPACECOUNTED) == 0) { UFS_LOCK(ip->i_ump); ip->i_fs->fs_pendinginodes += 1; @@ -2618,11 +4869,19 @@ softdep_freefile(pvp, ino, mode) * If the inodedep does not exist, then the zero'ed inode has * been written to disk. If the allocated inode has never been * written to disk, then the on-disk inode is zero'ed. In either - * case we can free the file immediately. + * case we can free the file immediately. If the journal was + * canceled before being written the inode will never make it to + * disk and we must send the canceled journal entrys to + * ffs_freefile() to be cleared in conjunction with the bitmap. + * Any blocks waiting on the inode to write can be safely freed + * here as it will never been written. */ ACQUIRE_LOCK(&lk); - if (inodedep_lookup(pvp->v_mount, ino, 0, &inodedep) == 0 || - check_inode_unwritten(inodedep)) { + inodedep_lookup(pvp->v_mount, ino, 0, &inodedep); + if (inodedep && (inodedep->id_state & DEPCOMPLETE) == 0 && + !LIST_EMPTY(&inodedep->id_jaddrefhd)) + handle_bufwait(inodedep, &freefile->fx_jwork); + if (inodedep == NULL || check_inode_unwritten(inodedep)) { FREE_LOCK(&lk); handle_workitem_freefile(freefile); return; @@ -2654,6 +4913,19 @@ check_inode_unwritten(inodedep) { mtx_assert(&lk, MA_OWNED); + /* + * The inode is unwritten but we have some canceled jaddrefs still, + * the inode will never be written but it is not yet safe to be + * freed either. Return 1 so callers don't place items on the + * bufwait/inowait lists that will never be written. + * + * XXX This breaks if the jaddrefhd is not canceled but is UNDONE + * and complete. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0 && + !LIST_EMPTY(&inodedep->id_jaddrefhd)) + return (1); + if ((inodedep->id_state & DEPCOMPLETE) != 0 || !LIST_EMPTY(&inodedep->id_pendinghd) || !LIST_EMPTY(&inodedep->id_bufwait) || @@ -2662,9 +4934,9 @@ check_inode_unwritten(inodedep) !TAILQ_EMPTY(&inodedep->id_newinoupdt) || !TAILQ_EMPTY(&inodedep->id_extupdt) || !TAILQ_EMPTY(&inodedep->id_newextupdt) || + inodedep->id_mkdiradd != NULL || inodedep->id_nlinkdelta != 0) return (0); - /* * Another process might be in initiate_write_inodeblock_ufs[12] * trying to allocate memory without holding "Softdep Lock". @@ -2674,8 +4946,9 @@ check_inode_unwritten(inodedep) return (0); inodedep->id_state |= ALLCOMPLETE; - LIST_REMOVE(inodedep, id_deps); - inodedep->id_buf = NULL; + if (inodedep->id_state & ONDEPLIST) + LIST_REMOVE(inodedep, id_deps); + inodedep->id_bmsafemap = NULL; if (inodedep->id_state & ONWORKLIST) WORKLIST_REMOVE(&inodedep->id_list); if (inodedep->id_savedino1 != NULL) { @@ -2701,11 +4974,14 @@ free_inodedep(inodedep) !LIST_EMPTY(&inodedep->id_pendinghd) || !LIST_EMPTY(&inodedep->id_bufwait) || !LIST_EMPTY(&inodedep->id_inowait) || + !LIST_EMPTY(&inodedep->id_jaddrefhd) || !TAILQ_EMPTY(&inodedep->id_inoupdt) || !TAILQ_EMPTY(&inodedep->id_newinoupdt) || !TAILQ_EMPTY(&inodedep->id_extupdt) || !TAILQ_EMPTY(&inodedep->id_newextupdt) || - inodedep->id_nlinkdelta != 0 || inodedep->id_savedino1 != NULL) + inodedep->id_mkdiradd != NULL || + inodedep->id_nlinkdelta != 0 || + inodedep->id_savedino1 != NULL) return (0); LIST_REMOVE(inodedep, id_hash); WORKITEM_FREE(inodedep, D_INODEDEP); @@ -2714,6 +4990,124 @@ free_inodedep(inodedep) } /* + * Free the block referenced by a freework structure. The parent freeblks + * structure is released and completed when the final cg bitmap reaches + * the disk. This routine may be freeing a jnewblk which never made it to + * disk in which case we do not have to wait as the operation is undone + * in memory immediately. + */ +static void +freework_freeblock(freework) + struct freework *freework; +{ + struct freeblks *freeblks; + struct ufsmount *ump; + struct workhead wkhd; + struct fs *fs; + int complete; + int pending; + int bsize; + + freeblks = freework->fw_freeblks; + ump = VFSTOUFS(freeblks->fb_list.wk_mp); + fs = ump->um_fs; + complete = 0; + LIST_INIT(&wkhd); + /* + * If we are canceling an existing jnewblk pass it to the free + * routine, otherwise pass the freeblk which will ultimately + * release the freeblks + */ + if (!LIST_EMPTY(&freework->fw_jwork)) { + LIST_SWAP(&wkhd, &freework->fw_jwork, worklist, wk_list); + complete = 1; + } else + WORKLIST_INSERT_UNLOCKED(&wkhd, &freework->fw_list); + bsize = lfragtosize(fs, freework->fw_frags); + pending = btodb(bsize); + ACQUIRE_LOCK(&lk); + freeblks->fb_chkcnt -= pending; + 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); + if (complete == 0) + 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); +} + +/* + * Start the process of freeing an indirect block tree. + */ +static void +freework_freeindir(freework) + struct freework *freework; +{ + struct freeblks *freeblks; + struct ufsmount *ump; + struct fs *fs; + + + freeblks = freework->fw_freeblks; + ump = VFSTOUFS(freeblks->fb_list.wk_mp); + fs = ump->um_fs; + indir_trunc(freework, fsbtodb(fs, freework->fw_blkno), + freework->fw_lbn); +} + +/* + * Called when the last oustanding block owned by an indirect is freed. + * It is now safe to free the indirect block itself. + */ +static void +handle_workitem_indirblk(freework) + struct freework *freework; +{ + + freework_freeblock(freework); +} + +/* + * Called when a freework structure attached to a cg buf is written. The + * ref on either the parent or the freeblks structure is released and + * either may be added to the worklist if it is the final ref. + */ +static void +handle_written_freework(freework) + struct freework *freework; +{ + struct freeblks *freeblks; + struct freework *parent; + + freeblks = freework->fw_freeblks; + parent = freework->fw_parent; + if (parent) { + if (--parent->fw_ref != 0) + parent = NULL; + freeblks = NULL; + } else if (--freeblks->fb_ref != 0) + freeblks = NULL; + WORKITEM_FREE(freework, D_FREEWORK); + if (freeblks) + add_to_worklist(&freeblks->fb_list); + if (parent) + add_to_worklist(&parent->fw_list); +} + +/* * This workitem routine performs the block de-allocation. * The workitem is added to the pending list after the updated * inode block has been written to disk. As mentioned above, @@ -2726,99 +5120,79 @@ handle_workitem_freeblocks(freeblks, flags) struct freeblks *freeblks; int flags; { + struct freework *freework; + 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); + return; + } + freeblks->fb_ref++; + 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) + freework_freeindir(freework); + else + freework_freeblock(freework); + } + ACQUIRE_LOCK(&lk); + if (--freeblks->fb_ref != 0) + freeblks = NULL; + FREE_LOCK(&lk); + if (freeblks) + handle_complete_freeblocks(freeblks); +} + +/* + * Once all of the freework workitems are complete we can retire the + * freeblocks dependency and any journal work awaiting completion. This + * can not be called until all other dependencies are stable on disk. + */ +static void +handle_complete_freeblocks(freeblks) + struct freeblks *freeblks; +{ struct inode *ip; struct vnode *vp; struct fs *fs; struct ufsmount *ump; - int i, nblocks, level, bsize; - ufs2_daddr_t bn, blocksreleased = 0; - int error, allerror = 0; - ufs_lbn_t baselbns[NIADDR], tmpval; - int fs_pendingblocks; + int flags; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - fs_pendingblocks = 0; - tmpval = 1; - baselbns[0] = NDADDR; - for (i = 1; i < NIADDR; i++) { - tmpval *= NINDIR(fs); - baselbns[i] = baselbns[i - 1] + tmpval; - } - nblocks = btodb(fs->fs_bsize); - blocksreleased = 0; + flags = LK_NOWAIT; + /* - * Release all extended attribute blocks or frags. - */ - if (freeblks->fb_oldextsize > 0) { - for (i = (NXADDR - 1); i >= 0; i--) { - if ((bn = freeblks->fb_eblks[i]) == 0) - continue; - bsize = sblksize(fs, freeblks->fb_oldextsize, i); - ffs_blkfree(ump, fs, freeblks->fb_devvp, bn, bsize, - freeblks->fb_previousinum); - blocksreleased += btodb(bsize); - } - } - /* - * Release all data blocks or frags. - */ - if (freeblks->fb_oldsize > 0) { - /* - * Indirect blocks first. - */ - for (level = (NIADDR - 1); level >= 0; level--) { - if ((bn = freeblks->fb_iblks[level]) == 0) - continue; - if ((error = indir_trunc(freeblks, fsbtodb(fs, bn), - level, baselbns[level], &blocksreleased)) != 0) - allerror = error; - ffs_blkfree(ump, fs, freeblks->fb_devvp, bn, - fs->fs_bsize, freeblks->fb_previousinum); - fs_pendingblocks += nblocks; - blocksreleased += nblocks; - } - /* - * All direct blocks or frags. - */ - for (i = (NDADDR - 1); i >= 0; i--) { - if ((bn = freeblks->fb_dblks[i]) == 0) - continue; - bsize = sblksize(fs, freeblks->fb_oldsize, i); - ffs_blkfree(ump, fs, freeblks->fb_devvp, bn, bsize, - freeblks->fb_previousinum); - fs_pendingblocks += btodb(bsize); - blocksreleased += btodb(bsize); - } - } - UFS_LOCK(ump); - fs->fs_pendingblocks -= fs_pendingblocks; - UFS_UNLOCK(ump); - /* * If we still have not finished background cleanup, then check * to see if the block count needs to be adjusted. */ - if (freeblks->fb_chkcnt != blocksreleased && - (fs->fs_flags & FS_UNCLEAN) != 0 && + 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) { + (flags & LK_NOWAIT) | LK_EXCLUSIVE, &vp, FFSV_FORCEINSMQ) == 0) { ip = VTOI(vp); - DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + \ - freeblks->fb_chkcnt - blocksreleased); + DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + freeblks->fb_chkcnt); ip->i_flag |= IN_CHANGE; vput(vp); } #ifdef INVARIANTS - if (freeblks->fb_chkcnt != blocksreleased && + if (freeblks->fb_chkcnt != 0 && ((fs->fs_flags & FS_UNCLEAN) == 0 || (flags & LK_NOWAIT) != 0)) printf("handle_workitem_freeblocks: block count\n"); - if (allerror) - softdep_error("handle_workitem_freeblks", allerror); #endif /* INVARIANTS */ ACQUIRE_LOCK(&lk); + /* + * All of the freeblock deps must be complete prior to this call + * so it's now safe to complete earlier outstanding journal entries. + */ + handle_jwork(&freeblks->fb_jwork); WORKITEM_FREE(freeblks, D_FREEBLKS); num_freeblkdep--; FREE_LOCK(&lk); @@ -2831,28 +5205,39 @@ handle_workitem_freeblocks(freeblks, flags) * blocks. */ static int -indir_trunc(freeblks, dbn, level, lbn, countp) - struct freeblks *freeblks; +indir_trunc(freework, dbn, lbn) + struct freework *freework; ufs2_daddr_t dbn; - int level; ufs_lbn_t lbn; - ufs2_daddr_t *countp; { + struct workhead wkhd; + 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, *bap2 = 0; + ufs2_daddr_t nb, nnb, *bap2 = 0; ufs_lbn_t lbnadd; int i, nblocks, ufs1fmt; int error, allerror = 0; int fs_pendingblocks; + int freedeps; + 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; lbnadd = 1; for (i = level; i > 0; i--) lbnadd *= NINDIR(fs); @@ -2880,8 +5265,8 @@ static int (indirdep = WK_INDIRDEP(wk))->ir_savebp != bp || (indirdep->ir_state & GOINGAWAY) == 0) panic("indir_trunc: lost indirdep"); - WORKLIST_REMOVE(wk); - WORKITEM_FREE(indirdep, D_INDIRDEP); + LIST_SWAP(&wkhd, &indirdep->ir_jwork, worklist, wk_list); + free_indirdep(indirdep); if (!LIST_EMPTY(&bp->b_dep)) panic("indir_trunc: dangling dep"); ump->um_numindirdeps -= 1; @@ -2909,56 +5294,196 @@ static int ufs1fmt = 0; bap2 = (ufs2_daddr_t *)bp->b_data; } - nblocks = btodb(fs->fs_bsize); - for (i = NINDIR(fs) - 1; i >= 0; i--) { - if (ufs1fmt) + /* + * Reclaim indirect blocks which never made it to disk. + */ + cnt = 0; + LIST_FOREACH_SAFE(wk, &wkhd, wk_list, wkn) { + struct workhead freewk; + if (wk->wk_type != D_JNEWBLK) + continue; + WORKLIST_REMOVE_UNLOCKED(wk); + LIST_INIT(&freewk); + WORKLIST_INSERT_UNLOCKED(&freewk, wk); + jnewblk = WK_JNEWBLK(wk); + if (jnewblk->jn_lbn > 0) + i = (jnewblk->jn_lbn - -lbn) / lbnadd; + else + i = (jnewblk->jn_lbn - lbn) / lbnadd; + KASSERT(i >= 0 && i < NINDIR(fs), + ("indir_trunc: Index out of range %d parent %jd lbn %jd", + i, lbn, jnewblk->jn_lbn)); + /* Clear the pointer so it isn't found below. */ + if (ufs1fmt) { nb = bap1[i]; - else + 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)); + ffs_blkfree(ump, fs, freeblks->fb_devvp, jnewblk->jn_blkno, + fs->fs_bsize, freeblks->fb_previousinum, &freewk); + cnt++; + } + ACQUIRE_LOCK(&lk); + freework->fw_ref += NINDIR(fs) + 1; + /* Any remaining journal work can be completed with freeblks. */ + jwork_move(D_FREEBLKS, __LINE__, &freeblks->fb_jwork, &wkhd); + FREE_LOCK(&lk); + nblocks = btodb(fs->fs_bsize); + if (ufs1fmt) + nb = bap1[NINDIR(fs) - 1]; + else + nb = bap2[NINDIR(fs) - 1]; + /* + * Reclaim on disk blocks. + */ + for (i = NINDIR(fs) - 1; i >= 0; i--, nb = nnb) { + if (i != 0) { + if (ufs1fmt) + nnb = bap1[i-1]; + else + nnb = bap2[i-1]; + } else + nnb = 0; if (nb == 0) continue; + cnt++; if (level != 0) { - if ((error = indir_trunc(freeblks, fsbtodb(fs, nb), - level - 1, lbn + (i * lbnadd), countp)) != 0) + struct freework *nfreework; + ufs_lbn_t nlbn; + + nlbn = (lbn + 1) - (i * lbnadd); + nfreework = newfreework(freeblks, freework, nlbn, nb, + fs->fs_frag, 0); + freedeps++; + if ((error = indir_trunc(nfreework, fsbtodb(fs, nb), + nlbn)) != 0) allerror = error; + } else { + struct freedep *freedep; + + /* + * Attempt to aggregate freedep dependencies for + * all blocks being released to the same CG. + */ + LIST_INIT(&wkhd); + if (nnb == 0 || (dtog(fs, nb) != dtog(fs, nnb))) { + freedep = newfreedep(freework); + WORKLIST_INSERT_UNLOCKED(&wkhd, + &freedep->fd_list); + freedeps++; + } + ffs_blkfree(ump, fs, freeblks->fb_devvp, nb, + fs->fs_bsize, freeblks->fb_previousinum, &wkhd); + fs_pendingblocks += nblocks; } - ffs_blkfree(ump, fs, freeblks->fb_devvp, nb, fs->fs_bsize, - freeblks->fb_previousinum); - fs_pendingblocks += nblocks; - *countp += nblocks; } - UFS_LOCK(ump); - fs->fs_pendingblocks -= fs_pendingblocks; - UFS_UNLOCK(ump); + ACQUIRE_LOCK(&lk); + if (level == 0) + fs_pendingblocks = (nblocks * cnt); + freework->fw_ref += freedeps; + freework->fw_ref -= NINDIR(fs) + 1; + if (freework->fw_ref != 0) + freework = NULL; + FREE_LOCK(&lk); + if (fs_pendingblocks) { + ACQUIRE_LOCK(&lk); + freeblks->fb_chkcnt -= fs_pendingblocks; + FREE_LOCK(&lk); + UFS_LOCK(ump); + fs->fs_pendingblocks -= fs_pendingblocks; + UFS_UNLOCK(ump); + } bp->b_flags |= B_INVAL | B_NOCACHE; brelse(bp); + if (freework) + handle_workitem_indirblk(freework); return (allerror); } /* - * Free an allocindir. - * This routine must be called with splbio interrupts blocked. + * Cancel an allocindir when it is removed via truncation. */ static void -free_allocindir(aip, inodedep) +cancel_allocindir(aip, inodedep, freeblks) struct allocindir *aip; struct inodedep *inodedep; + struct freeblks *freeblks; { + struct indirdep *indirdep; + + while ((indirdep = LIST_FIRST(&aip->ai_indirdeps)) != NULL) { + indirdep->ir_state &= ~ONDEPLIST; + LIST_REMOVE(indirdep, ir_next); + } + /* + * If the journal hasn't been written the jnewblk must be passed + * to the call to ffs_freeblk 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. + */ + if (aip->ai_jnewblk == NULL) + free_allocindir(aip, inodedep, &freeblks->fb_jwork, + D_FREEBLKS); + else + free_allocindir(aip, inodedep, &aip->ai_indirdep->ir_jwork, + D_ALLOCINDIR); +} + +/* + * Free an allocindir when it is made redundant by another allocation or + * a truncation or when it is successfully written. + */ +static void +free_allocindir(aip, inodedep, wkhd, type) + struct allocindir *aip; + struct inodedep *inodedep; + struct workhead *wkhd; + short type; +{ + struct newdirblk *newdirblk; + struct indirdep *indirdep; struct freefrag *freefrag; + struct worklist *wk; mtx_assert(&lk, MA_OWNED); - if ((aip->ai_state & DEPCOMPLETE) == 0) + if (aip->ai_jnewblk != NULL) + cancel_jnewblk(aip->ai_jnewblk, wkhd); + if (aip->ai_state & ONDEPLIST) LIST_REMOVE(aip, ai_deps); if (aip->ai_state & ONWORKLIST) WORKLIST_REMOVE(&aip->ai_list); LIST_REMOVE(aip, ai_next); if ((freefrag = aip->ai_freefrag) != NULL) { - if (inodedep == NULL) - add_to_worklist(&freefrag->ff_list); - else + if (inodedep == NULL) { + freefrag->ff_state |= COMPLETE; + if ((freefrag->ff_state & ALLCOMPLETE) == ALLCOMPLETE) + add_to_worklist(&freefrag->ff_list); + } else WORKLIST_INSERT(&inodedep->id_bufwait, &freefrag->ff_list); } + while ((indirdep = LIST_FIRST(&aip->ai_indirdeps)) != NULL) { + indirdep->ir_state |= DEPCOMPLETE; + indirdep_complete(indirdep); + } + if ((wk = LIST_FIRST(&aip->ai_newdirblk)) != NULL) { + newdirblk = WK_NEWDIRBLK(wk); + WORKLIST_REMOVE(&newdirblk->db_list); + if (!LIST_EMPTY(&aip->ai_newdirblk)) + panic("free_allocindir: extra newdirblk"); + free_newdirblk(newdirblk); + } + if (wkhd) + jwork_move(type, __LINE__, wkhd, &aip->ai_jwork); + else + handle_jwork(&aip->ai_jwork); WORKITEM_FREE(aip, D_ALLOCINDIR); } @@ -2998,11 +5523,15 @@ softdep_setup_directory_add(bp, dp, diroffset, new ufs_lbn_t lbn; /* block in directory containing new entry */ struct fs *fs; struct diradd *dap; + struct allocindir *aip; struct allocdirect *adp; struct pagedep *pagedep; struct inodedep *inodedep; struct newdirblk *newdirblk = 0; + struct newdirblk *mknewdirblk = 0; struct mkdir *mkdir1, *mkdir2; + struct worklist *wk; + struct jaddref *jaddref; struct mount *mp; /* @@ -3013,6 +5542,7 @@ softdep_setup_directory_add(bp, dp, diroffset, new bdwrite(newdirbp); return (0); } + mkdir1 = NULL; mp = UFSTOVFS(dp->i_ump); fs = dp->i_fs; lbn = lblkno(fs, diroffset); @@ -3023,25 +5553,31 @@ softdep_setup_directory_add(bp, dp, diroffset, new dap->da_offset = offset; dap->da_newinum = newinum; dap->da_state = ATTACHED; - if (isnewblk && lbn < NDADDR && fragoff(fs, diroffset) == 0) { + LIST_INIT(&dap->da_jwork); + if (isnewblk && fragoff(fs, diroffset) == 0) { newdirblk = malloc(sizeof(struct newdirblk), M_NEWDIRBLK, M_SOFTDEP_FLAGS); workitem_alloc(&newdirblk->db_list, D_NEWDIRBLK, mp); + LIST_INIT(&newdirblk->db_mkdir); } if (newdirbp == NULL) { dap->da_state |= DEPCOMPLETE; ACQUIRE_LOCK(&lk); } else { + mknewdirblk = malloc(sizeof(struct newdirblk), + M_NEWDIRBLK, M_SOFTDEP_FLAGS); + workitem_alloc(&mknewdirblk->db_list, D_NEWDIRBLK, mp); + LIST_INIT(&mknewdirblk->db_mkdir); dap->da_state |= MKDIR_BODY | MKDIR_PARENT; mkdir1 = malloc(sizeof(struct mkdir), M_MKDIR, M_SOFTDEP_FLAGS); workitem_alloc(&mkdir1->md_list, D_MKDIR, mp); - mkdir1->md_state = MKDIR_BODY; + mkdir1->md_state = ATTACHED | MKDIR_BODY; mkdir1->md_diradd = dap; mkdir2 = malloc(sizeof(struct mkdir), M_MKDIR, M_SOFTDEP_FLAGS); workitem_alloc(&mkdir2->md_list, D_MKDIR, mp); - mkdir2->md_state = MKDIR_PARENT; + mkdir2->md_state = ATTACHED | MKDIR_PARENT; mkdir2->md_diradd = dap; /* * Dependency on "." and ".." being written to disk. @@ -3049,85 +5585,134 @@ softdep_setup_directory_add(bp, dp, diroffset, new mkdir1->md_buf = newdirbp; ACQUIRE_LOCK(&lk); LIST_INSERT_HEAD(&mkdirlisthd, mkdir1, md_mkdirs); - WORKLIST_INSERT(&newdirbp->b_dep, &mkdir1->md_list); - FREE_LOCK(&lk); - bdwrite(newdirbp); /* - * Dependency on link count increase for parent directory + * We must link the pagedep, allocdirect, and newdirblk for + * the initial file page so the pointer to the new directory + * is not written until the directory contents are live and + * any subsequent additions are not marked live until the + * block is reachable via the inode. */ - ACQUIRE_LOCK(&lk); - if (inodedep_lookup(mp, dp->i_number, 0, &inodedep) == 0 - || (inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) { - dap->da_state &= ~MKDIR_PARENT; - WORKITEM_FREE(mkdir2, D_MKDIR); - } else { - LIST_INSERT_HEAD(&mkdirlisthd, mkdir2, md_mkdirs); - WORKLIST_INSERT(&inodedep->id_bufwait,&mkdir2->md_list); - } + if (pagedep_lookup(mp, newinum, 0, 0, &pagedep) == 0) + panic("softdep_setup_directory_add: " + "lost mkdir pagedep"); + LIST_FOREACH(wk, &newdirbp->b_dep, wk_list) + if (wk->wk_type == D_ALLOCDIRECT) + break; + if (wk == NULL) + panic("softdep_setup_directory_add: lost mkdir adp"); + adp = WK_ALLOCDIRECT(wk); + pagedep->pd_state |= NEWBLOCK; + pagedep->pd_newdirblk = mknewdirblk; + mknewdirblk->db_pagedep = pagedep; + WORKLIST_INSERT(&adp->ad_newdirblk, &mknewdirblk->db_list); + WORKLIST_INSERT(&mknewdirblk->db_mkdir, &mkdir1->md_list); + /* + * Look up the inodedep for the parent directory so that we + * can link mkdir2 into the pending dotdot jaddref or + * the inode write if there is none. If the inode is + * ALLCOMPLETE and no jaddref is present all dependencies have + * been satisfied and mkdir2 can be freed. + */ + if (inodedep_lookup(mp, dp->i_number, 0, &inodedep) == 0) + panic("softdep_setup_directory_add: lost parent"); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + KASSERT(jaddref != NULL && jaddref->ja_parent == newinum && + (jaddref->ja_state & MKDIR_PARENT), + ("softdep_setup_directory_add: bad dotdot jaddref %p", + jaddref)); + LIST_INSERT_HEAD(&mkdirlisthd, mkdir2, md_mkdirs); + mkdir2->md_jaddref = jaddref; + jaddref->ja_mkdir = mkdir2; + /* + * It is important that this journal entry is added prior + * to the dot entry since it writes both the dot and dotdot + * links. This entry must be visible to the recovery + * operation for it to correctly adjust the parent's link. + */ + add_to_journal(&jaddref->ja_list); } /* * Link into parent directory pagedep to await its being written. */ - if (pagedep_lookup(dp, lbn, DEPALLOC, &pagedep) == 0) + if (pagedep_lookup(mp, dp->i_number, lbn, DEPALLOC, &pagedep) == 0) WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); + dap->da_pagedep = pagedep; LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(offset)], dap, da_pdlist); /* - * Link into its inodedep. Put it on the id_bufwait list if the inode - * is not yet written. If it is written, do the post-inode write - * processing to put it on the id_pendinghd list. + * Link the diradd into the jaddref so it may be completed after + * the journal entry is written. The directory offset was not + * known until now so it must still exist as the first element + * of the jaddrefhd queue. */ - (void) inodedep_lookup(mp, newinum, DEPALLOC, &inodedep); - if ((inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) - diradd_inode_written(dap, inodedep); - else - WORKLIST_INSERT(&inodedep->id_bufwait, &dap->da_list); - if (isnewblk) { + if (inodedep_lookup(mp, newinum, 0, &inodedep) == 0) + panic("softdep_setup_directory_add: Lost inodedep"); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, + ("softdep_setup_directory_add: bad jaddref %p", jaddref)); + jaddref->ja_diroff = diroffset; + jaddref->ja_diradd = dap; + add_to_journal(&jaddref->ja_list); + /* + * If we are adding a new directory remember this diradd so that if + * we rename it we can keep the dot and dotdot dependencies. If + * we are adding a new name for an inode that has a mkdiradd we + * must be in rename and we have to move the dot and dotdot + * dependencies to this new name. The old name is being orphaned + * soon. + */ + if (mkdir1 != NULL) { + if (inodedep->id_mkdiradd != NULL) + panic("softdep_setup_directory_add: Existing mkdir"); + inodedep->id_mkdiradd = dap; + jaddref = LIST_NEXT(jaddref, ja_inodeps); + KASSERT(jaddref != NULL && + jaddref->ja_ino == jaddref->ja_parent && + (jaddref->ja_state & MKDIR_BODY), + ("softdep_setup_directory_add: bad dot jaddref %p", + jaddref)); + mkdir1->md_jaddref = jaddref; + jaddref->ja_mkdir = mkdir1; + add_to_journal(&jaddref->ja_list); + } else if (inodedep->id_mkdiradd) + merge_diradd(inodedep, dap); + if (newdirblk) { /* - * Directories growing into indirect blocks are rare - * enough and the frequency of new block allocation - * in those cases even more rare, that we choose not - * to bother tracking them. Rather we simply force the - * new directory entry to disk. + * There is nothing to do if we are already tracking + * this block. */ - if (lbn >= NDADDR) { - FREE_LOCK(&lk); - /* - * We only have a new allocation when at the - * beginning of a new block, not when we are - * expanding into an existing block. - */ - if (blkoff(fs, diroffset) == 0) - return (1); - return (0); - } - /* - * We only have a new allocation when at the beginning - * of a new fragment, not when we are expanding into an - * existing fragment. Also, there is nothing to do if we - * are already tracking this block. - */ - if (fragoff(fs, diroffset) != 0) { - FREE_LOCK(&lk); - return (0); - } if ((pagedep->pd_state & NEWBLOCK) != 0) { WORKITEM_FREE(newdirblk, D_NEWDIRBLK); FREE_LOCK(&lk); return (0); } /* - * Find our associated allocdirect and have it track us. + * Find our associated alloc{direct/indir} and have it + * track us. */ - if (inodedep_lookup(mp, dp->i_number, 0, &inodedep) == 0) - panic("softdep_setup_directory_add: lost inodedep"); - adp = TAILQ_LAST(&inodedep->id_newinoupdt, allocdirectlst); - if (adp == NULL || adp->ad_lbn != lbn) + adp = NULL; + aip = NULL; + LIST_FOREACH(wk, &bp->b_dep, wk_list) { + if (wk->wk_type == D_ALLOCDIRECT) { + adp = WK_ALLOCDIRECT(wk); + break; + } + if (wk->wk_type == D_ALLOCINDIR) { + aip = WK_ALLOCINDIR(wk); + break; + } + } + if (adp == NULL && aip == NULL) panic("softdep_setup_directory_add: lost entry"); + wk = &newdirblk->db_list; + if (adp) + WORKLIST_INSERT(&adp->ad_newdirblk, wk); + else + WORKLIST_INSERT(&aip->ai_newdirblk, wk); pagedep->pd_state |= NEWBLOCK; + pagedep->pd_newdirblk = newdirblk; newdirblk->db_pagedep = pagedep; - WORKLIST_INSERT(&adp->ad_newdirblk, &newdirblk->db_list); } FREE_LOCK(&lk); return (0); @@ -3156,12 +5741,14 @@ softdep_change_directoryentry_offset(dp, base, old ACQUIRE_LOCK(&lk); lbn = lblkno(dp->i_fs, dp->i_offset); offset = blkoff(dp->i_fs, dp->i_offset); - if (pagedep_lookup(dp, lbn, 0, &pagedep) == 0) + if (pagedep_lookup(UFSTOVFS(dp->i_ump), + dp->i_number, lbn, 0, &pagedep) == 0) goto done; oldoffset = offset + (oldloc - base); newoffset = offset + (newloc - base); - LIST_FOREACH(dap, &pagedep->pd_diraddhd[DIRADDHASH(oldoffset)], da_pdlist) { + LIST_FOREACH(dap, &pagedep->pd_diraddhd[DIRADDHASH(oldoffset)], + da_pdlist) { if (dap->da_offset != oldoffset) continue; dap->da_offset = newoffset; @@ -3184,48 +5771,139 @@ softdep_change_directoryentry_offset(dp, base, old done: bcopy(oldloc, newloc, entrysize); FREE_LOCK(&lk); + /* XXX Make a remove and add record, add to the pagedep. */ } /* + * Move the mkdir dependencies and journal work from one diradd to another + * when renaming a directory. The new name must depend on the mkdir deps + * completing as the old name did. Directories can only have one valid link + * at a time so one must be canonical. + */ +static void +merge_diradd(inodedep, newdap) + struct inodedep *inodedep; + struct diradd *newdap; +{ + struct diradd *olddap; + struct mkdir *mkdir, *nextmd; + short state; + + olddap = inodedep->id_mkdiradd; + inodedep->id_mkdiradd = newdap; + if ((olddap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) { + newdap->da_state &= ~DEPCOMPLETE; + for (mkdir = LIST_FIRST(&mkdirlisthd); mkdir; mkdir = nextmd) { + nextmd = LIST_NEXT(mkdir, md_mkdirs); + if (mkdir->md_diradd != olddap) + continue; + mkdir->md_diradd = newdap; + state = mkdir->md_state & (MKDIR_PARENT | MKDIR_BODY); + newdap->da_state |= state; + olddap->da_state &= ~state; + if ((olddap->da_state & + (MKDIR_PARENT | MKDIR_BODY)) == 0) + break; + } + if ((olddap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) + panic("merge_diradd: unfound ref"); + } + /* + * Any mkdir related journal items are not safe to be freed until + * the new name is stable. + */ + jwork_move(D_DIRADD, __LINE__, &newdap->da_jwork, &olddap->da_jwork); + olddap->da_state |= DEPCOMPLETE; + complete_diradd(olddap); +} + +/* + * Move the diradd to the pending list when all diradd dependencies are + * complete. + */ +static void +complete_diradd(dap) + struct diradd *dap; +{ + struct pagedep *pagedep; + + if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { + if (dap->da_state & DIRCHG) + pagedep = dap->da_previous->dm_pagedep; + else + pagedep = dap->da_pagedep; + LIST_REMOVE(dap, da_pdlist); + LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); + } +} + +/* * Free a diradd dependency structure. This routine must be called - * with splbio interrupts blocked. + * with splbio interrupts blocked. If wkhd is NULL we should not find + * any pending jaddrefs and only jsegdeps to be retired. */ static void -free_diradd(dap) +free_diradd(dap, wkhd) struct diradd *dap; + struct workhead *wkhd; { struct dirrem *dirrem; struct pagedep *pagedep; struct inodedep *inodedep; struct mkdir *mkdir, *nextmd; + struct jaddref *jaddref; mtx_assert(&lk, MA_OWNED); - WORKLIST_REMOVE(&dap->da_list); LIST_REMOVE(dap, da_pdlist); + if (dap->da_state & ONWORKLIST) + WORKLIST_REMOVE(&dap->da_list); if ((dap->da_state & DIRCHG) == 0) { pagedep = dap->da_pagedep; } else { dirrem = dap->da_previous; pagedep = dirrem->dm_pagedep; dirrem->dm_dirinum = pagedep->pd_ino; - add_to_worklist(&dirrem->dm_list); + dirrem->dm_state |= COMPLETE; + if (LIST_EMPTY(&dirrem->dm_jremrefhd)) + add_to_worklist(&dirrem->dm_list); } if (inodedep_lookup(pagedep->pd_list.wk_mp, dap->da_newinum, - 0, &inodedep) != 0) + 0, &inodedep) != 0) { + /* Abort the addref that reference this diradd. */ + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) + if (jaddref->ja_diradd == dap) { + cancel_jaddref(jaddref, inodedep, wkhd); + break; + } + if (inodedep->id_mkdiradd == dap) + inodedep->id_mkdiradd = NULL; (void) free_inodedep(inodedep); + } if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) { for (mkdir = LIST_FIRST(&mkdirlisthd); mkdir; mkdir = nextmd) { nextmd = LIST_NEXT(mkdir, md_mkdirs); if (mkdir->md_diradd != dap) continue; - dap->da_state &= ~mkdir->md_state; - WORKLIST_REMOVE(&mkdir->md_list); + dap->da_state &= + ~(mkdir->md_state & (MKDIR_PARENT | MKDIR_BODY)); LIST_REMOVE(mkdir, md_mkdirs); + if (mkdir->md_state & ONWORKLIST) + WORKLIST_REMOVE(&mkdir->md_list); + if ((jaddref = mkdir->md_jaddref) != NULL) + cancel_jaddref(jaddref, NULL, wkhd); WORKITEM_FREE(mkdir, D_MKDIR); + if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) == 0) + break; } if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) panic("free_diradd: unfound ref"); } + if (wkhd) + jwork_move(D_DIRREM, __LINE__, wkhd, &dap->da_jwork); + /* + * Free any journal segments waiting for the directory write. + */ + handle_jwork(&dap->da_jwork); WORKITEM_FREE(dap, D_DIRADD); } @@ -3254,11 +5932,14 @@ softdep_setup_remove(bp, dp, ip, isrmdir) int isrmdir; /* indicates if doing RMDIR */ { struct dirrem *dirrem, *prevdirrem; + int direct; /* - * Allocate a new dirrem if appropriate and ACQUIRE_LOCK. + * Allocate a new dirrem if appropriate and ACQUIRE_LOCK. We want + * newdirrem() to setup the full directory remove which requires + * isrmdir > 1. */ - dirrem = newdirrem(bp, dp, ip, isrmdir, &prevdirrem); + dirrem = newdirrem(bp, dp, ip, isrmdir?2:0, &prevdirrem); /* * If the COMPLETE flag is clear, then there were no active @@ -3280,12 +5961,64 @@ softdep_setup_remove(bp, dp, ip, isrmdir) LIST_INSERT_HEAD(&dirrem->dm_pagedep->pd_dirremhd, prevdirrem, dm_next); dirrem->dm_dirinum = dirrem->dm_pagedep->pd_ino; + direct = LIST_EMPTY(&dirrem->dm_jremrefhd); FREE_LOCK(&lk); - handle_workitem_remove(dirrem, NULL); + if (direct) + handle_workitem_remove(dirrem, NULL); } } /* + * Check for an entry matching 'offset' on both the pd_dirraddhd list and the + * pd_pendinghd list of a pagedep. + */ +static struct diradd * +diradd_lookup(pagedep, offset) + struct pagedep *pagedep; + int offset; +{ + struct diradd *dap; + + LIST_FOREACH(dap, &pagedep->pd_diraddhd[DIRADDHASH(offset)], da_pdlist) + if (dap->da_offset == offset) + return (dap); + LIST_FOREACH(dap, &pagedep->pd_pendinghd, da_pdlist) + if (dap->da_offset == offset) + return (dap); + return (NULL); +} + +/* + * Search for a .. diradd dependency in a directory that is being removed. + * If the directory was renamed to a new parent we have a diradd rather + * than a mkdir for the .. entry. We need to cancel it now before + * it is found in truncate(). + */ +static void +cancel_diradd_dotdot(ip, dirrem) + struct inode *ip; + struct dirrem *dirrem; +{ + struct pagedep *pagedep; + struct diradd *dap; + struct worklist *wk; + + if (pagedep_lookup(UFSTOVFS(ip->i_ump), ip->i_number, 0, 0, + &pagedep) == 0) + return; + dap = diradd_lookup(pagedep, DOTDOT_OFFSET); + if (dap == NULL) + return; + free_diradd(dap, &dirrem->dm_jwork); + /* + * Mark any journal work as belonging to the parent so it is freed + * with the .. reference. + */ + LIST_FOREACH(wk, &dirrem->dm_jwork, wk_list) + wk->wk_state |= MKDIR_PARENT; +} + +/* * Allocate a new dirrem if appropriate and return it along with * its associated pagedep. Called without a lock, returns with lock. */ @@ -3303,6 +6036,9 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) struct diradd *dap; struct dirrem *dirrem; struct pagedep *pagedep; + struct jremref *jremref; + struct jremref *dotremref; + struct jremref *dotdotremref; /* * Whiteouts have no deletion dependencies. @@ -3322,33 +6058,67 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) dirrem = malloc(sizeof(struct dirrem), M_DIRREM, M_SOFTDEP_FLAGS|M_ZERO); workitem_alloc(&dirrem->dm_list, D_DIRREM, ITOV(dp)->v_mount); + LIST_INIT(&dirrem->dm_jremrefhd); + LIST_INIT(&dirrem->dm_jwork); dirrem->dm_state = isrmdir ? RMDIR : 0; dirrem->dm_oldinum = ip->i_number; *prevdirremp = NULL; - + /* + * Allocate remove reference structures to track journal write + * dependencies. We will always have one for the link and + * when doing directories we will always have one more for dot. + * When renaming a directory we skip the dotdot link change so + * this is not needed. + */ + dotremref = dotdotremref = NULL; + jremref = newjremref(dirrem, dp, ip, dp->i_offset); + if (isrmdir) + dotremref = newjremref(dirrem, ip, ip, DOT_OFFSET); + if (isrmdir > 1) { + dotdotremref = newjremref(dirrem, ip, dp, DOTDOT_OFFSET); + dotdotremref->jr_state |= MKDIR_PARENT; + } ACQUIRE_LOCK(&lk); lbn = lblkno(dp->i_fs, dp->i_offset); offset = blkoff(dp->i_fs, dp->i_offset); - if (pagedep_lookup(dp, lbn, DEPALLOC, &pagedep) == 0) + if (pagedep_lookup(UFSTOVFS(dp->i_ump), dp->i_number, lbn, DEPALLOC, + &pagedep) == 0) WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); dirrem->dm_pagedep = pagedep; /* + * If we're removing a .. link search for the dependency now and + * cancel it. Any pending journal work will be added to the dirrem + * to be completed when the workitem remove completes. + */ + if (isrmdir > 1) + cancel_diradd_dotdot(ip, dirrem); + /* * Check for a diradd dependency for the same directory entry. * If present, then both dependencies become obsolete and can - * be de-allocated. Check for an entry on both the pd_dirraddhd - * list and the pd_pendinghd list. + * be de-allocated. */ - - LIST_FOREACH(dap, &pagedep->pd_diraddhd[DIRADDHASH(offset)], da_pdlist) - if (dap->da_offset == offset) - break; + dap = diradd_lookup(pagedep, offset); if (dap == NULL) { - - LIST_FOREACH(dap, &pagedep->pd_pendinghd, da_pdlist) - if (dap->da_offset == offset) - break; - if (dap == NULL) - return (dirrem); + /* + * Link the jremref structures into the dirrem so they are + * written prior to the pagedep. + */ + if (jremref) { + LIST_INSERT_HEAD(&dirrem->dm_jremrefhd, jremref, + jr_deps); + add_to_journal(&jremref->jr_list); + if (dotremref) { + LIST_INSERT_HEAD(&dirrem->dm_jremrefhd, + dotremref, jr_deps); + add_to_journal(&dotremref->jr_list); + } + if (dotdotremref) { + LIST_INSERT_HEAD(&dirrem->dm_jremrefhd, + dotdotremref, jr_deps); + add_to_journal(&dotdotremref->jr_list); + } + } + return (dirrem); } /* * Must be ATTACHED at this point. @@ -3359,6 +6129,20 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) panic("newdirrem: inum %d should be %d", ip->i_number, dap->da_newinum); /* + * If we've found a diradd in memory it still has valid journal + * entries to complete. Rather than writing new journal entries + * we complete the segdeps only after the removal is complete. The + * recovery operation will simply find an incomplete add. If the + * addref journal is not written the jaddrefs will stay linked into + * the inodedep and bmsafemap preventing the writes of the new + * data until they are ultimately freed. + */ + WORKITEM_FREE(jremref, D_JREMREF); + if (dotremref) + WORKITEM_FREE(dotremref, D_JREMREF); + if (dotdotremref) + WORKITEM_FREE(dotdotremref, D_JREMREF); + /* * If we are deleting a changed name that never made it to disk, * then return the dirrem describing the previous inode (which * represents the inode currently referenced from this entry on disk). @@ -3373,7 +6157,18 @@ newdirrem(bp, dp, ip, isrmdir, prevdirremp) * Mark it COMPLETE so we can delete its inode immediately. */ dirrem->dm_state |= COMPLETE; - free_diradd(dap); + free_diradd(dap, &dirrem->dm_jwork); +#ifdef DEBUG + /* XXX Temporary. */ + if (isrmdir == 0) { + struct worklist *wk; + + LIST_FOREACH(wk, &dirrem->dm_jwork, wk_list) + if (wk->wk_state & (MKDIR_BODY | MKDIR_PARENT)) + panic("bad wk %p (0x%X)\n", wk, wk->wk_state); + } +#endif + return (dirrem); } @@ -3407,6 +6202,7 @@ softdep_setup_directory_change(bp, dp, ip, newinum struct dirrem *dirrem, *prevdirrem; struct pagedep *pagedep; struct inodedep *inodedep; + struct jaddref *jaddref; struct mount *mp; offset = blkoff(dp->i_fs, dp->i_offset); @@ -3422,6 +6218,7 @@ softdep_setup_directory_change(bp, dp, ip, newinum dap->da_state = DIRCHG | ATTACHED | DEPCOMPLETE; dap->da_offset = offset; dap->da_newinum = newinum; + LIST_INIT(&dap->da_jwork); } /* @@ -3454,7 +6251,8 @@ softdep_setup_directory_change(bp, dp, ip, newinum dm_next); } else { dirrem->dm_dirinum = pagedep->pd_ino; - add_to_worklist(&dirrem->dm_list); + if (LIST_EMPTY(&dirrem->dm_jremrefhd)) + add_to_worklist(&dirrem->dm_list); } FREE_LOCK(&lk); return; @@ -3483,23 +6281,30 @@ softdep_setup_directory_change(bp, dp, ip, newinum dap->da_pagedep = pagedep; } dirrem->dm_dirinum = pagedep->pd_ino; - add_to_worklist(&dirrem->dm_list); + if (LIST_EMPTY(&dirrem->dm_jremrefhd)) + add_to_worklist(&dirrem->dm_list); } /* - * Link into its inodedep. Put it on the id_bufwait list if the inode - * is not yet written. If it is written, do the post-inode write - * processing to put it on the id_pendinghd list. + * Lookup the jaddref for this journal entry. We must finish + * initializing it and make the diradd write dependent on it. */ - if (inodedep_lookup(mp, newinum, DEPALLOC, &inodedep) == 0 || - (inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) { - dap->da_state |= COMPLETE; - LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); - WORKLIST_INSERT(&inodedep->id_pendinghd, &dap->da_list); - } else { - LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(offset)], - dap, da_pdlist); - WORKLIST_INSERT(&inodedep->id_bufwait, &dap->da_list); - } + if (inodedep_lookup(mp, newinum, 0, &inodedep) == 0) + panic("softdep_setup_directory_change: Lost inodedep."); + jaddref = LIST_FIRST(&inodedep->id_jaddrefhd); + KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, + ("softdep_setup_directory_change: bad jaddref %p", jaddref)); + jaddref->ja_diroff = dp->i_offset; + jaddref->ja_diradd = dap; + LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(offset)], dap, + da_pdlist); + add_to_journal(&jaddref->ja_list); + /* + * If we're making a new name for a directory that has not been + * committed when need to move the dot and dotdot references to + * this new name. + */ + if (inodedep->id_mkdiradd) + merge_diradd(inodedep, dap); FREE_LOCK(&lk); } @@ -3584,6 +6389,8 @@ handle_workitem_remove(dirrem, xp) { struct thread *td = curthread; struct inodedep *inodedep; + struct workhead dotdotwk; + struct worklist *wk; struct vnode *vp; struct inode *ip; ino_t oldinum; @@ -3600,7 +6407,27 @@ handle_workitem_remove(dirrem, xp) if ((inodedep_lookup(dirrem->dm_list.wk_mp, dirrem->dm_oldinum, 0, &inodedep)) == 0) panic("handle_workitem_remove: lost inodedep"); + KASSERT(LIST_EMPTY(&dirrem->dm_jremrefhd), + ("handle_workitem_remove: Journal entries not written.")); /* + * Move all dependencies waiting on the remove to complete + * from the dirrem to the inode inowait list to be completed + * after the inode has been updated and written to disk. Any + * marked MKDIR_PARENT are saved to be completed when the .. ref + * is removed. + */ + LIST_INIT(&dotdotwk); + while ((wk = LIST_FIRST(&dirrem->dm_jwork)) != NULL) { + WORKLIST_REMOVE(wk); + if (wk->wk_state & MKDIR_PARENT) { + wk->wk_state &= ~MKDIR_PARENT; + WORKLIST_INSERT(&dotdotwk, wk); + continue; + } + WORKLIST_INSERT(&inodedep->id_inowait, wk); + } + LIST_SWAP(&dirrem->dm_jwork, &dotdotwk, worklist, wk_list); + /* * Normal file deletion. */ if ((dirrem->dm_state & RMDIR) == 0) { @@ -3611,6 +6438,9 @@ handle_workitem_remove(dirrem, xp) panic("handle_workitem_remove: bad file delta"); inodedep->id_nlinkdelta = ip->i_nlink - ip->i_effnlink; num_dirrem -= 1; + KASSERT(LIST_EMPTY(&dirrem->dm_jwork), + ("handle_workitem_remove: worklist not empty. %s", + TYPENAME(LIST_FIRST(&dirrem->dm_jwork)->wk_type))); WORKITEM_FREE(dirrem, D_DIRREM); FREE_LOCK(&lk); vput(vp); @@ -3639,6 +6469,8 @@ handle_workitem_remove(dirrem, xp) * directory should not change. Thus we skip the followup dirrem. */ if (dirrem->dm_state & DIRCHG) { + KASSERT(LIST_EMPTY(&dirrem->dm_jwork), + ("handle_workitem_remove: DIRCHG and worklist not empty.")); num_dirrem -= 1; WORKITEM_FREE(dirrem, D_DIRREM); FREE_LOCK(&lk); @@ -3689,6 +6521,7 @@ static void handle_workitem_freefile(freefile) struct freefile *freefile; { + struct workhead wkhd; struct fs *fs; struct inodedep *idp; struct ufsmount *ump; @@ -3701,13 +6534,15 @@ handle_workitem_freefile(freefile) error = inodedep_lookup(UFSTOVFS(ump), freefile->fx_oldinum, 0, &idp); FREE_LOCK(&lk); if (error) - panic("handle_workitem_freefile: inodedep survived"); + panic("handle_workitem_freefile: inodedep %p survived", idp); #endif UFS_LOCK(ump); fs->fs_pendinginodes -= 1; UFS_UNLOCK(ump); + LIST_INIT(&wkhd); + LIST_SWAP(&freefile->fx_jwork, &wkhd, worklist, wk_list); if ((error = ffs_freefile(ump, fs, freefile->fx_devvp, - freefile->fx_oldinum, freefile->fx_mode)) != 0) + freefile->fx_oldinum, freefile->fx_mode, &wkhd)) != 0) softdep_error("handle_workitem_freefile", error); ACQUIRE_LOCK(&lk); WORKITEM_FREE(freefile, D_FREEFILE); @@ -3757,8 +6592,9 @@ softdep_disk_io_initiation(bp) { struct worklist *wk; struct worklist marker; - struct indirdep *indirdep; struct inodedep *inodedep; + struct freeblks *freeblks; + struct jfreeblk *jfreeblk; /* * We only care about write operations. There should never @@ -3767,6 +6603,10 @@ softdep_disk_io_initiation(bp) if (bp->b_iocmd != BIO_WRITE) panic("softdep_disk_io_initiation: not write"); + if (bp->b_vflags & BV_BKGRDINPROG) + panic("softdep_disk_io_initiation: Writing buffer with " + "background write in progress: %p", bp); + marker.wk_type = D_LAST + 1; /* Not a normal workitem */ PHOLD(curproc); /* Don't swap out kernel stack */ @@ -3792,46 +6632,40 @@ softdep_disk_io_initiation(bp) continue; case D_INDIRDEP: - indirdep = WK_INDIRDEP(wk); - if (indirdep->ir_state & GOINGAWAY) - panic("disk_io_initiation: indirdep gone"); + initiate_write_indirdep(WK_INDIRDEP(wk), bp); + continue; + + case D_BMSAFEMAP: + initiate_write_bmsafemap(WK_BMSAFEMAP(wk), bp); + continue; + + case D_JSEG: + WK_JSEG(wk)->js_buf = NULL; + continue; + + case D_FREEBLKS: + freeblks = WK_FREEBLKS(wk); + jfreeblk = LIST_FIRST(&freeblks->fb_jfreeblkhd); /* - * If there are no remaining dependencies, this - * will be writing the real pointers, so the - * dependency can be freed. + * We have to wait for the jfreeblks 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 + * the first jwait(). */ - if (LIST_EMPTY(&indirdep->ir_deplisthd)) { - struct buf *bp; - - bp = indirdep->ir_savebp; - bp->b_flags |= B_INVAL | B_NOCACHE; - /* inline expand WORKLIST_REMOVE(wk); */ - wk->wk_state &= ~ONWORKLIST; - LIST_REMOVE(wk, wk_list); - WORKITEM_FREE(indirdep, D_INDIRDEP); - FREE_LOCK(&lk); - brelse(bp); - ACQUIRE_LOCK(&lk); - continue; + if (jfreeblk != NULL) { + LIST_REMOVE(&marker, wk_list); + LIST_INSERT_BEFORE(wk, &marker, wk_list); + jwait(&jfreeblk->jf_list); } - /* - * 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); - indirdep->ir_state &= ~ATTACHED; - indirdep->ir_state |= UNDONE; - bcopy(bp->b_data, indirdep->ir_saveddata, bp->b_bcount); - bcopy(indirdep->ir_savebp->b_data, bp->b_data, - bp->b_bcount); continue; case D_MKDIR: - case D_BMSAFEMAP: case D_ALLOCDIRECT: case D_ALLOCINDIR: + case D_FREEWORK: + case D_FREEDEP: + case D_JSEGDEP: continue; default: @@ -3855,6 +6689,8 @@ initiate_write_filepage(pagedep, bp) struct pagedep *pagedep; struct buf *bp; { + struct jremref *jremref; + struct dirrem *dirrem; struct diradd *dap; struct direct *ep; int i; @@ -3869,6 +6705,16 @@ initiate_write_filepage(pagedep, bp) return; } pagedep->pd_state |= IOSTARTED; + /* + * Wait for all journal remove dependencies to hit the disk. + * We can not allow any potentially conflicting directory adds + * to be visible before removes and rollback is too difficult. + * lk may be dropped and re-acquired, however we hold the buf + * locked so the dependency can not go away. + */ + LIST_FOREACH(dirrem, &pagedep->pd_dirremhd, dm_next) + while ((jremref = LIST_FIRST(&dirrem->dm_jremrefhd)) != NULL) + jwait(&jremref->jr_list); for (i = 0; i < DAHASHSZ; i++) { LIST_FOREACH(dap, &pagedep->pd_diraddhd[i], da_pdlist) { ep = (struct direct *) @@ -3905,6 +6751,7 @@ initiate_write_inodeblock_ufs1(inodedep, bp) struct allocdirect *adp, *lastadp; struct ufs1_dinode *dp; struct ufs1_dinode *sip; + struct jaddref *jaddref; struct fs *fs; ufs_lbn_t i; #ifdef INVARIANTS @@ -3940,32 +6787,41 @@ initiate_write_inodeblock_ufs1(inodedep, bp) */ inodedep->id_savedsize = dp->di_size; inodedep->id_savedextsize = 0; - if (TAILQ_EMPTY(&inodedep->id_inoupdt)) + if (TAILQ_EMPTY(&inodedep->id_inoupdt) && + LIST_EMPTY(&inodedep->id_jaddrefhd)) return; /* + * Revert the link count for every jaddref present. + */ + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) { + dp->di_nlink--; + jaddref->ja_state &= ~ATTACHED; + jaddref->ja_state |= UNDONE; + } + /* * Set the dependencies to busy. */ for (deplist = 0, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; adp = TAILQ_NEXT(adp, ad_next)) { #ifdef INVARIANTS - if (deplist != 0 && prevlbn >= adp->ad_lbn) + if (deplist != 0 && prevlbn >= adp->ad_offset) panic("softdep_write_inodeblock: lbn order"); - prevlbn = adp->ad_lbn; - if (adp->ad_lbn < NDADDR && - dp->di_db[adp->ad_lbn] != adp->ad_newblkno) + prevlbn = adp->ad_offset; + if (adp->ad_offset < NDADDR && + dp->di_db[adp->ad_offset] != adp->ad_newblkno) panic("%s: direct pointer #%jd mismatch %d != %jd", "softdep_write_inodeblock", - (intmax_t)adp->ad_lbn, - dp->di_db[adp->ad_lbn], + (intmax_t)adp->ad_offset, + dp->di_db[adp->ad_offset], (intmax_t)adp->ad_newblkno); - if (adp->ad_lbn >= NDADDR && - dp->di_ib[adp->ad_lbn - NDADDR] != adp->ad_newblkno) + if (adp->ad_offset >= NDADDR && + dp->di_ib[adp->ad_offset - NDADDR] != adp->ad_newblkno) panic("%s: indirect pointer #%jd mismatch %d != %jd", "softdep_write_inodeblock", - (intmax_t)adp->ad_lbn - NDADDR, - dp->di_ib[adp->ad_lbn - NDADDR], + (intmax_t)adp->ad_offset - NDADDR, + dp->di_ib[adp->ad_offset - NDADDR], (intmax_t)adp->ad_newblkno); - deplist |= 1 << adp->ad_lbn; + deplist |= 1 << adp->ad_offset; if ((adp->ad_state & ATTACHED) == 0) panic("softdep_write_inodeblock: Unknown state 0x%x", adp->ad_state); @@ -3981,14 +6837,14 @@ initiate_write_inodeblock_ufs1(inodedep, bp) */ for (lastadp = NULL, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; lastadp = adp, adp = TAILQ_NEXT(adp, ad_next)) { - if (adp->ad_lbn >= NDADDR) + if (adp->ad_offset >= NDADDR) break; - dp->di_db[adp->ad_lbn] = adp->ad_oldblkno; + dp->di_db[adp->ad_offset] = adp->ad_oldblkno; /* keep going until hitting a rollback to a frag */ if (adp->ad_oldsize == 0 || adp->ad_oldsize == fs->fs_bsize) continue; - dp->di_size = fs->fs_bsize * adp->ad_lbn + adp->ad_oldsize; - for (i = adp->ad_lbn + 1; i < NDADDR; i++) { + dp->di_size = fs->fs_bsize * adp->ad_offset + adp->ad_oldsize; + for (i = adp->ad_offset + 1; i < NDADDR; i++) { #ifdef INVARIANTS if (dp->di_db[i] != 0 && (deplist & (1 << i)) == 0) panic("softdep_write_inodeblock: lost dep1"); @@ -4012,8 +6868,8 @@ initiate_write_inodeblock_ufs1(inodedep, bp) * we already checked for fragments in the loop above. */ if (lastadp != NULL && - dp->di_size <= (lastadp->ad_lbn + 1) * fs->fs_bsize) { - for (i = lastadp->ad_lbn; i >= 0; i--) + dp->di_size <= (lastadp->ad_offset + 1) * fs->fs_bsize) { + for (i = lastadp->ad_offset; i >= 0; i--) if (dp->di_db[i] != 0) break; dp->di_size = (i + 1) * fs->fs_bsize; @@ -4030,7 +6886,7 @@ initiate_write_inodeblock_ufs1(inodedep, bp) * postpone fsck, we are stuck with this argument. */ for (; adp; adp = TAILQ_NEXT(adp, ad_next)) - dp->di_ib[adp->ad_lbn - NDADDR] = 0; + dp->di_ib[adp->ad_offset - NDADDR] = 0; } /* @@ -4051,6 +6907,7 @@ initiate_write_inodeblock_ufs2(inodedep, bp) struct allocdirect *adp, *lastadp; struct ufs2_dinode *dp; struct ufs2_dinode *sip; + struct jaddref *jaddref; struct fs *fs; ufs_lbn_t i; #ifdef INVARIANTS @@ -4087,24 +6944,33 @@ initiate_write_inodeblock_ufs2(inodedep, bp) inodedep->id_savedsize = dp->di_size; inodedep->id_savedextsize = dp->di_extsize; if (TAILQ_EMPTY(&inodedep->id_inoupdt) && - TAILQ_EMPTY(&inodedep->id_extupdt)) + TAILQ_EMPTY(&inodedep->id_extupdt) && + LIST_EMPTY(&inodedep->id_jaddrefhd)) return; /* + * Revert the link count for every jaddref present. + */ + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) { + dp->di_nlink--; + jaddref->ja_state &= ~ATTACHED; + jaddref->ja_state |= UNDONE; + } + /* * Set the ext data dependencies to busy. */ for (deplist = 0, adp = TAILQ_FIRST(&inodedep->id_extupdt); adp; adp = TAILQ_NEXT(adp, ad_next)) { #ifdef INVARIANTS - if (deplist != 0 && prevlbn >= adp->ad_lbn) + if (deplist != 0 && prevlbn >= adp->ad_offset) panic("softdep_write_inodeblock: lbn order"); - prevlbn = adp->ad_lbn; - if (dp->di_extb[adp->ad_lbn] != adp->ad_newblkno) + prevlbn = adp->ad_offset; + if (dp->di_extb[adp->ad_offset] != adp->ad_newblkno) panic("%s: direct pointer #%jd mismatch %jd != %jd", "softdep_write_inodeblock", - (intmax_t)adp->ad_lbn, - (intmax_t)dp->di_extb[adp->ad_lbn], + (intmax_t)adp->ad_offset, + (intmax_t)dp->di_extb[adp->ad_offset], (intmax_t)adp->ad_newblkno); - deplist |= 1 << adp->ad_lbn; + deplist |= 1 << adp->ad_offset; if ((adp->ad_state & ATTACHED) == 0) panic("softdep_write_inodeblock: Unknown state 0x%x", adp->ad_state); @@ -4120,12 +6986,12 @@ initiate_write_inodeblock_ufs2(inodedep, bp) */ for (lastadp = NULL, adp = TAILQ_FIRST(&inodedep->id_extupdt); adp; lastadp = adp, adp = TAILQ_NEXT(adp, ad_next)) { - dp->di_extb[adp->ad_lbn] = adp->ad_oldblkno; + dp->di_extb[adp->ad_offset] = adp->ad_oldblkno; /* keep going until hitting a rollback to a frag */ if (adp->ad_oldsize == 0 || adp->ad_oldsize == fs->fs_bsize) continue; - dp->di_extsize = fs->fs_bsize * adp->ad_lbn + adp->ad_oldsize; - for (i = adp->ad_lbn + 1; i < NXADDR; i++) { + dp->di_extsize = fs->fs_bsize * adp->ad_offset + adp->ad_oldsize; + for (i = adp->ad_offset + 1; i < NXADDR; i++) { #ifdef INVARIANTS if (dp->di_extb[i] != 0 && (deplist & (1 << i)) == 0) panic("softdep_write_inodeblock: lost dep1"); @@ -4142,8 +7008,8 @@ initiate_write_inodeblock_ufs2(inodedep, bp) * we already checked for fragments in the loop above. */ if (lastadp != NULL && - dp->di_extsize <= (lastadp->ad_lbn + 1) * fs->fs_bsize) { - for (i = lastadp->ad_lbn; i >= 0; i--) + dp->di_extsize <= (lastadp->ad_offset + 1) * fs->fs_bsize) { + for (i = lastadp->ad_offset; i >= 0; i--) if (dp->di_extb[i] != 0) break; dp->di_extsize = (i + 1) * fs->fs_bsize; @@ -4154,24 +7020,24 @@ initiate_write_inodeblock_ufs2(inodedep, bp) for (deplist = 0, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; adp = TAILQ_NEXT(adp, ad_next)) { #ifdef INVARIANTS - if (deplist != 0 && prevlbn >= adp->ad_lbn) + if (deplist != 0 && prevlbn >= adp->ad_offset) panic("softdep_write_inodeblock: lbn order"); - prevlbn = adp->ad_lbn; - if (adp->ad_lbn < NDADDR && - dp->di_db[adp->ad_lbn] != adp->ad_newblkno) + prevlbn = adp->ad_offset; + if (adp->ad_offset < NDADDR && + dp->di_db[adp->ad_offset] != adp->ad_newblkno) panic("%s: direct pointer #%jd mismatch %jd != %jd", "softdep_write_inodeblock", - (intmax_t)adp->ad_lbn, - (intmax_t)dp->di_db[adp->ad_lbn], + (intmax_t)adp->ad_offset, + (intmax_t)dp->di_db[adp->ad_offset], (intmax_t)adp->ad_newblkno); - if (adp->ad_lbn >= NDADDR && - dp->di_ib[adp->ad_lbn - NDADDR] != adp->ad_newblkno) + if (adp->ad_offset >= NDADDR && + dp->di_ib[adp->ad_offset - NDADDR] != adp->ad_newblkno) panic("%s indirect pointer #%jd mismatch %jd != %jd", "softdep_write_inodeblock:", - (intmax_t)adp->ad_lbn - NDADDR, - (intmax_t)dp->di_ib[adp->ad_lbn - NDADDR], + (intmax_t)adp->ad_offset - NDADDR, + (intmax_t)dp->di_ib[adp->ad_offset - NDADDR], (intmax_t)adp->ad_newblkno); - deplist |= 1 << adp->ad_lbn; + deplist |= 1 << adp->ad_offset; if ((adp->ad_state & ATTACHED) == 0) panic("softdep_write_inodeblock: Unknown state 0x%x", adp->ad_state); @@ -4187,14 +7053,14 @@ initiate_write_inodeblock_ufs2(inodedep, bp) */ for (lastadp = NULL, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; lastadp = adp, adp = TAILQ_NEXT(adp, ad_next)) { - if (adp->ad_lbn >= NDADDR) + if (adp->ad_offset >= NDADDR) break; - dp->di_db[adp->ad_lbn] = adp->ad_oldblkno; + dp->di_db[adp->ad_offset] = adp->ad_oldblkno; /* keep going until hitting a rollback to a frag */ if (adp->ad_oldsize == 0 || adp->ad_oldsize == fs->fs_bsize) continue; - dp->di_size = fs->fs_bsize * adp->ad_lbn + adp->ad_oldsize; - for (i = adp->ad_lbn + 1; i < NDADDR; i++) { + dp->di_size = fs->fs_bsize * adp->ad_offset + adp->ad_oldsize; + for (i = adp->ad_offset + 1; i < NDADDR; i++) { #ifdef INVARIANTS if (dp->di_db[i] != 0 && (deplist & (1 << i)) == 0) panic("softdep_write_inodeblock: lost dep2"); @@ -4218,8 +7084,8 @@ initiate_write_inodeblock_ufs2(inodedep, bp) * we already checked for fragments in the loop above. */ if (lastadp != NULL && - dp->di_size <= (lastadp->ad_lbn + 1) * fs->fs_bsize) { - for (i = lastadp->ad_lbn; i >= 0; i--) + dp->di_size <= (lastadp->ad_offset + 1) * fs->fs_bsize) { + for (i = lastadp->ad_offset; i >= 0; i--) if (dp->di_db[i] != 0) break; dp->di_size = (i + 1) * fs->fs_bsize; @@ -4236,16 +7102,289 @@ initiate_write_inodeblock_ufs2(inodedep, bp) * postpone fsck, we are stuck with this argument. */ for (; adp; adp = TAILQ_NEXT(adp, ad_next)) - dp->di_ib[adp->ad_lbn - NDADDR] = 0; + dp->di_ib[adp->ad_offset - NDADDR] = 0; } +static void +free_indirdep(indirdep) + struct indirdep *indirdep; +{ + + KASSERT(LIST_EMPTY(&indirdep->ir_jwork), + ("free_indirdep: Journal work not empty.")); + if (indirdep->ir_state & ONWORKLIST) + WORKLIST_REMOVE(&indirdep->ir_list); + WORKITEM_FREE(indirdep, D_INDIRDEP); +} + +static void +initiate_write_indirdep(indirdep, bp) + struct indirdep *indirdep; + struct buf *bp; +{ + + 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)) + 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); + indirdep->ir_state &= ~ATTACHED; + indirdep->ir_state |= UNDONE; + bcopy(bp->b_data, indirdep->ir_saveddata, bp->b_bcount); + bcopy(indirdep->ir_savebp->b_data, bp->b_data, + bp->b_bcount); +} + /* + * Called when an inode has been cleared in a cg bitmap. This finally + * eliminates any canceled jaddrefs + */ +void +softdep_setup_inofree(mp, bp, ino, wkhd) + struct mount *mp; + struct buf *bp; + ino_t ino; + struct workhead *wkhd; +{ + struct worklist *wk, *wkn; + struct bmsafemap *bmsafemap; + struct inodedep *inodedep; + uint8_t *inosused; + struct cg *cgp; + struct fs *fs; + + ACQUIRE_LOCK(&lk); + fs = VFSTOUFS(mp)->um_fs; + bmsafemap = bmsafemap_lookup(mp, bp, ino_to_cg(fs, ino)); + cgp = (struct cg *)bp->b_data; + inosused = cg_inosused(cgp); + if (isset(inosused, ino % fs->fs_ipg)) + panic("softdep_setup_inofree: inode %d not freed.", ino); + if (inodedep_lookup(mp, ino, 0, &inodedep)) + panic("softdep_setup_inofree: ino %d has existing inodedep %p", + ino, inodedep); + if (wkhd) { /* XXX Temporary. */ + LIST_FOREACH_SAFE(wk, wkhd, wk_list, wkn) { + if (wk->wk_type != D_JADDREF) + continue; + WORKLIST_REMOVE(wk); + /* + * We can free immediately even if the jaddref isn't attached + * in a background write as now the bitmaps are reconciled. + */ + wk->wk_state |= COMPLETE | ATTACHED; + free_jaddref(WK_JADDREF(wk)); + } + } + FREE_LOCK(&lk); +} + + +/* + * Called via ffs_blkfree() after a set of frags has been cleared from a cg + * map. Any dependencies waiting for the write to clear are added to the + * buf's list and any jnewblks that are being canceled are discarded + * immediately. + */ +void +softdep_setup_blkfree(mp, bp, blkno, frags, wkhd) + struct mount *mp; + struct buf *bp; + ufs2_daddr_t blkno; + int frags; + struct workhead *wkhd; +{ + struct bmsafemap *bmsafemap; + struct jnewblk *jnewblk; + struct worklist *wk, *wkn; + uint8_t *blksfree; + struct cg *cgp; + struct fs *fs; + ufs2_daddr_t jstart; + ufs2_daddr_t jend; + ufs2_daddr_t end; + long bno; + int i; + + ACQUIRE_LOCK(&lk); + 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) { /* XXX Should be temporary. */ + LIST_FOREACH_SAFE(wk, wkhd, wk_list, wkn) { + if (wk->wk_type != D_JNEWBLK) + continue; + jnewblk = WK_JNEWBLK(wk); + KASSERT(jnewblk->jn_state & GOINGAWAY, + ("softdep_setup_blkfree: Freed jnewblk not going away.")); + WORKLIST_REMOVE(wk); + /* + * Assert that this block is free in the bitmap before we + * discard the jnewblk. + */ + cgp = (struct cg *)bp->b_data; + blksfree = cg_blksfree(cgp); + bno = dtogd(fs, jnewblk->jn_blkno); + for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; i++) + if (isclr(blksfree, bno + i)) + panic("softdep_setup_blkfree: %jd - %jd(%jd) not free", + blkno, jnewblk->jn_blkno, jnewblk->jn_lbn); + /* + * Even if it's not attached we can free immediately as the + * new bitmap is correct. + */ + 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(D_BMSAFEMAP, __LINE__, &bp->b_dep, wkhd); + } + /* + * Assert that we are not freeing a block which has an outstanding + * allocation dependency. + */ + fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs; + end = blkno + frags; + LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) { + /* + * Don't match against blocks that will be freed when the + * background write is done. + */ + if ((jnewblk->jn_state & (ATTACHED | COMPLETE | DEPCOMPLETE)) == + (COMPLETE | DEPCOMPLETE)) + continue; + jstart = jnewblk->jn_blkno + jnewblk->jn_oldfrags; + jend = jnewblk->jn_blkno + jnewblk->jn_frags; + if ((blkno >= jstart && blkno < jend) || + (end > jstart && end <= jend)) { + printf("state 0x%X %jd - %d %d dep %p\n", + jnewblk->jn_state, jnewblk->jn_blkno, + jnewblk->jn_oldfrags, jnewblk->jn_frags, + jnewblk->jn_dep); + panic("softdep_setup_blkfree: " + "%jd-%jd(%d) overlaps with %jd-%jd", + blkno, end, frags, jstart, jend); + } + } + FREE_LOCK(&lk); +} + +static void +initiate_write_bmsafemap(bmsafemap, bp) + struct bmsafemap *bmsafemap; + struct buf *bp; /* The cg block. */ +{ + struct jaddref *jaddref; + struct jnewblk *jnewblk; + uint8_t *inosused; + uint8_t *blksfree; + struct cg *cgp; + struct fs *fs; + int cleared; + ino_t ino; + long bno; + int i; + + if (bmsafemap->sm_state & IOSTARTED) + panic("initiate_write_bmsafemap: Already started\n"); + bmsafemap->sm_state |= IOSTARTED; + /* + * Clear any inode allocations which are pending journal writes. + */ + if (LIST_FIRST(&bmsafemap->sm_jaddrefhd) != NULL) { + cgp = (struct cg *)bp->b_data; + fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs; + inosused = cg_inosused(cgp); + LIST_FOREACH(jaddref, &bmsafemap->sm_jaddrefhd, ja_bmdeps) { + ino = jaddref->ja_ino % fs->fs_ipg; + /* + * If this is a background copy the inode may not + * be marked used yet. + */ + if (isset(inosused, ino)) { + if ((jaddref->ja_mode & IFMT) == IFDIR) + cgp->cg_cs.cs_ndir--; + cgp->cg_cs.cs_nifree++; + clrbit(inosused, ino); + jaddref->ja_state &= ~ATTACHED; + jaddref->ja_state |= UNDONE; + } else if ((bp->b_xflags & BX_BKGRDMARKER) == 0) + panic("initiate_write_bmsafemap: inode %d " + "marked free", jaddref->ja_ino); + } + } + /* + * Clear any block allocations which are pending journal writes. + */ + if (LIST_FIRST(&bmsafemap->sm_jnewblkhd) != NULL) { + cgp = (struct cg *)bp->b_data; + fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs; + blksfree = cg_blksfree(cgp); + LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) { + bno = dtogd(fs, jnewblk->jn_blkno); + cleared = 0; + for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; + i++) { + if (isclr(blksfree, bno + i)) { + cleared = 1; + setbit(blksfree, bno + i); + } + } + /* + * We may not clear the block if it's a background + * copy. In that case there is no reason to detach + * it. + */ + if (cleared) { + jnewblk->jn_state &= ~ATTACHED; + jnewblk->jn_state |= UNDONE; + } else if ((bp->b_xflags & BX_BKGRDMARKER) == 0) + panic("initiate_write_bmsafemap: block %jd " + "marked free", jnewblk->jn_blkno); + } + } + /* + * Move allocation lists to the written lists so they can be + * cleared once the block write is complete. + */ + LIST_SWAP(&bmsafemap->sm_allocdirecthd, &bmsafemap->sm_allocdirectwr, + allocdirect, ad_deps); + LIST_SWAP(&bmsafemap->sm_allocindirhd, &bmsafemap->sm_allocindirwr, + allocindir, ai_deps); + LIST_SWAP(&bmsafemap->sm_inodedephd, &bmsafemap->sm_inodedepwr, + inodedep, id_deps); + LIST_SWAP(&bmsafemap->sm_newblkhd, &bmsafemap->sm_newblkwr, + newblk, nb_deps); +} + +/* * This routine is called during the completion interrupt * service routine for a disk write (from the procedure called * by the device driver to inform the filesystem caches of * a request completion). It should be called early in this * procedure, before the block is made available to other * processes or other routines are called. + * */ static void softdep_disk_write_complete(bp) @@ -4254,12 +7393,7 @@ softdep_disk_write_complete(bp) struct worklist *wk; struct worklist *owk; struct workhead reattach; - struct newblk *newblk; - struct allocindir *aip; - struct allocdirect *adp; - struct indirdep *indirdep; - struct inodedep *inodedep; - struct bmsafemap *bmsafemap; + struct buf *sbp; /* * If an error occurred while doing the write, then the data @@ -4271,8 +7405,9 @@ softdep_disk_write_complete(bp) /* * This lock must not be released anywhere in this code segment. */ + sbp = NULL; + owk = NULL; ACQUIRE_LOCK(&lk); - owk = NULL; while ((wk = LIST_FIRST(&bp->b_dep)) != NULL) { WORKLIST_REMOVE(wk); if (wk == owk) @@ -4291,33 +7426,8 @@ softdep_disk_write_complete(bp) continue; case D_BMSAFEMAP: - bmsafemap = WK_BMSAFEMAP(wk); - while ((newblk = LIST_FIRST(&bmsafemap->sm_newblkhd))) { - newblk->nb_state |= DEPCOMPLETE; - newblk->nb_bmsafemap = NULL; - LIST_REMOVE(newblk, nb_deps); - } - while ((adp = - LIST_FIRST(&bmsafemap->sm_allocdirecthd))) { - adp->ad_state |= DEPCOMPLETE; - adp->ad_buf = NULL; - LIST_REMOVE(adp, ad_deps); - handle_allocdirect_partdone(adp); - } - while ((aip = - LIST_FIRST(&bmsafemap->sm_allocindirhd))) { - aip->ai_state |= DEPCOMPLETE; - aip->ai_buf = NULL; - LIST_REMOVE(aip, ai_deps); - handle_allocindir_partdone(aip); - } - while ((inodedep = - LIST_FIRST(&bmsafemap->sm_inodedephd)) != NULL) { - inodedep->id_state |= DEPCOMPLETE; - LIST_REMOVE(inodedep, id_deps); - inodedep->id_buf = NULL; - } - WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); + if (handle_written_bmsafemap(WK_BMSAFEMAP(wk), bp)) + WORKLIST_INSERT(&reattach, wk); continue; case D_MKDIR: @@ -4325,37 +7435,42 @@ softdep_disk_write_complete(bp) continue; case D_ALLOCDIRECT: - adp = WK_ALLOCDIRECT(wk); - adp->ad_state |= COMPLETE; - handle_allocdirect_partdone(adp); + wk->wk_state |= COMPLETE; + handle_allocdirect_partdone(WK_ALLOCDIRECT(wk), NULL); continue; case D_ALLOCINDIR: - aip = WK_ALLOCINDIR(wk); - aip->ai_state |= COMPLETE; - handle_allocindir_partdone(aip); + wk->wk_state |= COMPLETE; + handle_allocindir_partdone(WK_ALLOCINDIR(wk)); continue; case D_INDIRDEP: - indirdep = WK_INDIRDEP(wk); - if (indirdep->ir_state & GOINGAWAY) - panic("disk_write_complete: indirdep gone"); - bcopy(indirdep->ir_saveddata, bp->b_data, bp->b_bcount); - free(indirdep->ir_saveddata, M_INDIRDEP); - indirdep->ir_saveddata = 0; - indirdep->ir_state &= ~UNDONE; - indirdep->ir_state |= ATTACHED; - 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"); - } - WORKLIST_INSERT(&reattach, wk); - if ((bp->b_flags & B_DELWRI) == 0) - stat_indir_blk_ptrs++; - bdirty(bp); + if (handle_written_indirdep(WK_INDIRDEP(wk), bp, &sbp)) + WORKLIST_INSERT(&reattach, wk); continue; + case D_FREEBLKS: + wk->wk_state |= COMPLETE; + if ((wk->wk_state & ALLCOMPLETE) == ALLCOMPLETE) + add_to_worklist(wk); + continue; + + case D_FREEWORK: + 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; + + case D_JSEG: + handle_written_jseg(WK_JSEG(wk), bp); + continue; + default: panic("handle_disk_write_complete: Unknown type %s", TYPENAME(wk->wk_type)); @@ -4370,6 +7485,8 @@ softdep_disk_write_complete(bp) WORKLIST_INSERT(&bp->b_dep, wk); } FREE_LOCK(&lk); + if (sbp) + brelse(sbp); } /* @@ -4378,17 +7495,18 @@ softdep_disk_write_complete(bp) * splbio interrupts blocked. */ static void -handle_allocdirect_partdone(adp) +handle_allocdirect_partdone(adp, wkhd) struct allocdirect *adp; /* the completed allocdirect */ + struct workhead *wkhd; /* Work to do when inode is writtne. */ { struct allocdirectlst *listhead; struct allocdirect *listadp; struct inodedep *inodedep; - long bsize, delay; + long bsize; if ((adp->ad_state & ALLCOMPLETE) != ALLCOMPLETE) return; - if (adp->ad_buf != NULL) + if (adp->ad_bmsafemap != NULL) panic("handle_allocdirect_partdone: dangling dep"); /* * The on-disk inode cannot claim to be any larger than the last @@ -4441,23 +7559,27 @@ static void /* * If we have found the just finished dependency, then free * it along with anything that follows it that is complete. - * If the inode still has a bitmap dependency, then it has - * never been written to disk, hence the on-disk inode cannot - * reference the old fragment so we can free it without delay. + * If the inode is not ALLCOMPLETE the pointer may not yet + * be written. Place the allocdirect on the bufwait to + * be freed when we're sure it is reachable on disk. */ - delay = (inodedep->id_state & DEPCOMPLETE); + if ((inodedep->id_state & ALLCOMPLETE) != ALLCOMPLETE) + wkhd = &inodedep->id_bufwait; for (; adp; adp = listadp) { listadp = TAILQ_NEXT(adp, ad_next); if ((adp->ad_state & ALLCOMPLETE) != ALLCOMPLETE) return; - free_allocdirect(listhead, adp, delay); + TAILQ_REMOVE(listhead, adp, ad_next); + if (wkhd) + WORKLIST_INSERT(wkhd, &adp->ad_list); + else + free_allocdirect(adp); } } /* - * Called from within softdep_disk_write_complete above. Note that - * this routine is always called from interrupt level with further - * splbio interrupts blocked. + * Called from within softdep_disk_write_complete above. This routine + * completes successfully written allocindirs. */ static void handle_allocindir_partdone(aip) @@ -4467,11 +7589,11 @@ handle_allocindir_partdone(aip) if ((aip->ai_state & ALLCOMPLETE) != ALLCOMPLETE) return; - if (aip->ai_buf != NULL) + if (aip->ai_bmsafemap != NULL) panic("handle_allocindir_partdone: dangling dependency"); indirdep = aip->ai_indirdep; + LIST_REMOVE(aip, ai_next); if (indirdep->ir_state & UNDONE) { - LIST_REMOVE(aip, ai_next); LIST_INSERT_HEAD(&indirdep->ir_donehd, aip, ai_next); return; } @@ -4481,12 +7603,119 @@ handle_allocindir_partdone(aip) else ((ufs2_daddr_t *)indirdep->ir_savebp->b_data)[aip->ai_offset] = aip->ai_newblkno; - LIST_REMOVE(aip, ai_next); - if (aip->ai_freefrag != NULL) - add_to_worklist(&aip->ai_freefrag->ff_list); - WORKITEM_FREE(aip, D_ALLOCINDIR); + /* + * Await the pointer write. + */ + LIST_INSERT_HEAD(&indirdep->ir_writehd, aip, ai_next); } +static void +handle_jwork(wkhd) + struct workhead *wkhd; +{ + struct worklist *wk; + + while ((wk = LIST_FIRST(wkhd)) != NULL) { + WORKLIST_REMOVE(wk); + switch (wk->wk_type) { + case D_JSEGDEP: + free_jsegdep(WK_JSEGDEP(wk)); + continue; + default: + panic("handle_jwork: Unknown type %s\n", + TYPENAME(wk->wk_type)); + } + } +} + +static struct freefile * +handle_bufwait(inodedep, refhd) + struct inodedep *inodedep; + struct workhead *refhd; +{ + struct jaddref *jaddref; + struct freefile *freefile; + struct worklist *wk; + + freefile = NULL; + while ((wk = LIST_FIRST(&inodedep->id_bufwait)) != NULL) { + WORKLIST_REMOVE(wk); + switch (wk->wk_type) { + case D_FREEFILE: + /* + * We defer adding freefile to the worklist + * until all other additions have been made to + * ensure that it will be done after all the + * old blocks have been freed. + */ + if (freefile != NULL) + panic("handle_bufwait: freefile"); + freefile = WK_FREEFILE(wk); + continue; + + case D_MKDIR: + handle_written_mkdir(WK_MKDIR(wk), MKDIR_PARENT); + continue; + + case D_DIRADD: + diradd_inode_written(WK_DIRADD(wk), inodedep); + continue; + + case D_FREEFRAG: + wk->wk_state |= COMPLETE; + if ((wk->wk_state & ALLCOMPLETE) != ALLCOMPLETE) + continue; + add_to_worklist(wk); + continue; + + case D_DIRREM: + wk->wk_state |= COMPLETE; + add_to_worklist(wk); + continue; + + case D_ALLOCDIRECT: + free_allocdirect(WK_ALLOCDIRECT(wk)); + continue; + + case D_JSEGDEP: + free_jsegdep(WK_JSEGDEP(wk)); + continue; + + case D_JADDREF: + jaddref = WK_JADDREF(wk); + /* + * We have to remove this journal entry from the + * inode's list as soon as it's written so the + * inodedep can be freed. + */ + if (jaddref->ja_state & ONDEPLIST) { + jaddref->ja_state &= ~ONDEPLIST; + LIST_REMOVE(jaddref, ja_inodeps); + } + /* + * Transfer any jaddrefs to the list to be freed with + * the bitmap if we're handling a removed file. + */ + if (refhd == NULL) { + wk->wk_state |= COMPLETE; + free_jaddref(jaddref); + } else + WORKLIST_INSERT(refhd, wk); + continue; + + case D_JNEWBLK: + wk->wk_state |= COMPLETE; + free_jnewblk(WK_JNEWBLK(wk)); + continue; + + default: + panic("handle_bufwait: Unknown type %p(%s)", + wk, TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } + return (freefile); +} /* * Called from within softdep_disk_write_complete above to restore * in-memory inode block contents to their most up-to-date state. Note @@ -4498,10 +7727,12 @@ handle_written_inodeblock(inodedep, bp) struct inodedep *inodedep; struct buf *bp; /* buffer containing the inode block */ { - struct worklist *wk, *filefree; + struct freefile *freefile; struct allocdirect *adp, *nextadp; struct ufs1_dinode *dp1 = NULL; struct ufs2_dinode *dp2 = NULL; + struct jaddref *jaddref, *tmp; + struct workhead wkhd; int hadchanges, fstype; if ((inodedep->id_state & IOSTARTED) == 0) @@ -4541,49 +7772,64 @@ handle_written_inodeblock(inodedep, bp) * the inode could be updated. */ hadchanges = 0; + /* + * Restore the link count for every jaddref present. + */ + LIST_FOREACH_SAFE(jaddref, &inodedep->id_jaddrefhd, ja_inodeps, tmp) { + hadchanges = 1; + if ((jaddref->ja_state & UNDONE) == 0) + continue; + if (fstype == UFS1) + dp1->di_nlink++; + else + dp2->di_nlink++; + jaddref->ja_state &= ~UNDONE; + jaddref->ja_state |= ATTACHED; + free_jaddref(jaddref); + } for (adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; adp = nextadp) { nextadp = TAILQ_NEXT(adp, ad_next); if (adp->ad_state & ATTACHED) panic("handle_written_inodeblock: new entry"); if (fstype == UFS1) { - if (adp->ad_lbn < NDADDR) { - if (dp1->di_db[adp->ad_lbn]!=adp->ad_oldblkno) + if (adp->ad_offset < NDADDR) { + if (dp1->di_db[adp->ad_offset]!=adp->ad_oldblkno) panic("%s %s #%jd mismatch %d != %jd", "handle_written_inodeblock:", "direct pointer", - (intmax_t)adp->ad_lbn, - dp1->di_db[adp->ad_lbn], + (intmax_t)adp->ad_offset, + dp1->di_db[adp->ad_offset], (intmax_t)adp->ad_oldblkno); - dp1->di_db[adp->ad_lbn] = adp->ad_newblkno; + dp1->di_db[adp->ad_offset] = adp->ad_newblkno; } else { - if (dp1->di_ib[adp->ad_lbn - NDADDR] != 0) + if (dp1->di_ib[adp->ad_offset - NDADDR] != 0) panic("%s: %s #%jd allocated as %d", "handle_written_inodeblock", "indirect pointer", - (intmax_t)adp->ad_lbn - NDADDR, - dp1->di_ib[adp->ad_lbn - NDADDR]); - dp1->di_ib[adp->ad_lbn - NDADDR] = + (intmax_t)adp->ad_offset - NDADDR, + dp1->di_ib[adp->ad_offset - NDADDR]); + dp1->di_ib[adp->ad_offset - NDADDR] = adp->ad_newblkno; } } else { - if (adp->ad_lbn < NDADDR) { - if (dp2->di_db[adp->ad_lbn]!=adp->ad_oldblkno) + if (adp->ad_offset < NDADDR) { + if (dp2->di_db[adp->ad_offset]!=adp->ad_oldblkno) panic("%s: %s #%jd %s %jd != %jd", "handle_written_inodeblock", "direct pointer", - (intmax_t)adp->ad_lbn, "mismatch", - (intmax_t)dp2->di_db[adp->ad_lbn], + (intmax_t)adp->ad_offset, "mismatch", + (intmax_t)dp2->di_db[adp->ad_offset], (intmax_t)adp->ad_oldblkno); - dp2->di_db[adp->ad_lbn] = adp->ad_newblkno; + dp2->di_db[adp->ad_offset] = adp->ad_newblkno; } else { - if (dp2->di_ib[adp->ad_lbn - NDADDR] != 0) + if (dp2->di_ib[adp->ad_offset - NDADDR] != 0) panic("%s: %s #%jd allocated as %jd", "handle_written_inodeblock", "indirect pointer", - (intmax_t)adp->ad_lbn - NDADDR, + (intmax_t)adp->ad_offset - NDADDR, (intmax_t) - dp2->di_ib[adp->ad_lbn - NDADDR]); - dp2->di_ib[adp->ad_lbn - NDADDR] = + dp2->di_ib[adp->ad_offset - NDADDR]); + dp2->di_ib[adp->ad_offset - NDADDR] = adp->ad_newblkno; } } @@ -4595,13 +7841,13 @@ handle_written_inodeblock(inodedep, bp) nextadp = TAILQ_NEXT(adp, ad_next); if (adp->ad_state & ATTACHED) panic("handle_written_inodeblock: new entry"); - if (dp2->di_extb[adp->ad_lbn] != adp->ad_oldblkno) + if (dp2->di_extb[adp->ad_offset] != adp->ad_oldblkno) panic("%s: direct pointers #%jd %s %jd != %jd", "handle_written_inodeblock", - (intmax_t)adp->ad_lbn, "mismatch", - (intmax_t)dp2->di_extb[adp->ad_lbn], + (intmax_t)adp->ad_offset, "mismatch", + (intmax_t)dp2->di_extb[adp->ad_offset], (intmax_t)adp->ad_oldblkno); - dp2->di_extb[adp->ad_lbn] = adp->ad_newblkno; + dp2->di_extb[adp->ad_offset] = adp->ad_newblkno; adp->ad_state &= ~UNDONE; adp->ad_state |= ATTACHED; hadchanges = 1; @@ -4640,10 +7886,11 @@ handle_written_inodeblock(inodedep, bp) /* * Process any allocdirects that completed during the update. */ + LIST_INIT(&wkhd); if ((adp = TAILQ_FIRST(&inodedep->id_inoupdt)) != NULL) - handle_allocdirect_partdone(adp); + handle_allocdirect_partdone(adp, &wkhd); if ((adp = TAILQ_FIRST(&inodedep->id_extupdt)) != NULL) - handle_allocdirect_partdone(adp); + handle_allocdirect_partdone(adp, &wkhd); /* * Process deallocations that were held pending until the * inode had been written to disk. Freeing of the inode @@ -4651,55 +7898,24 @@ handle_written_inodeblock(inodedep, bp) * avoid creation of new triples * before the old ones have been deleted. */ - filefree = NULL; - while ((wk = LIST_FIRST(&inodedep->id_bufwait)) != NULL) { - WORKLIST_REMOVE(wk); - switch (wk->wk_type) { + freefile = handle_bufwait(inodedep, NULL); + if (freefile && !LIST_EMPTY(&wkhd)) { + WORKLIST_INSERT(&wkhd, &freefile->fx_list); + freefile = NULL; + } + /* + * Move rolled forward dependency completions to the bufwait list + * now that those that were already written have been processed. + */ + if (!LIST_EMPTY(&wkhd) && hadchanges == 0) + panic("handle_written_inodeblock: bufwait but no changes"); + jwork_move(D_INODEDEP, __LINE__, &inodedep->id_bufwait, &wkhd); - case D_FREEFILE: - /* - * We defer adding filefree to the worklist until - * all other additions have been made to ensure - * that it will be done after all the old blocks - * have been freed. - */ - if (filefree != NULL) - panic("handle_written_inodeblock: filefree"); - filefree = wk; - continue; - - case D_MKDIR: - handle_written_mkdir(WK_MKDIR(wk), MKDIR_PARENT); - continue; - - case D_DIRADD: - diradd_inode_written(WK_DIRADD(wk), inodedep); - continue; - - case D_FREEBLKS: - wk->wk_state |= COMPLETE; - if ((wk->wk_state & ALLCOMPLETE) != ALLCOMPLETE) - continue; - /* -- fall through -- */ - case D_FREEFRAG: - case D_DIRREM: - add_to_worklist(wk); - continue; - - case D_NEWDIRBLK: - free_newdirblk(WK_NEWDIRBLK(wk)); - continue; - - default: - panic("handle_written_inodeblock: Unknown type %s", - TYPENAME(wk->wk_type)); - /* NOTREACHED */ - } - } - if (filefree != NULL) { + if (freefile != NULL) { if (free_inodedep(inodedep) == 0) - panic("handle_written_inodeblock: live inodedep"); - add_to_worklist(filefree); + panic("handle_written_inodeblock: live inodedep %p", + inodedep); + add_to_worklist(&freefile->fx_list); return (0); } @@ -4707,12 +7923,84 @@ handle_written_inodeblock(inodedep, bp) * If no outstanding dependencies, free it. */ if (free_inodedep(inodedep) || - (TAILQ_FIRST(&inodedep->id_inoupdt) == 0 && - TAILQ_FIRST(&inodedep->id_extupdt) == 0)) + (LIST_FIRST(&inodedep->id_jaddrefhd) == 0 && + TAILQ_FIRST(&inodedep->id_inoupdt) == 0 && + TAILQ_FIRST(&inodedep->id_extupdt) == 0 && + LIST_FIRST(&inodedep->id_bufwait) == 0)) return (0); return (hadchanges); } +static int +handle_written_indirdep(indirdep, bp, bpp) + struct indirdep *indirdep; + struct buf *bp; + struct buf **bpp; +{ + struct allocindir *aip; + int chgs; + + if (indirdep->ir_state & GOINGAWAY) + panic("disk_write_complete: indirdep gone"); + 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; + chgs = 1; + } + indirdep->ir_state &= ~UNDONE; + indirdep->ir_state |= ATTACHED; + /* + * Move allocindirs with written pointers to the completehd if + * the the indirdep's pointer is not yet written. Otherwise + * free them here. + */ + while ((aip = LIST_FIRST(&indirdep->ir_writehd)) != 0) { + if ((indirdep->ir_state & DEPCOMPLETE) == 0) { + LIST_REMOVE(aip, ai_next); + LIST_INSERT_HEAD(&indirdep->ir_completehd, aip, + ai_next); + continue; + } + free_allocindir(aip, NULL, NULL, 0); + } + /* + * 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 there are no fresh dependencies and none waiting on writes + * we can free the indirdep. The caller is responsble for + * releasing sbp when it is safe to do so. + */ + if ((indirdep->ir_state & DEPCOMPLETE) && + LIST_EMPTY(&indirdep->ir_deplisthd) && + LIST_EMPTY(&indirdep->ir_writehd)) { + struct buf *sbp; + sbp = indirdep->ir_savebp; + sbp->b_flags |= B_INVAL | B_NOCACHE; + if (indirdep->ir_state & ONDEPLIST) + LIST_REMOVE(indirdep, ir_next); + free_indirdep(indirdep); + *bpp = sbp; + } + if ((bp->b_flags & B_DELWRI) == 0) + stat_indir_blk_ptrs++; + if (chgs) + bdirty(bp); + return (chgs); +} + /* * Process a diradd entry after its dependent inode has been written. * This routine must be called with splbio interrupts blocked. @@ -4722,50 +8010,187 @@ diradd_inode_written(dap, inodedep) struct diradd *dap; struct inodedep *inodedep; { - struct pagedep *pagedep; dap->da_state |= COMPLETE; - if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { - if (dap->da_state & DIRCHG) - pagedep = dap->da_previous->dm_pagedep; - else - pagedep = dap->da_pagedep; - LIST_REMOVE(dap, da_pdlist); - LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); - } + complete_diradd(dap); WORKLIST_INSERT(&inodedep->id_pendinghd, &dap->da_list); } /* - * Handle the completion of a mkdir dependency. + * Returns true if the bmsafemap will have rollbacks when written. Must + * only be called with lk and the buf lock on the cg held. */ +static int +bmsafemap_rollbacks(bmsafemap) + struct bmsafemap *bmsafemap; +{ + + return (!LIST_EMPTY(&bmsafemap->sm_jaddrefhd) | + !LIST_EMPTY(&bmsafemap->sm_jnewblkhd)); +} + +/* + * Complete a write to a bmsafemap structure. Roll forward any bitmap + * changes if it's not a background write. Set all written dependencies + * to DEPCOMPLETE and free the structure if possible. + */ +static int +handle_written_bmsafemap(bmsafemap, bp) + struct bmsafemap *bmsafemap; + struct buf *bp; +{ + struct newblk *newblk; + struct allocindir *aip; + struct allocdirect *adp; + struct inodedep *inodedep; + struct jaddref *jaddref, *jatmp; + struct jnewblk *jnewblk, *jntmp; + uint8_t *inosused; + uint8_t *blksfree; + struct cg *cgp; + struct fs *fs; + ino_t ino; + long bno; + int chgs; + int i; + + if ((bmsafemap->sm_state & IOSTARTED) == 0) + panic("initiate_write_bmsafemap: Not started\n"); + chgs = 0; + bmsafemap->sm_state &= ~IOSTARTED; + /* + * Restore unwritten inode allocation pending jaddref writes. + */ + if (!LIST_EMPTY(&bmsafemap->sm_jaddrefhd)) { + cgp = (struct cg *)bp->b_data; + fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs; + inosused = cg_inosused(cgp); + LIST_FOREACH_SAFE(jaddref, &bmsafemap->sm_jaddrefhd, + ja_bmdeps, jatmp) { + if ((jaddref->ja_state & UNDONE) == 0) + continue; + ino = jaddref->ja_ino % fs->fs_ipg; + if (isset(inosused, ino)) + panic("handle_written_bmsafemap: " + "re-allocated inode"); + if ((bp->b_xflags & BX_BKGRDMARKER) == 0) { + if ((jaddref->ja_mode & IFMT) == IFDIR) + cgp->cg_cs.cs_ndir++; + cgp->cg_cs.cs_nifree--; + setbit(inosused, ino); + chgs = 1; + } + jaddref->ja_state &= ~UNDONE; + jaddref->ja_state |= ATTACHED; + free_jaddref(jaddref); + } + } + /* + * Restore any block allocations which are pending journal writes. + */ + if (LIST_FIRST(&bmsafemap->sm_jnewblkhd) != NULL) { + cgp = (struct cg *)bp->b_data; + fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs; + blksfree = cg_blksfree(cgp); + LIST_FOREACH_SAFE(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps, + jntmp) { + if ((jnewblk->jn_state & UNDONE) == 0) + continue; + bno = dtogd(fs, jnewblk->jn_blkno); + for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; + i++) { + if (bp->b_xflags & BX_BKGRDMARKER) + break; + if ((jnewblk->jn_state & NEWBLOCK) == 0 && + isclr(blksfree, bno + i)) + panic("handle_written_bmsafemap: " + "re-allocated fragment"); + clrbit(blksfree, bno + i); + chgs = 1; + } + jnewblk->jn_state &= ~(UNDONE | NEWBLOCK); + jnewblk->jn_state |= ATTACHED; + free_jnewblk(jnewblk); + } + } + while ((newblk = LIST_FIRST(&bmsafemap->sm_newblkwr))) { + newblk->nb_state |= DEPCOMPLETE; + newblk->nb_bmsafemap = NULL; + LIST_REMOVE(newblk, nb_deps); + } + while ((adp = LIST_FIRST(&bmsafemap->sm_allocdirectwr))) { + adp->ad_state |= DEPCOMPLETE; + adp->ad_state &= ~ONDEPLIST; + adp->ad_bmsafemap = NULL; + LIST_REMOVE(adp, ad_deps); + handle_allocdirect_partdone(adp, NULL); + } + while ((aip = LIST_FIRST(&bmsafemap->sm_allocindirwr))) { + aip->ai_state |= DEPCOMPLETE; + aip->ai_state &= ~ONDEPLIST; + aip->ai_bmsafemap = NULL; + LIST_REMOVE(aip, ai_deps); + handle_allocindir_partdone(aip); + } + while ((inodedep = LIST_FIRST(&bmsafemap->sm_inodedepwr)) != NULL) { + inodedep->id_state |= DEPCOMPLETE; + inodedep->id_state &= ~ONDEPLIST; + LIST_REMOVE(inodedep, id_deps); + inodedep->id_bmsafemap = NULL; + } + if (LIST_EMPTY(&bmsafemap->sm_jaddrefhd) && + LIST_EMPTY(&bmsafemap->sm_jnewblkhd) && + LIST_EMPTY(&bmsafemap->sm_newblkhd) && + LIST_EMPTY(&bmsafemap->sm_allocdirecthd) && + LIST_EMPTY(&bmsafemap->sm_allocindirhd) && + LIST_EMPTY(&bmsafemap->sm_inodedephd)) { + if (chgs) + bdirty(bp); + LIST_REMOVE(bmsafemap, sm_hash); + WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); + return (0); + } + bdirty(bp); + return (1); +} + +/* + * Try to free a mkdir dependency. + */ static void -handle_written_mkdir(mkdir, type) +complete_mkdir(mkdir) struct mkdir *mkdir; - int type; { struct diradd *dap; - struct pagedep *pagedep; - if (mkdir->md_state != type) - panic("handle_written_mkdir: bad type"); + if ((mkdir->md_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + LIST_REMOVE(mkdir, md_mkdirs); dap = mkdir->md_diradd; - dap->da_state &= ~type; - if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) == 0) + dap->da_state &= ~(mkdir->md_state & (MKDIR_PARENT | MKDIR_BODY)); + if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) == 0) { dap->da_state |= DEPCOMPLETE; - if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { - if (dap->da_state & DIRCHG) - pagedep = dap->da_previous->dm_pagedep; - else - pagedep = dap->da_pagedep; - LIST_REMOVE(dap, da_pdlist); - LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); + complete_diradd(dap); } - LIST_REMOVE(mkdir, md_mkdirs); WORKITEM_FREE(mkdir, D_MKDIR); } /* + * Handle the completion of a mkdir dependency. + */ +static void +handle_written_mkdir(mkdir, type) + struct mkdir *mkdir; + int type; +{ + + if ((mkdir->md_state & (MKDIR_PARENT | MKDIR_BODY)) != type) + panic("handle_written_mkdir: bad type"); + mkdir->md_state |= COMPLETE; + complete_mkdir(mkdir); +} + +/* * Called from within softdep_disk_write_complete above. * A write operation was just completed. Removed inodes can * now be freed and associated block pointers may be committed. @@ -4790,7 +8215,10 @@ handle_written_filepage(pagedep, bp) */ while ((dirrem = LIST_FIRST(&pagedep->pd_dirremhd)) != NULL) { LIST_REMOVE(dirrem, dm_next); + dirrem->dm_state |= COMPLETE; dirrem->dm_dirinum = pagedep->pd_ino; + KASSERT(LIST_EMPTY(&dirrem->dm_jremrefhd), + ("handle_written_filepage: Journal entries not written.")); add_to_worklist(&dirrem->dm_list); } /* @@ -4800,7 +8228,7 @@ handle_written_filepage(pagedep, bp) */ if ((pagedep->pd_state & NEWBLOCK) == 0) while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != NULL) - free_diradd(dap); + free_diradd(dap, NULL); /* * Uncommitted directory entries must be restored. */ @@ -4908,6 +8336,7 @@ softdep_update_inodeblock(ip, bp, waitfor) int waitfor; /* nonzero => update must be allowed */ { struct inodedep *inodedep; + struct jaddref *jaddref; struct worklist *wk; struct mount *mp; struct buf *ibp; @@ -4922,6 +8351,7 @@ softdep_update_inodeblock(ip, bp, waitfor) */ mp = UFSTOVFS(ip->i_ump); ACQUIRE_LOCK(&lk); +again: if (inodedep_lookup(mp, ip->i_number, 0, &inodedep) == 0) { FREE_LOCK(&lk); if (ip->i_effnlink != ip->i_nlink) @@ -4931,6 +8361,17 @@ softdep_update_inodeblock(ip, bp, waitfor) if (inodedep->id_nlinkdelta != ip->i_nlink - ip->i_effnlink) panic("softdep_update_inodeblock: bad delta"); /* + * If we're flushing all dependencies we must also move any waiting + * for journal writes onto the bufwait list prior to I/O. + */ + if (waitfor) + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) { + if (jaddref->ja_state & (GOINGAWAY | COMPLETE)) + continue; + jwait(&jaddref->ja_list); + goto again; + } + /* * Changes have been initiated. Anything depending on these * changes cannot occur until this inode has been written. */ @@ -4945,10 +8386,12 @@ softdep_update_inodeblock(ip, bp, waitfor) */ merge_inode_lists(&inodedep->id_newinoupdt, &inodedep->id_inoupdt); if (!TAILQ_EMPTY(&inodedep->id_inoupdt)) - handle_allocdirect_partdone(TAILQ_FIRST(&inodedep->id_inoupdt)); + handle_allocdirect_partdone(TAILQ_FIRST(&inodedep->id_inoupdt), + NULL); merge_inode_lists(&inodedep->id_newextupdt, &inodedep->id_extupdt); if (!TAILQ_EMPTY(&inodedep->id_extupdt)) - handle_allocdirect_partdone(TAILQ_FIRST(&inodedep->id_extupdt)); + handle_allocdirect_partdone(TAILQ_FIRST(&inodedep->id_extupdt), + NULL); /* * Now that the inode has been pushed into the buffer, the * operations dependent on the inode being written to disk @@ -4975,7 +8418,7 @@ retry: FREE_LOCK(&lk); return; } - ibp = inodedep->id_buf; + ibp = inodedep->id_bmsafemap->sm_buf; ibp = getdirtybuf(ibp, &lk, MNT_WAIT); if (ibp == NULL) { /* @@ -5007,13 +8450,13 @@ merge_inode_lists(newlisthead, oldlisthead) newadp = TAILQ_FIRST(newlisthead); for (listadp = TAILQ_FIRST(oldlisthead); listadp && newadp;) { - if (listadp->ad_lbn < newadp->ad_lbn) { + if (listadp->ad_offset < newadp->ad_offset) { listadp = TAILQ_NEXT(listadp, ad_next); continue; } TAILQ_REMOVE(newlisthead, newadp, ad_next); TAILQ_INSERT_BEFORE(listadp, newadp, ad_next); - if (listadp->ad_lbn == newadp->ad_lbn) { + if (listadp->ad_offset == newadp->ad_offset) { allocdirect_merge(oldlisthead, newadp, listadp); listadp = newadp; @@ -5057,12 +8500,11 @@ softdep_fsync(vp) return (0); } if (!LIST_EMPTY(&inodedep->id_inowait) || - !LIST_EMPTY(&inodedep->id_bufwait) || !TAILQ_EMPTY(&inodedep->id_extupdt) || !TAILQ_EMPTY(&inodedep->id_newextupdt) || !TAILQ_EMPTY(&inodedep->id_inoupdt) || !TAILQ_EMPTY(&inodedep->id_newinoupdt)) - panic("softdep_fsync: pending ops"); + panic("softdep_fsync: pending ops %p", inodedep); for (error = 0, flushparent = 0; ; ) { if ((wk = LIST_FIRST(&inodedep->id_pendinghd)) == NULL) break; @@ -5320,9 +8762,11 @@ loop: case D_ALLOCDIRECT: adp = WK_ALLOCDIRECT(wk); + if (adp->ad_jnewblk != NULL) + jwait(&adp->ad_jnewblk->jn_list); if (adp->ad_state & DEPCOMPLETE) continue; - nbp = adp->ad_buf; + nbp = adp->ad_bmsafemap->sm_buf; nbp = getdirtybuf(nbp, &lk, waitfor); if (nbp == NULL) continue; @@ -5337,9 +8781,11 @@ loop: case D_ALLOCINDIR: aip = WK_ALLOCINDIR(wk); + if (aip->ai_jnewblk != NULL) + jwait(&aip->ai_jnewblk->jn_list); if (aip->ai_state & DEPCOMPLETE) continue; - nbp = aip->ai_buf; + nbp = aip->ai_bmsafemap->sm_buf; nbp = getdirtybuf(nbp, &lk, waitfor); if (nbp == NULL) continue; @@ -5356,9 +8802,13 @@ loop: restart: LIST_FOREACH(aip, &WK_INDIRDEP(wk)->ir_deplisthd, ai_next) { + if (aip->ai_jnewblk != NULL) { + jwait(&aip->ai_jnewblk->jn_list); + goto restart; + } if (aip->ai_state & DEPCOMPLETE) continue; - nbp = aip->ai_buf; + nbp = aip->ai_bmsafemap->sm_buf; nbp = getdirtybuf(nbp, &lk, MNT_WAIT); if (nbp == NULL) goto restart; @@ -5489,7 +8939,8 @@ loop: BO_LOCK(bo); drain_output(vp); BO_UNLOCK(bo); - return (0); + return ffs_update(vp, 1); + /* return (0); */ } /* @@ -5502,7 +8953,9 @@ flush_inodedep_deps(mp, ino) ino_t ino; { struct inodedep *inodedep; + struct jaddref *jaddref; int error, waitfor; + int loops = 0; /* * This work is done in two passes. The first pass grabs most @@ -5522,8 +8975,17 @@ flush_inodedep_deps(mp, ino) return (error); FREE_LOCK(&lk); ACQUIRE_LOCK(&lk); +restart: if (inodedep_lookup(mp, ino, 0, &inodedep) == 0) return (0); + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) { + if (jaddref->ja_state & (GOINGAWAY | COMPLETE)) + continue; + if (++loops > 20) + panic("stuck jaddref: %p\n", jaddref); + jwait(&jaddref->ja_list); + goto restart; + } if (flush_deplist(&inodedep->id_inoupdt, waitfor, &error) || flush_deplist(&inodedep->id_newinoupdt, waitfor, &error) || flush_deplist(&inodedep->id_extupdt, waitfor, &error) || @@ -5559,9 +9021,11 @@ flush_deplist(listhead, waitfor, errorp) mtx_assert(&lk, MA_OWNED); TAILQ_FOREACH(adp, listhead, ad_next) { + if (adp->ad_jnewblk != NULL) + jwait(&adp->ad_jnewblk->jn_list); if (adp->ad_state & DEPCOMPLETE) continue; - bp = adp->ad_buf; + bp = adp->ad_bmsafemap->sm_buf; bp = getdirtybuf(bp, &lk, waitfor); if (bp == NULL) { if (waitfor == MNT_NOWAIT) @@ -5592,6 +9056,7 @@ flush_pagedep_deps(pvp, mp, diraddhdp) struct diraddhd *diraddhdp; { struct inodedep *inodedep; + struct jaddref *jaddref; struct ufsmount *ump; struct diradd *dap; struct vnode *vp; @@ -5690,6 +9155,13 @@ flush_pagedep_deps(pvp, mp, diraddhdp) break; } BO_UNLOCK(bo); + /* + * We have to wait for the direct pointers to point + * at the newdirblk before the dependency will go + * away. + */ + if (dap == LIST_FIRST(diraddhdp)) + ffs_update(vp, 1); vput(vp); if (error != 0) break; /* Flushing of first block failed */ @@ -5716,11 +9188,20 @@ retry: if (inodedep_lookup(UFSTOVFS(ump), inum, 0, &inodedep) == 0) panic("flush_pagedep_deps: lost inode"); /* + * Wait for any pending journal adds to complete. + */ + LIST_FOREACH(jaddref, &inodedep->id_jaddrefhd, ja_inodeps) { + if (jaddref->ja_state & (GOINGAWAY | COMPLETE)) + continue; + jwait(&jaddref->ja_list); + goto retry; + } + /* * If the inode still has bitmap dependencies, * push them to disk. */ if ((inodedep->id_state & DEPCOMPLETE) == 0) { - bp = inodedep->id_buf; + bp = inodedep->id_bmsafemap->sm_buf; bp = getdirtybuf(bp, &lk, MNT_WAIT); if (bp == NULL) goto retry; @@ -5749,8 +9230,11 @@ retry: * If we have failed to get rid of all the dependencies * then something is seriously wrong. */ - if (dap == LIST_FIRST(diraddhdp)) - panic("flush_pagedep_deps: flush failed"); + if (dap == LIST_FIRST(diraddhdp)) { + inodedep_lookup(UFSTOVFS(ump), inum, 0, &inodedep); + panic("flush_pagedep_deps: failed to flush " + "inodep %p ino %d dap %p", inodedep, inum, dap); + } } if (error) ACQUIRE_LOCK(&lk); @@ -6100,10 +9584,13 @@ softdep_count_dependencies(bp, wantcount) int wantcount; { struct worklist *wk; + struct bmsafemap *bmsafemap; struct inodedep *inodedep; struct indirdep *indirdep; + struct freeblks *freeblks; struct allocindir *aip; struct pagedep *pagedep; + struct dirrem *dirrem; struct diradd *dap; int i, retval; @@ -6132,6 +9619,12 @@ softdep_count_dependencies(bp, wantcount) if (!wantcount) goto out; } + if (LIST_FIRST(&inodedep->id_jaddrefhd)) { + /* Add reference dependency. */ + retval += 1; + if (!wantcount) + goto out; + } continue; case D_INDIRDEP: @@ -6147,6 +9640,14 @@ softdep_count_dependencies(bp, wantcount) case D_PAGEDEP: pagedep = WK_PAGEDEP(wk); + LIST_FOREACH(dirrem, &pagedep->pd_dirremhd, dm_next) { + if (LIST_FIRST(&dirrem->dm_jremrefhd)) { + /* Journal remove ref dependency. */ + retval += 1; + if (!wantcount) + goto out; + } + } for (i = 0; i < DAHASHSZ; i++) { LIST_FOREACH(dap, &pagedep->pd_diraddhd[i], da_pdlist) { @@ -6159,14 +9660,43 @@ softdep_count_dependencies(bp, wantcount) continue; case D_BMSAFEMAP: + bmsafemap = WK_BMSAFEMAP(wk); + if (LIST_FIRST(&bmsafemap->sm_jaddrefhd)) { + /* Add reference dependency. */ + retval += 1; + if (!wantcount) + goto out; + } + if (LIST_FIRST(&bmsafemap->sm_jnewblkhd)) { + /* Allocate block dependency. */ + retval += 1; + if (!wantcount) + goto out; + } + continue; + + case D_FREEBLKS: + freeblks = WK_FREEBLKS(wk); + if (LIST_FIRST(&freeblks->fb_jfreeblkhd)) { + /* Freeblk journal dependency. */ + retval += 1; + if (!wantcount) + goto out; + } + continue; + + case D_FREEWORK: + case D_FREEDEP: + case D_JSEGDEP: case D_ALLOCDIRECT: case D_ALLOCINDIR: case D_MKDIR: + case D_JSEG: /* never a dependency on these blocks */ continue; default: - panic("softdep_check_for_rollback: Unexpected type %s", + panic("softdep_count_dependencies: Unexpected type %s", TYPENAME(wk->wk_type)); /* NOTREACHED */ } @@ -6382,6 +9912,43 @@ softdep_error(func, error) #ifdef DDB +static void +inodedep_print(struct inodedep *inodedep, int verbose) +{ + db_printf("%p fs %p st %x ino %jd inoblk %jd delta %d saveino %p\n", + inodedep, inodedep->id_fs, inodedep->id_state, + (intmax_t)inodedep->id_ino, + (intmax_t)fsbtodb(inodedep->id_fs, + ino_to_fsba(inodedep->id_fs, inodedep->id_ino)), + inodedep->id_nlinkdelta, inodedep->id_savedino1); + + if (verbose == 0) + return; + + db_printf("\tpendinghd %p, bufwait %p, inowait %p, jaddrefhd %p, " + "mkdiradd %p\n", + LIST_FIRST(&inodedep->id_pendinghd), + LIST_FIRST(&inodedep->id_bufwait), + LIST_FIRST(&inodedep->id_inowait), + LIST_FIRST(&inodedep->id_jaddrefhd), + inodedep->id_mkdiradd); + db_printf("\tinoupdt %p, newinoupdt %p, extupdt %p, newextupdt %p\n", + TAILQ_FIRST(&inodedep->id_inoupdt), + TAILQ_FIRST(&inodedep->id_newinoupdt), + TAILQ_FIRST(&inodedep->id_extupdt), + TAILQ_FIRST(&inodedep->id_newextupdt)); +} + +DB_SHOW_COMMAND(inodedep, db_show_inodedep) +{ + + if (have_addr == 0) { + db_printf("Address required\n"); + return; + } + inodedep_print((struct inodedep*)addr, 1); +} + DB_SHOW_COMMAND(inodedeps, db_show_inodedeps) { struct inodedep_hashhead *inodedephd; @@ -6395,15 +9962,62 @@ DB_SHOW_COMMAND(inodedeps, db_show_inodedeps) LIST_FOREACH(inodedep, inodedephd, id_hash) { if (fs != NULL && fs != inodedep->id_fs) continue; - db_printf("%p fs %p st %x ino %jd inoblk %jd\n", - inodedep, inodedep->id_fs, inodedep->id_state, - (intmax_t)inodedep->id_ino, - (intmax_t)fsbtodb(inodedep->id_fs, - ino_to_fsba(inodedep->id_fs, inodedep->id_ino))); + inodedep_print(inodedep, 0); } } } +DB_SHOW_COMMAND(worklist, db_show_worklist) +{ + struct worklist *wk; + + if (have_addr == 0) { + db_printf("Address required\n"); + return; + } + wk = (struct worklist *)addr; + printf("worklist: %p type %s state 0x%X\n", + wk, TYPENAME(wk->wk_type), wk->wk_state); +} + +DB_SHOW_COMMAND(workhead, db_show_workhead) +{ + struct workhead *wkhd; + struct worklist *wk; + int i; + + if (have_addr == 0) { + db_printf("Address required\n"); + return; + } + wkhd = (struct workhead *)addr; + wk = LIST_FIRST(wkhd); + for (i = 0; i < 100 && wk != NULL; i++, wk = LIST_NEXT(wk, wk_list)) + db_printf("worklist: %p type %s state 0x%X", + wk, TYPENAME(wk->wk_type), wk->wk_state); + if (i == 100) + db_printf("workhead overflow"); + printf("\n"); +} + + +DB_SHOW_COMMAND(mkdirs, db_show_mkdirs) +{ + struct jaddref *jaddref; + struct diradd *diradd; + struct mkdir *mkdir; + + LIST_FOREACH(mkdir, &mkdirlisthd, md_mkdirs) { + diradd = mkdir->md_diradd; + db_printf("mkdir: %p state 0x%X dap %p state 0x%X", + mkdir, mkdir->md_state, diradd, diradd->da_state); + if ((jaddref = mkdir->md_jaddref) != NULL) + db_printf(" jaddref %p jaddref state 0x%X", + jaddref, jaddref->ja_state); + db_printf("\n"); + } +} + #endif /* DDB */ #endif /* SOFTUPDATES */ Index: /usr/src/sys/ufs/ffs/ffs_alloc.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_alloc.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_alloc.c (working copy) @@ -89,23 +89,23 @@ __FBSDID("$FreeBSD$"); #include typedef ufs2_daddr_t allocfcn_t(struct inode *ip, int cg, ufs2_daddr_t bpref, - int size); + int size, int rsize); -static ufs2_daddr_t ffs_alloccg(struct inode *, int, ufs2_daddr_t, int); +static ufs2_daddr_t ffs_alloccg(struct inode *, int, ufs2_daddr_t, int, int); static ufs2_daddr_t - ffs_alloccgblk(struct inode *, struct buf *, ufs2_daddr_t); + ffs_alloccgblk(struct inode *, struct buf *, ufs2_daddr_t, int); #ifdef INVARIANTS static int ffs_checkblk(struct inode *, ufs2_daddr_t, long); #endif -static ufs2_daddr_t ffs_clusteralloc(struct inode *, int, ufs2_daddr_t, int); -static void ffs_clusteracct(struct ufsmount *, struct fs *, struct cg *, - ufs1_daddr_t, int); +static ufs2_daddr_t ffs_clusteralloc(struct inode *, int, ufs2_daddr_t, int, + int); static ino_t ffs_dirpref(struct inode *); static ufs2_daddr_t ffs_fragextend(struct inode *, int, ufs2_daddr_t, int, int); static void ffs_fserr(struct fs *, ino_t, char *); static ufs2_daddr_t ffs_hashalloc - (struct inode *, int, ufs2_daddr_t, int, allocfcn_t *); -static ufs2_daddr_t ffs_nodealloccg(struct inode *, int, ufs2_daddr_t, int); + (struct inode *, int, ufs2_daddr_t, int, int, allocfcn_t *); +static ufs2_daddr_t ffs_nodealloccg(struct inode *, int, ufs2_daddr_t, int, + int); static ufs1_daddr_t ffs_mapsearch(struct fs *, struct cg *, ufs2_daddr_t, int); static int ffs_reallocblks_ufs1(struct vop_reallocblks_args *); static int ffs_reallocblks_ufs2(struct vop_reallocblks_args *); @@ -182,7 +182,7 @@ retry: cg = ino_to_cg(fs, ip->i_number); else cg = dtog(fs, bpref); - bno = ffs_hashalloc(ip, cg, bpref, size, ffs_alloccg); + bno = ffs_hashalloc(ip, cg, bpref, size, size, ffs_alloccg); if (bno > 0) { delta = btodb(size); if (ip->i_flag & IN_SPACECOUNTED) { @@ -380,16 +380,12 @@ retry: panic("ffs_realloccg: bad optim"); /* NOTREACHED */ } - bno = ffs_hashalloc(ip, cg, bpref, request, ffs_alloccg); + bno = ffs_hashalloc(ip, cg, bpref, request, nsize, ffs_alloccg); if (bno > 0) { bp->b_blkno = fsbtodb(fs, bno); if (!DOINGSOFTDEP(vp)) ffs_blkfree(ump, fs, ip->i_devvp, bprev, (long)osize, - ip->i_number); - if (nsize < request) - ffs_blkfree(ump, fs, ip->i_devvp, - bno + numfrags(fs, nsize), - (long)(request - nsize), ip->i_number); + ip->i_number, NULL); delta = btodb(nsize - osize); if (ip->i_flag & IN_SPACECOUNTED) { UFS_LOCK(ump); @@ -493,7 +489,7 @@ ffs_reallocblks_ufs1(ap) struct fs *fs; struct inode *ip; struct vnode *vp; - struct buf *sbp, *ebp; + struct buf *sbp, *ebp, *bp; ufs1_daddr_t *bap, *sbap, *ebap = 0; struct cluster_save *buflist; struct ufsmount *ump; @@ -501,7 +497,7 @@ ffs_reallocblks_ufs1(ap) ufs1_daddr_t soff, newblk, blkno; ufs2_daddr_t pref; struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp; - int i, len, start_lvl, end_lvl, ssize; + int i, len, start_lvl, end_lvl, ssize, lvl; vp = ap->a_vp; ip = VTOI(vp); @@ -578,7 +574,7 @@ ffs_reallocblks_ufs1(ap) * Search the block map looking for an allocation of the desired size. */ if ((newblk = ffs_hashalloc(ip, dtog(fs, pref), pref, - len, ffs_clusteralloc)) == 0) { + len, len, ffs_clusteralloc)) == 0) { UFS_UNLOCK(ump); goto fail; } @@ -594,11 +590,17 @@ ffs_reallocblks_ufs1(ap) printf("realloc: ino %d, lbns %jd-%jd\n\told:", ip->i_number, (intmax_t)start_lbn, (intmax_t)end_lbn); #endif + idp = start_ap; + bp = sbp; blkno = newblk; + lvl = start_lvl - 1; for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->fs_frag) { if (i == ssize) { bap = ebap; - soff = -i; + idp = end_ap; + bp = ebp; + lvl = end_lvl - 1; + idp[lvl].in_off = 0; } #ifdef INVARIANTS if (!ffs_checkblk(ip, @@ -614,12 +616,13 @@ ffs_reallocblks_ufs1(ap) if (DOINGSOFTDEP(vp)) { if (sbap == &ip->i_din1->di_db[0] && i < ssize) softdep_setup_allocdirect(ip, start_lbn + i, - blkno, *bap, fs->fs_bsize, fs->fs_bsize, - buflist->bs_children[i]); + start_lbn + i, blkno, *bap, fs->fs_bsize, + fs->fs_bsize, buflist->bs_children[i]); else - softdep_setup_allocindir_page(ip, start_lbn + i, - i < ssize ? sbp : ebp, soff + i, blkno, - *bap, buflist->bs_children[i]); + softdep_setup_allocindir_page(ip, bp, idp, + lvl, start_lbn + i, blkno, *bap, + buflist->bs_children[i]); + idp[lvl].in_off++; } *bap++ = blkno; } @@ -664,7 +667,7 @@ ffs_reallocblks_ufs1(ap) if (!DOINGSOFTDEP(vp)) ffs_blkfree(ump, fs, ip->i_devvp, dbtofsb(fs, buflist->bs_children[i]->b_blkno), - fs->fs_bsize, ip->i_number); + fs->fs_bsize, ip->i_number, NULL); buflist->bs_children[i]->b_blkno = fsbtodb(fs, blkno); #ifdef INVARIANTS if (!ffs_checkblk(ip, @@ -702,14 +705,14 @@ ffs_reallocblks_ufs2(ap) struct fs *fs; struct inode *ip; struct vnode *vp; - struct buf *sbp, *ebp; + struct buf *sbp, *ebp, *bp; ufs2_daddr_t *bap, *sbap, *ebap = 0; struct cluster_save *buflist; struct ufsmount *ump; ufs_lbn_t start_lbn, end_lbn; ufs2_daddr_t soff, newblk, blkno, pref; struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp; - int i, len, start_lvl, end_lvl, ssize; + int i, len, start_lvl, end_lvl, ssize, lvl; vp = ap->a_vp; ip = VTOI(vp); @@ -786,7 +789,7 @@ ffs_reallocblks_ufs2(ap) * Search the block map looking for an allocation of the desired size. */ if ((newblk = ffs_hashalloc(ip, dtog(fs, pref), pref, - len, ffs_clusteralloc)) == 0) { + len, len, ffs_clusteralloc)) == 0) { UFS_UNLOCK(ump); goto fail; } @@ -802,11 +805,17 @@ ffs_reallocblks_ufs2(ap) printf("realloc: ino %d, lbns %jd-%jd\n\told:", ip->i_number, (intmax_t)start_lbn, (intmax_t)end_lbn); #endif + idp = start_ap; + bp = sbp; blkno = newblk; + lvl = start_lvl - 1; for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->fs_frag) { if (i == ssize) { bap = ebap; - soff = -i; + idp = end_ap; + bp = ebp; + lvl = end_lvl - 1; + idp[lvl].in_off = 0; } #ifdef INVARIANTS if (!ffs_checkblk(ip, @@ -822,12 +831,13 @@ ffs_reallocblks_ufs2(ap) if (DOINGSOFTDEP(vp)) { if (sbap == &ip->i_din2->di_db[0] && i < ssize) softdep_setup_allocdirect(ip, start_lbn + i, - blkno, *bap, fs->fs_bsize, fs->fs_bsize, - buflist->bs_children[i]); + start_lbn + i, blkno, *bap, fs->fs_bsize, + fs->fs_bsize, buflist->bs_children[i]); else - softdep_setup_allocindir_page(ip, start_lbn + i, - i < ssize ? sbp : ebp, soff + i, blkno, - *bap, buflist->bs_children[i]); + softdep_setup_allocindir_page(ip, bp, idp, + lvl, start_lbn + i, blkno, *bap, + buflist->bs_children[i]); + idp[lvl].in_off++; } *bap++ = blkno; } @@ -872,7 +882,7 @@ ffs_reallocblks_ufs2(ap) if (!DOINGSOFTDEP(vp)) ffs_blkfree(ump, fs, ip->i_devvp, dbtofsb(fs, buflist->bs_children[i]->b_blkno), - fs->fs_bsize, ip->i_number); + fs->fs_bsize, ip->i_number, NULL); buflist->bs_children[i]->b_blkno = fsbtodb(fs, blkno); #ifdef INVARIANTS if (!ffs_checkblk(ip, @@ -959,7 +969,7 @@ ffs_valloc(pvp, mode, cred, vpp) if (fs->fs_contigdirs[cg] > 0) fs->fs_contigdirs[cg]--; } - ino = (ino_t)ffs_hashalloc(pip, cg, ipref, mode, + ino = (ino_t)ffs_hashalloc(pip, cg, ipref, mode, 0, (allocfcn_t *)ffs_nodealloccg); if (ino == 0) goto noinodes; @@ -1268,11 +1278,12 @@ ffs_blkpref_ufs2(ip, lbn, indx, bap) */ /*VARARGS5*/ static ufs2_daddr_t -ffs_hashalloc(ip, cg, pref, size, allocator) +ffs_hashalloc(ip, cg, pref, size, rsize, allocator) struct inode *ip; int cg; ufs2_daddr_t pref; - int size; /* size for data blocks, mode for inodes */ + int size; /* Search size for data blocks, mode for inodes */ + int rsize; /* Real allocated size. */ allocfcn_t *allocator; { struct fs *fs; @@ -1288,7 +1299,7 @@ static ufs2_daddr_t /* * 1: preferred cylinder group */ - result = (*allocator)(ip, cg, pref, size); + result = (*allocator)(ip, cg, pref, size, rsize); if (result) return (result); /* @@ -1298,7 +1309,7 @@ static ufs2_daddr_t cg += i; if (cg >= fs->fs_ncg) cg -= fs->fs_ncg; - result = (*allocator)(ip, cg, 0, size); + result = (*allocator)(ip, cg, 0, size, rsize); if (result) return (result); } @@ -1309,7 +1320,7 @@ static ufs2_daddr_t */ cg = (icg + 2) % fs->fs_ncg; for (i = 2; i < fs->fs_ncg; i++) { - result = (*allocator)(ip, cg, 0, size); + result = (*allocator)(ip, cg, 0, size, rsize); if (result) return (result); cg++; @@ -1391,7 +1402,8 @@ ffs_fragextend(ip, cg, bprev, osize, nsize) ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); if (DOINGSOFTDEP(ITOV(ip))) - softdep_setup_blkmapdep(bp, UFSTOVFS(ump), bprev); + softdep_setup_blkmapdep(bp, UFSTOVFS(ump), bprev, + frags, numfrags(fs, osize)); bdwrite(bp); return (bprev); @@ -1409,11 +1421,12 @@ fail: * and if it is, allocate it. */ static ufs2_daddr_t -ffs_alloccg(ip, cg, bpref, size) +ffs_alloccg(ip, cg, bpref, size, rsize) struct inode *ip; int cg; ufs2_daddr_t bpref; int size; + int rsize; { struct fs *fs; struct cg *cgp; @@ -1441,7 +1454,7 @@ static ufs2_daddr_t cgp->cg_old_time = cgp->cg_time = time_second; if (size == fs->fs_bsize) { UFS_LOCK(ump); - blkno = ffs_alloccgblk(ip, bp, bpref); + blkno = ffs_alloccgblk(ip, bp, bpref, rsize); ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); bdwrite(bp); @@ -1465,21 +1478,14 @@ static ufs2_daddr_t if (cgp->cg_cs.cs_nbfree == 0) goto fail; UFS_LOCK(ump); - blkno = ffs_alloccgblk(ip, bp, bpref); - bno = dtogd(fs, blkno); - for (i = frags; i < fs->fs_frag; i++) - setbit(blksfree, bno + i); - i = fs->fs_frag - frags; - cgp->cg_cs.cs_nffree += i; - fs->fs_cstotal.cs_nffree += i; - fs->fs_cs(fs, cg).cs_nffree += i; - fs->fs_fmod = 1; - cgp->cg_frsum[i]++; + blkno = ffs_alloccgblk(ip, bp, bpref, rsize); ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); bdwrite(bp); return (blkno); } + KASSERT(size == rsize, + ("ffs_alloccg: size(%d) != rsize(%d)", size, rsize)); bno = ffs_mapsearch(fs, cgp, bpref, allocsiz); if (bno < 0) goto fail; @@ -1497,7 +1503,7 @@ static ufs2_daddr_t ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); if (DOINGSOFTDEP(ITOV(ip))) - softdep_setup_blkmapdep(bp, UFSTOVFS(ump), blkno); + softdep_setup_blkmapdep(bp, UFSTOVFS(ump), blkno, frags, 0); bdwrite(bp); return (blkno); @@ -1519,10 +1525,11 @@ fail: * blocks may be fragmented by the routine that allocates them. */ static ufs2_daddr_t -ffs_alloccgblk(ip, bp, bpref) +ffs_alloccgblk(ip, bp, bpref, size) struct inode *ip; struct buf *bp; ufs2_daddr_t bpref; + int size; { struct fs *fs; struct cg *cgp; @@ -1530,6 +1537,7 @@ static ufs2_daddr_t ufs1_daddr_t bno; ufs2_daddr_t blkno; u_int8_t *blksfree; + int i; fs = ip->i_fs; ump = ip->i_ump; @@ -1557,16 +1565,32 @@ static ufs2_daddr_t gotit: blkno = fragstoblks(fs, bno); ffs_clrblock(fs, blksfree, (long)blkno); - ffs_clusteracct(ump, fs, cgp, blkno, -1); + ffs_clusteracct(fs, cgp, blkno, -1); cgp->cg_cs.cs_nbfree--; fs->fs_cstotal.cs_nbfree--; fs->fs_cs(fs, cgp->cg_cgx).cs_nbfree--; fs->fs_fmod = 1; blkno = cgbase(fs, cgp->cg_cgx) + bno; + /* + * If the caller didn't want the whole block free the frags here. + */ + size = numfrags(fs, size); + if (size != fs->fs_frag) { + bno = dtogd(fs, blkno); + for (i = size; i < fs->fs_frag; i++) + setbit(blksfree, bno + i); + i = fs->fs_frag - size; + cgp->cg_cs.cs_nffree += i; + fs->fs_cstotal.cs_nffree += i; + fs->fs_cs(fs, cgp->cg_cgx).cs_nffree += i; + fs->fs_fmod = 1; + cgp->cg_frsum[i]++; + } /* XXX Fixme. */ UFS_UNLOCK(ump); if (DOINGSOFTDEP(ITOV(ip))) - softdep_setup_blkmapdep(bp, UFSTOVFS(ump), blkno); + softdep_setup_blkmapdep(bp, UFSTOVFS(ump), blkno, + size, 0); UFS_LOCK(ump); return (blkno); } @@ -1579,11 +1603,12 @@ gotit: * take the first one that we find following bpref. */ static ufs2_daddr_t -ffs_clusteralloc(ip, cg, bpref, len) +ffs_clusteralloc(ip, cg, bpref, len, unused) struct inode *ip; int cg; ufs2_daddr_t bpref; int len; + int unused; { struct fs *fs; struct cg *cgp; @@ -1679,7 +1704,7 @@ static ufs2_daddr_t len = blkstofrags(fs, len); UFS_LOCK(ump); for (i = 0; i < len; i += fs->fs_frag) - if (ffs_alloccgblk(ip, bp, bno + i) != bno + i) + if (ffs_alloccgblk(ip, bp, bno + i, fs->fs_bsize) != bno + i) panic("ffs_clusteralloc: lost block"); ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); @@ -1703,11 +1728,12 @@ fail: * inode in the specified cylinder group. */ static ufs2_daddr_t -ffs_nodealloccg(ip, cg, ipref, mode) +ffs_nodealloccg(ip, cg, ipref, mode, unused) struct inode *ip; int cg; ufs2_daddr_t ipref; int mode; + int unused; { struct fs *fs; struct cg *cgp; @@ -1810,28 +1836,6 @@ gotit: } /* - * check if a block is free - */ -static int -ffs_isfreeblock(struct fs *fs, u_char *cp, ufs1_daddr_t h) -{ - - switch ((int)fs->fs_frag) { - case 8: - return (cp[h] == 0); - case 4: - return ((cp[h >> 1] & (0x0f << ((h & 0x1) << 2))) == 0); - case 2: - return ((cp[h >> 2] & (0x03 << ((h & 0x3) << 1))) == 0); - case 1: - return ((cp[h >> 3] & (0x01 << (h & 0x7))) == 0); - default: - panic("ffs_isfreeblock"); - } - return (0); -} - -/* * Free a block or fragment. * * The specified block or fragment is placed back in the @@ -1839,13 +1843,14 @@ gotit: * block reassembly is checked. */ void -ffs_blkfree(ump, fs, devvp, bno, size, inum) +ffs_blkfree(ump, fs, devvp, bno, size, inum, dephd) struct ufsmount *ump; struct fs *fs; struct vnode *devvp; ufs2_daddr_t bno; long size; ino_t inum; + struct workhead *dephd; { struct cg *cgp; struct buf *bp; @@ -1912,7 +1917,7 @@ void panic("ffs_blkfree: freeing free block"); } ffs_setblock(fs, blksfree, fragno); - ffs_clusteracct(ump, fs, cgp, fragno, 1); + ffs_clusteracct(fs, cgp, fragno, 1); cgp->cg_cs.cs_nbfree++; fs->fs_cstotal.cs_nbfree++; fs->fs_cs(fs, cg).cs_nbfree++; @@ -1952,7 +1957,7 @@ void cgp->cg_cs.cs_nffree -= fs->fs_frag; fs->fs_cstotal.cs_nffree -= fs->fs_frag; fs->fs_cs(fs, cg).cs_nffree -= fs->fs_frag; - ffs_clusteracct(ump, fs, cgp, fragno, 1); + ffs_clusteracct(fs, cgp, fragno, 1); cgp->cg_cs.cs_nbfree++; fs->fs_cstotal.cs_nbfree++; fs->fs_cs(fs, cg).cs_nbfree++; @@ -1961,6 +1966,9 @@ void fs->fs_fmod = 1; ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); + if (UFSTOVFS(ump)->mnt_flag & MNT_SOFTDEP) + softdep_setup_blkfree(UFSTOVFS(ump), bp, bno, + numfrags(fs, size), dephd); bdwrite(bp); } @@ -2031,7 +2039,8 @@ ffs_vfree(pvp, ino, mode) return (0); } ip = VTOI(pvp); - return (ffs_freefile(ip->i_ump, ip->i_fs, ip->i_devvp, ino, mode)); + return (ffs_freefile(ip->i_ump, ip->i_fs, ip->i_devvp, ino, mode, + NULL)); } /* @@ -2039,12 +2048,13 @@ ffs_vfree(pvp, ino, mode) * The specified inode is placed back in the free map. */ int -ffs_freefile(ump, fs, devvp, ino, mode) +ffs_freefile(ump, fs, devvp, ino, mode, wkhd) struct ufsmount *ump; struct fs *fs; struct vnode *devvp; ino_t ino; int mode; + struct workhead *wkhd; { struct cg *cgp; struct buf *bp; @@ -2100,6 +2110,9 @@ int fs->fs_fmod = 1; ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); + if (UFSTOVFS(ump)->mnt_flag & MNT_SOFTDEP) + softdep_setup_inofree(UFSTOVFS(ump), bp, + ino + cg * fs->fs_ipg, wkhd); bdwrite(bp); return (0); } @@ -2213,101 +2226,6 @@ ffs_mapsearch(fs, cgp, bpref, allocsiz) } /* - * Update the cluster map because of an allocation or free. - * - * Cnt == 1 means free; cnt == -1 means allocating. - */ -void -ffs_clusteracct(ump, fs, cgp, blkno, cnt) - struct ufsmount *ump; - struct fs *fs; - struct cg *cgp; - ufs1_daddr_t blkno; - int cnt; -{ - int32_t *sump; - int32_t *lp; - u_char *freemapp, *mapp; - int i, start, end, forw, back, map, bit; - - mtx_assert(UFS_MTX(ump), MA_OWNED); - - if (fs->fs_contigsumsize <= 0) - return; - freemapp = cg_clustersfree(cgp); - sump = cg_clustersum(cgp); - /* - * Allocate or clear the actual block. - */ - if (cnt > 0) - setbit(freemapp, blkno); - else - clrbit(freemapp, blkno); - /* - * Find the size of the cluster going forward. - */ - start = blkno + 1; - end = start + fs->fs_contigsumsize; - if (end >= cgp->cg_nclusterblks) - end = cgp->cg_nclusterblks; - mapp = &freemapp[start / NBBY]; - map = *mapp++; - bit = 1 << (start % NBBY); - for (i = start; i < end; i++) { - if ((map & bit) == 0) - break; - if ((i & (NBBY - 1)) != (NBBY - 1)) { - bit <<= 1; - } else { - map = *mapp++; - bit = 1; - } - } - forw = i - start; - /* - * Find the size of the cluster going backward. - */ - start = blkno - 1; - end = start - fs->fs_contigsumsize; - if (end < 0) - end = -1; - mapp = &freemapp[start / NBBY]; - map = *mapp--; - bit = 1 << (start % NBBY); - for (i = start; i > end; i--) { - if ((map & bit) == 0) - break; - if ((i & (NBBY - 1)) != 0) { - bit >>= 1; - } else { - map = *mapp--; - bit = 1 << (NBBY - 1); - } - } - back = start - i; - /* - * Account for old cluster and the possibly new forward and - * back clusters. - */ - i = back + forw + 1; - if (i > fs->fs_contigsumsize) - i = fs->fs_contigsumsize; - sump[i] += cnt; - if (back > 0) - sump[back] -= cnt; - if (forw > 0) - sump[forw] -= cnt; - /* - * Update cluster summary information. - */ - lp = &sump[fs->fs_contigsumsize]; - for (i = fs->fs_contigsumsize; i > 0; i--) - if (*lp-- > 0) - break; - fs->fs_maxcluster[cgp->cg_cgx] = i; -} - -/* * Fserr prints the name of a filesystem with an error diagnostic. * * The form of the error message is: @@ -2505,7 +2423,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ while (cmd.size > 0) { if ((error = ffs_freefile(ump, fs, ump->um_devvp, - cmd.value, filetype))) + cmd.value, filetype, NULL))) break; cmd.size -= 1; cmd.value += 1; @@ -2533,7 +2451,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) if (blksize > blkcnt) blksize = blkcnt; ffs_blkfree(ump, fs, ump->um_devvp, blkno, - blksize * fs->fs_fsize, ROOTINO); + blksize * fs->fs_fsize, ROOTINO, NULL); blkno += blksize; blkcnt -= blksize; blksize = fs->fs_frag; Index: /usr/src/sys/ufs/ffs/ffs_extern.h =================================================================== --- /usr/src/sys/ufs/ffs/ffs_extern.h (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_extern.h (working copy) @@ -56,18 +56,20 @@ int ffs_balloc_ufs2(struct vnode *a_vp, off_t a_st struct ucred *a_cred, int a_flags, struct buf **a_bpp); int ffs_blkatoff(struct vnode *, off_t, char **, struct buf **); void ffs_blkfree(struct ufsmount *, struct fs *, struct vnode *, - ufs2_daddr_t, long, ino_t); + ufs2_daddr_t, long, ino_t, struct workhead *); ufs2_daddr_t ffs_blkpref_ufs1(struct inode *, ufs_lbn_t, int, ufs1_daddr_t *); ufs2_daddr_t ffs_blkpref_ufs2(struct inode *, ufs_lbn_t, int, ufs2_daddr_t *); int ffs_checkfreefile(struct fs *, struct vnode *, ino_t); void ffs_clrblock(struct fs *, u_char *, ufs1_daddr_t); +void ffs_clusteracct(struct fs *, struct cg *, ufs1_daddr_t, int); void ffs_bdflush(struct bufobj *, struct buf *); int ffs_copyonwrite(struct vnode *, struct buf *); int ffs_flushfiles(struct mount *, int, struct thread *); void ffs_fragacct(struct fs *, int, int32_t [], int); int ffs_freefile(struct ufsmount *, struct fs *, struct vnode *, ino_t, - int); + int, struct workhead *); int ffs_isblock(struct fs *, u_char *, ufs1_daddr_t); +int ffs_isfreeblock(struct fs *, u_char *, ufs1_daddr_t); void ffs_load_inode(struct buf *, struct inode *, struct fs *, ino_t); int ffs_mountroot(void); int ffs_reallocblks(struct vop_reallocblks_args *); @@ -108,7 +110,7 @@ void softdep_initialize(void); void softdep_uninitialize(void); int softdep_mount(struct vnode *, struct mount *, struct fs *, struct ucred *); -void softdep_move_dependencies(struct buf *, struct buf *); +int softdep_move_dependencies(struct buf *, struct buf *); int softdep_flushworklist(struct mount *, int *, struct thread *); int softdep_flushfiles(struct mount *, int, struct thread *); void softdep_update_inodeblock(struct inode *, struct buf *, int); @@ -117,15 +119,21 @@ void softdep_freefile(struct vnode *, ino_t, int); int softdep_request_cleanup(struct fs *, struct vnode *); void softdep_setup_freeblocks(struct inode *, off_t, int); void softdep_setup_inomapdep(struct buf *, struct inode *, ino_t); -void softdep_setup_blkmapdep(struct buf *, struct mount *, ufs2_daddr_t); -void softdep_setup_allocdirect(struct inode *, ufs_lbn_t, ufs2_daddr_t, +void softdep_setup_blkmapdep(struct buf *, struct mount *, ufs2_daddr_t, + int, int); +void softdep_setup_allocdirect(struct inode *, int, ufs_lbn_t, ufs2_daddr_t, ufs2_daddr_t, long, long, struct buf *); void softdep_setup_allocext(struct inode *, ufs_lbn_t, ufs2_daddr_t, ufs2_daddr_t, long, long, struct buf *); void softdep_setup_allocindir_meta(struct buf *, struct inode *, - struct buf *, int, ufs2_daddr_t); -void softdep_setup_allocindir_page(struct inode *, ufs_lbn_t, - struct buf *, int, ufs2_daddr_t, ufs2_daddr_t, struct buf *); + struct buf *, struct indir *, int, ufs2_daddr_t); +void softdep_setup_allocindir_page(struct inode *, struct buf *, + struct indir *, int, ufs_lbn_t, ufs2_daddr_t, ufs2_daddr_t, + struct buf *); +void softdep_setup_blkfree(struct mount *, struct buf *, ufs2_daddr_t, int, + struct workhead *); +void softdep_setup_inofree(struct mount *, struct buf *, ino_t, + struct workhead *); void softdep_fsync_mountdev(struct vnode *); int softdep_sync_metadata(struct vnode *); int softdep_process_worklist(struct mount *, int); Index: /usr/src/sys/ufs/ffs/ffs_subr.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_subr.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_subr.c (working copy) @@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$"); #ifndef _KERNEL #include #include -#include "fsck.h" #else #include #include @@ -223,12 +222,43 @@ ffs_isblock(fs, cp, h) mask = 0x01 << (h & 0x7); return ((cp[h >> 3] & mask) == mask); default: +#ifdef _KERNEL panic("ffs_isblock"); +#endif + break; } return (0); } /* + * check if a block is free + */ +int +ffs_isfreeblock(fs, cp, h) + struct fs *fs; + u_char *cp; + ufs1_daddr_t h; +{ + + switch ((int)fs->fs_frag) { + case 8: + return (cp[h] == 0); + case 4: + return ((cp[h >> 1] & (0x0f << ((h & 0x1) << 2))) == 0); + case 2: + return ((cp[h >> 2] & (0x03 << ((h & 0x3) << 1))) == 0); + case 1: + return ((cp[h >> 3] & (0x01 << (h & 0x7))) == 0); + default: +#ifdef _KERNEL + panic("ffs_isfreeblock"); +#endif + break; + } + return (0); +} + +/* * take a block out of the map */ void @@ -252,7 +282,10 @@ ffs_clrblock(fs, cp, h) cp[h >> 3] &= ~(0x01 << (h & 0x7)); return; default: +#ifdef _KERNEL panic("ffs_clrblock"); +#endif + break; } } @@ -281,6 +314,101 @@ ffs_setblock(fs, cp, h) cp[h >> 3] |= (0x01 << (h & 0x7)); return; default: +#ifdef _KERNEL panic("ffs_setblock"); +#endif + break; } } + +/* + * Update the cluster map because of an allocation or free. + * + * Cnt == 1 means free; cnt == -1 means allocating. + */ +void +ffs_clusteracct(fs, cgp, blkno, cnt) + struct fs *fs; + struct cg *cgp; + ufs1_daddr_t blkno; + int cnt; +{ + int32_t *sump; + int32_t *lp; + u_char *freemapp, *mapp; + int i, start, end, forw, back, map, bit; + + if (fs->fs_contigsumsize <= 0) + return; + freemapp = cg_clustersfree(cgp); + sump = cg_clustersum(cgp); + /* + * Allocate or clear the actual block. + */ + if (cnt > 0) + setbit(freemapp, blkno); + else + clrbit(freemapp, blkno); + /* + * Find the size of the cluster going forward. + */ + start = blkno + 1; + end = start + fs->fs_contigsumsize; + if (end >= cgp->cg_nclusterblks) + end = cgp->cg_nclusterblks; + mapp = &freemapp[start / NBBY]; + map = *mapp++; + bit = 1 << (start % NBBY); + for (i = start; i < end; i++) { + if ((map & bit) == 0) + break; + if ((i & (NBBY - 1)) != (NBBY - 1)) { + bit <<= 1; + } else { + map = *mapp++; + bit = 1; + } + } + forw = i - start; + /* + * Find the size of the cluster going backward. + */ + start = blkno - 1; + end = start - fs->fs_contigsumsize; + if (end < 0) + end = -1; + mapp = &freemapp[start / NBBY]; + map = *mapp--; + bit = 1 << (start % NBBY); + for (i = start; i > end; i--) { + if ((map & bit) == 0) + break; + if ((i & (NBBY - 1)) != 0) { + bit >>= 1; + } else { + map = *mapp--; + bit = 1 << (NBBY - 1); + } + } + back = start - i; + /* + * Account for old cluster and the possibly new forward and + * back clusters. + */ + i = back + forw + 1; + if (i > fs->fs_contigsumsize) + i = fs->fs_contigsumsize; + sump[i] += cnt; + if (back > 0) + sump[back] -= cnt; + if (forw > 0) + sump[forw] -= cnt; + /* + * Update cluster summary information. + */ + lp = &sump[fs->fs_contigsumsize]; + for (i = fs->fs_contigsumsize; i > 0; i--) + if (*lp-- > 0) + break; + fs->fs_maxcluster[cgp->cg_cgx] = i; +} Index: /usr/src/sys/ufs/ffs/softdep.h =================================================================== --- /usr/src/sys/ufs/ffs/softdep.h (revision 200565) +++ /usr/src/sys/ufs/ffs/softdep.h (working copy) @@ -98,18 +98,20 @@ #define UNDONE 0x0002 #define COMPLETE 0x0004 #define DEPCOMPLETE 0x0008 -#define MKDIR_PARENT 0x0010 /* diradd & mkdir only */ -#define MKDIR_BODY 0x0020 /* diradd & mkdir only */ +#define MKDIR_PARENT 0x0010 /* diradd, mkdir, jaddref, jsegdep only */ +#define MKDIR_BODY 0x0020 /* diradd, mkdir, jaddref only */ #define RMDIR 0x0040 /* dirrem only */ -#define DIRCHG 0x0080 /* diradd & dirrem only */ -#define GOINGAWAY 0x0100 /* indirdep only */ -#define IOSTARTED 0x0200 /* inodedep & pagedep only */ +#define DIRCHG 0x0080 /* diradd, dirrem only */ +#define GOINGAWAY 0x0100 /* indirdep, jremref only */ +#define IOSTARTED 0x0200 /* inodedep, pagedep, bmsafemap only */ #define SPACECOUNTED 0x0400 /* inodedep only */ -#define NEWBLOCK 0x0800 /* pagedep only */ +#define NEWBLOCK 0x0800 /* pagedep, jaddref only */ #define INPROGRESS 0x1000 /* dirrem, freeblks, freefrag, freefile only */ #define UFS1FMT 0x2000 /* indirdep only */ #define EXTDATA 0x4000 /* allocdirect only */ #define ONWORKLIST 0x8000 +#define IOWAITING 0x10000 /* Thread is waiting for IO to complete. */ +#define ONDEPLIST 0x20000 /* Structure is on a dependency list. */ #define ALLCOMPLETE (ATTACHED | COMPLETE | DEPCOMPLETE) @@ -135,10 +137,10 @@ * and the macros below changed to use it. */ struct worklist { + LIST_ENTRY(worklist) wk_list; /* list of work requests */ struct mount *wk_mp; /* Mount we live in */ - LIST_ENTRY(worklist) wk_list; /* list of work requests */ - unsigned short wk_type; /* type of request */ - unsigned short wk_state; /* state flags */ + unsigned int wk_type:8, /* type of request */ + wk_state:24; /* state flags */ }; #define WK_DATA(wk) ((void *)(wk)) #define WK_PAGEDEP(wk) ((struct pagedep *)(wk)) @@ -149,11 +151,20 @@ struct worklist { #define WK_ALLOCINDIR(wk) ((struct allocindir *)(wk)) #define WK_FREEFRAG(wk) ((struct freefrag *)(wk)) #define WK_FREEBLKS(wk) ((struct freeblks *)(wk)) +#define WK_FREEWORK(wk) ((struct freework *)(wk)) #define WK_FREEFILE(wk) ((struct freefile *)(wk)) #define WK_DIRADD(wk) ((struct diradd *)(wk)) #define WK_MKDIR(wk) ((struct mkdir *)(wk)) #define WK_DIRREM(wk) ((struct dirrem *)(wk)) #define WK_NEWDIRBLK(wk) ((struct newdirblk *)(wk)) +#define WK_JADDREF(wk) ((struct jaddref *)(wk)) +#define WK_JREMREF(wk) ((struct jremref *)(wk)) +#define WK_JSEGDEP(wk) ((struct jsegdep *)(wk)) +#define WK_JSEG(wk) ((struct jseg *)(wk)) +#define WK_JNEWBLK(wk) ((struct jnewblk *)(wk)) +#define WK_JFREEBLK(wk) ((struct jfreeblk *)(wk)) +#define WK_FREEDEP(wk) ((struct freedep *)(wk)) +#define WK_JFREEFRAG(wk) ((struct jfreefrag *)(wk)) /* * Various types of lists @@ -165,6 +176,13 @@ LIST_HEAD(inodedephd, inodedep); LIST_HEAD(allocindirhd, allocindir); LIST_HEAD(allocdirecthd, allocdirect); TAILQ_HEAD(allocdirectlst, allocdirect); +LIST_HEAD(indirdephd, indirdep); +LIST_HEAD(jremrefhd, jremref); +LIST_HEAD(jaddrefhd, jaddref); +LIST_HEAD(jnewblkhd, jnewblk); +LIST_HEAD(jfreeblkhd, jfreeblk); +LIST_HEAD(freeworkhd, freework); +TAILQ_HEAD(jseglst, jseg); /* * The "pagedep" structure tracks the various dependencies related to @@ -192,6 +210,7 @@ struct pagedep { LIST_ENTRY(pagedep) pd_hash; /* hashed lookup */ ino_t pd_ino; /* associated file */ ufs_lbn_t pd_lbn; /* block within file */ + struct newdirblk *pd_newdirblk; /* associated newdirblk if NEWBLOCK */ struct dirremhd pd_dirremhd; /* dirrem's waiting for page */ struct diraddhd pd_diraddhd[DAHASHSZ]; /* diradd dir entry updates */ struct diraddhd pd_pendinghd; /* directory entries awaiting write */ @@ -252,7 +271,9 @@ struct inodedep { ino_t id_ino; /* dependent inode */ nlink_t id_nlinkdelta; /* saved effective link count */ LIST_ENTRY(inodedep) id_deps; /* bmsafemap's list of inodedep's */ - struct buf *id_buf; /* related bmsafemap (if pending) */ + struct bmsafemap *id_bmsafemap; /* related bmsafemap (if pending) */ + struct diradd *id_mkdiradd; /* diradd for a mkdir. */ + struct jaddrefhd id_jaddrefhd; /* Journal add refs pending. */ long id_savedextsize; /* ext size saved during rollback */ off_t id_savedsize; /* file size saved during rollback */ struct workhead id_pendinghd; /* entries awaiting directory write */ @@ -283,8 +304,10 @@ struct newblk { struct fs *nb_fs; /* associated filesystem */ int nb_state; /* state of bitmap dependency */ ufs2_daddr_t nb_newblkno; /* allocated block number */ + /* XXX nb_deps not needed with journaling. */ LIST_ENTRY(newblk) nb_deps; /* bmsafemap's list of newblk's */ struct bmsafemap *nb_bmsafemap; /* associated bmsafemap */ + struct jnewblk *nb_jnewblk; /* Journal entry. */ }; /* @@ -299,11 +322,21 @@ struct newblk { */ struct bmsafemap { struct worklist sm_list; /* cylgrp buffer */ +# define sm_state sm_list.wk_state + 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 */ struct allocindirhd sm_allocindirhd; /* allocindir deps */ + struct allocindirhd sm_allocindirwr; /* writing allocindir deps */ struct inodedephd sm_inodedephd; /* inodedep deps */ - struct newblkhd sm_newblkhd; /* newblk deps */ + struct inodedephd sm_inodedepwr; /* writing inodedep deps */ + /* XXX newblk* not needed with journaling. */ + struct newblkhd sm_newblkhd; /* newblk deps, unused with journal */ + struct newblkhd sm_newblkwr; /* writing newblk deps */ + struct jaddrefhd sm_jaddrefhd; /* Pending inode allocations. */ + struct jnewblkhd sm_jnewblkhd; /* Pending block allocations. */ }; /* @@ -337,16 +370,19 @@ struct allocdirect { struct worklist ad_list; /* buffer holding block */ # define ad_state ad_list.wk_state /* block pointer state */ TAILQ_ENTRY(allocdirect) ad_next; /* inodedep's list of allocdirect's */ - ufs_lbn_t ad_lbn; /* block within file */ + int ad_offset; /* inode disk address offset */ ufs2_daddr_t ad_newblkno; /* new value of block pointer */ ufs2_daddr_t ad_oldblkno; /* old value of block pointer */ long ad_newsize; /* size of new block */ long ad_oldsize; /* size of old block */ LIST_ENTRY(allocdirect) ad_deps; /* bmsafemap's list of allocdirect's */ - struct buf *ad_buf; /* cylgrp buffer (if pending) */ + struct bmsafemap *ad_bmsafemap;/* cylgrp dep (if pending) */ struct inodedep *ad_inodedep; /* associated inodedep */ struct freefrag *ad_freefrag; /* fragment to be freed (if any) */ + struct indirdephd ad_indirdeps; /* Children indirect blocks. */ struct workhead ad_newdirblk; /* dir block to notify when written */ + struct jnewblk *ad_jnewblk; /* New block journal entry. */ + struct workhead ad_jwork; /* Journal work pending. */ }; /* @@ -369,10 +405,14 @@ struct allocdirect { struct indirdep { struct worklist ir_list; /* buffer holding indirect block */ # define ir_state ir_list.wk_state /* indirect block pointer state */ - caddr_t ir_saveddata; /* buffer cache contents */ + LIST_ENTRY(indirdep) ir_next; /* alloc{direct,indir} list */ + caddr_t ir_saveddata; /* buffer cache contents */ struct buf *ir_savebp; /* buffer holding safe 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 workhead ir_jwork; /* Journal work pending. */ }; /* @@ -398,7 +438,11 @@ struct allocindir { struct freefrag *ai_freefrag; /* block to be freed when complete */ struct indirdep *ai_indirdep; /* address of associated indirdep */ LIST_ENTRY(allocindir) ai_deps; /* bmsafemap's list of allocindir's */ - struct buf *ai_buf; /* cylgrp buffer (if pending) */ + struct bmsafemap *ai_bmsafemap;/* cylgrp dep (if pending) */ + struct indirdephd ai_indirdeps;/* Children indirect blocks. */ + struct workhead ai_newdirblk; /* dir block to notify when written */ + struct jnewblk *ai_jnewblk; /* New block journal entry. */ + struct workhead ai_jwork; /* Journal work pending. */ }; /* @@ -406,14 +450,13 @@ struct allocindir { * allocated fragment is replaced with a larger fragment, rather than extended. * The "freefrag" structure is constructed and attached when the replacement * block is first allocated. It is processed after the inode claiming the - * bigger block that replaces it has been written to disk. Note that the - * ff_state field is is used to store the uid, so may lose data. However, - * the uid is used only in printing an error message, so is not critical. - * Keeping it in a short keeps the data structure down to 32 bytes. + * bigger block that replaces it has been written to disk. */ struct freefrag { struct worklist ff_list; /* id_inowait or delayed worklist */ -# define ff_state ff_list.wk_state /* owning user; should be uid_t */ +# define ff_state ff_list.wk_state + struct jfreefrag *ff_jfreefrag; /* Associated journal entry. */ + struct workhead ff_jwork; /* Journal work pending. */ ufs2_daddr_t ff_blkno; /* fragment physical block number */ long ff_fragsize; /* size of fragment being deleted */ ino_t ff_inum; /* owning inode number */ @@ -423,23 +466,59 @@ struct freefrag { * A "freeblks" structure is attached to an "inodedep" when the * corresponding file's length is reduced to zero. It records all * the information needed to free the blocks of a file after its - * zero'ed inode has been written to disk. + * zero'ed inode has been written to disk. The actual work is done + * by child freework structures which are responsible for individual + * inode pointers while freeblks is responsible for retiring the + * entire operation when it is complete and holding common members. */ struct freeblks { struct worklist fb_list; /* id_inowait or delayed worklist */ # define fb_state fb_list.wk_state /* inode and dirty block state */ + 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 */ uid_t fb_uid; /* uid of previous owner of blocks */ struct vnode *fb_devvp; /* filesystem device vnode */ - long fb_oldextsize; /* previous ext data size */ - off_t fb_oldsize; /* previous file size */ ufs2_daddr_t fb_chkcnt; /* used to check cnt of blks released */ - ufs2_daddr_t fb_dblks[NDADDR]; /* direct blk ptrs to deallocate */ - ufs2_daddr_t fb_iblks[NIADDR]; /* indirect blk ptrs to deallocate */ - ufs2_daddr_t fb_eblks[NXADDR]; /* indirect blk ptrs to deallocate */ + int fb_ref; /* Children outstanding. */ }; /* + * A "freework" structure handles the release of a tree of blocks or a single + * block. Each indirect block in a tree is allocated its own freework + * structure so that the indrect block may be freed only when all of its + * children are freed. In this way we enforce the rule that an allocated + * block must have a valid path to a root that is journaled. Each child + * block acquires a reference and when the ref hits zero the parent ref + * is decremented. If there is no parent the freeblks ref is decremented. + */ +struct freework { + struct worklist fw_list; +# define fw_state fw_list.wk_state + LIST_ENTRY(freework) fw_next; /* Queue for freeblksk. */ + struct freeblks *fw_freeblks; /* Root of operation. */ + struct freework *fw_parent; /* Parent indirect. */ + 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. */ + struct workhead fw_jwork; /* Journal work pending. */ +}; + +/* + * A "freedep" structure is allocated to track the completion of a bitmap + * write for a freework. One freedep may cover many freed blocks so long + * as they reside in the same cylinder group. When the cg is written + * the freedep decrements the ref on the freework which may permit it + * to be freed as well. + */ +struct freedep { + struct worklist fd_list; + struct freework *fd_freework; /* Parent freework. */ +}; + +/* * A "freefile" structure is attached to an inode when its * link count is reduced to zero. It marks the inode as free in * the cylinder group map after the zero'ed inode has been written @@ -450,6 +529,7 @@ struct freefile { mode_t fx_mode; /* mode of inode */ ino_t fx_oldinum; /* inum of the unlinked file */ struct vnode *fx_devvp; /* filesystem device vnode */ + struct workhead fx_jwork; /* journal work pending. */ }; /* @@ -482,12 +562,11 @@ struct freefile { * than zero. * * The overlaying of da_pagedep and da_previous is done to keep the - * structure down to 32 bytes in size on a 32-bit machine. If a - * da_previous entry is present, the pointer to its pagedep is available - * in the associated dirrem entry. If the DIRCHG flag is set, the - * da_previous entry is valid; if not set the da_pagedep entry is valid. - * The DIRCHG flag never changes; it is set when the structure is created - * if appropriate and is never cleared. + * structure down. If a da_previous entry is present, the pointer to its + * pagedep is available in the associated dirrem entry. If the DIRCHG flag + * is set, the da_previous entry is valid; if not set the da_pagedep entry + * is valid. The DIRCHG flag never changes; it is set when the structure + * is created if appropriate and is never cleared. */ struct diradd { struct worklist da_list; /* id_inowait or id_pendinghd list */ @@ -499,6 +578,7 @@ struct diradd { struct dirrem *dau_previous; /* entry being replaced in dir change */ struct pagedep *dau_pagedep; /* pagedep dependency for addition */ } da_un; + struct workhead da_jwork; /* Journal work awaiting completion. */ }; #define da_previous da_un.dau_previous #define da_pagedep da_un.dau_pagedep @@ -525,12 +605,13 @@ struct diradd { * mkdir structures that reference it. The deletion would be faster if the * diradd structure were simply augmented to have two pointers that referenced * the associated mkdir's. However, this would increase the size of the diradd - * structure from 32 to 64-bits to speed a very infrequent operation. + * structure to speed a very infrequent operation. */ struct mkdir { struct worklist md_list; /* id_inowait or buffer holding dir */ # define md_state md_list.wk_state /* type: MKDIR_PARENT or MKDIR_BODY */ struct diradd *md_diradd; /* associated diradd */ + struct jaddref *md_jaddref; /* dependent jaddref. */ struct buf *md_buf; /* MKDIR_BODY: buffer holding dir */ LIST_ENTRY(mkdir) md_mkdirs; /* list of all mkdirs */ }; @@ -542,20 +623,18 @@ LIST_HEAD(mkdirlist, mkdir) mkdirlisthd; * list of the pagedep for the directory page that contains the entry. * It is processed after the directory page with the deleted entry has * been written to disk. - * - * The overlaying of dm_pagedep and dm_dirinum is done to keep the - * structure down to 32 bytes in size on a 32-bit machine. It works - * because they are never used concurrently. */ struct dirrem { struct worklist dm_list; /* delayed worklist */ # define dm_state dm_list.wk_state /* state of the old directory entry */ LIST_ENTRY(dirrem) dm_next; /* pagedep's list of dirrem's */ + struct jremrefhd dm_jremrefhd; /* Pending remove reference deps. */ ino_t dm_oldinum; /* inum of the removed dir entry */ union { struct pagedep *dmu_pagedep; /* pagedep dependency for remove */ ino_t dmu_dirinum; /* parent inode number (for rmdir) */ } dm_un; + struct workhead dm_jwork; /* Journal work awaiting completion. */ }; #define dm_pagedep dm_un.dmu_pagedep #define dm_dirinum dm_un.dmu_dirinum @@ -577,9 +656,156 @@ struct dirrem { * blocks using a similar scheme with the allocindir structures. Rather * than adding this level of complexity, we simply write those newly * allocated indirect blocks synchronously as such allocations are rare. + * In the case of a new directory the . and .. links are tracked with + * a mkdir rather than a pagedep. In this case we track the mkdir + * so it can be released when it is written. A workhead is used + * to simplify canceling a mkdir that is removed by a subsequent dirrem. */ struct newdirblk { struct worklist db_list; /* id_inowait or pg_newdirblk */ # define db_state db_list.wk_state /* unused */ struct pagedep *db_pagedep; /* associated pagedep */ + struct workhead db_mkdir; }; + +/* + * A "jaddref" structure tracks a new reference (link count) on an inode + * and prevents the link count increase and bitmap allocation until a + * journal entry can be written. Once the journal entry is written, + * the inode is put on the pendinghd of the bmsafemap and a diradd or + * mkdir entry is placed on the bufwait list of the inode. The DEPCOMPLETE + * flag is used to indicate that all of the required information for writing + * the journal entry is present. MKDIR_BODY and MKDIR_PARENT are used to + * differentiate . and .. links from regular file names. NEWBLOCK indicates + * a bitmap is still pending. If a new reference is canceled by a delete + * prior to writing the journal the jaddref write is canceled and the + * structure persists to prevent any disk-visible changes until it is + * ultimately released when the file is freed or the link is dropped again. + */ +struct jaddref { + struct worklist ja_list; /* Journal pending or jseg entries. */ +# define ja_state ja_list.wk_state + union { + struct diradd *jau_diradd; /* Pending diradd. */ + struct mkdir *jau_mkdir; /* MKDIR_{PARENT,BODY} */ + } ja_un; + LIST_ENTRY(jaddref) ja_bmdeps; /* Links for bmsafemap. */ + LIST_ENTRY(jaddref) ja_inodeps; /* Links for inodedep. */ + off_t ja_diroff; /* Directory offset. */ + ino_t ja_ino; /* Inode number. */ + ino_t ja_parent; /* Parent inode number. */ + int16_t ja_nlink; /* nlink before addition. */ + uint16_t ja_mode; /* File mode, needed for IFMT. */ +}; +#define ja_diradd ja_un.jau_diradd +#define ja_mkdir ja_un.jau_mkdir + +/* + * A "jremref" structure tracks a removed reference (unlink) on an + * inode and prevents the directory remove from proceeding until the + * journal entry is written. Once the journal has been written the remove + * may proceed as normal. + */ +struct jremref { + struct worklist jr_list; /* Journal pending or jseg entries. */ +# define jr_state jr_list.wk_state + struct dirrem *jr_dirrem; /* Back pointer to dirrem. */ + LIST_ENTRY(jremref) jr_deps; /* Links for pagdep. */ + off_t jr_diroff; /* Directory offset. */ + ino_t jr_ino; /* Inode number. */ + ino_t jr_parent; /* Parent inode number. */ + int16_t jr_nlink; /* nlink before the removal. */ + uint16_t jr_mode; /* File mode, needed for IFMT. */ +}; + +/* + * A "jnewblk" structure tracks a newly allocated block or fragment and + * prevents the direct or indirect block pointer as well as the cg bitmap + * from being written until it is logged. After it is logged the jsegdep + * is attached to the allocdirect or allocindir until the operation is + * completed or reverted. If the operation is reverted prior to the journal + * write the jnewblk structure is maintained to prevent the bitmaps from + * reaching the disk. Ultimately the jnewblk structure will be passed + * to the free routine as the in memory cg is modified back to the free + * state at which time it can be released. + */ +struct jnewblk { + struct worklist jn_list; +# define jn_state jn_list.wk_state + LIST_ENTRY(jnewblk) jn_deps; /* All jnewblks on bmsafemap */ + union { + struct newblk *jnu_newblk; /* newblk if not DEPCOMPLETE */ + struct worklist *jnu_dep; /* allocdirect or allocindir */ + } jn_un; + ino_t jn_ino; + ufs_lbn_t jn_lbn; + ufs2_daddr_t jn_blkno; + int jn_oldfrags; + int jn_frags; +}; +#define jn_newblk jn_un.jnu_newblk +#define jn_dep jn_un.jnu_dep + +/* + * A "jfreeblk" structure tracks the journal write for freeing a block + * or tree of blocks. The block pointer must not be cleared in the inode + * or indirect prior to the jfreeblk being written. + */ +struct jfreeblk { + struct worklist jf_list; +# define jf_state jf_list.wk_state + struct freeblks *jf_freeblks; + LIST_ENTRY(jfreeblk) jf_deps; + ino_t jf_ino; + ufs_lbn_t jf_lbn; + ufs2_daddr_t jf_blkno; + int jf_frags; +}; + +/* + * A "jfreefrag" tracks the freeing of a single block when a fragment is + * extended or an indirect page is replaced. It is not part of a larger + * freeblks operation. + */ +struct jfreefrag { + struct worklist fr_list; +# define fr_state fr_list.wk_state + struct freefrag *fr_freefrag; + ino_t fr_ino; + ufs_lbn_t fr_lbn; + ufs2_daddr_t fr_blkno; + int fr_frags; +}; + +/* + * A "jsegdep" structure tracks a single reference to a written journal + * segment so the journal space can be reclaimed when all dependencies + * have been written. + */ +struct jsegdep { + struct worklist jd_list; +# define jd_state jd_list.wk_state + struct jseg *jd_seg; + short jd_type; + short jd_line; +}; + +/* + * A "jseg" structure contains all of the journal records written in a + * single disk write. jaddref and jremref structures are linked into + * js_entries so thay may be completed when the write completes. The + * js_deps array contains as many entries as there are ref counts to + * reduce the number of allocations required per journal write to one. + */ +struct jseg { + struct worklist js_list; /* b_deps link for journal */ + struct workhead js_entries; /* Entries awaiting write */ + TAILQ_ENTRY(jseg) js_next; + struct jblocks *js_jblocks; /* Back pointer to block/seg list */ + struct buf *js_buf; /* Buffer while unwritten */ + uint64_t js_seq; + int js_size; /* Allocated size in bytes */ + int js_cnt; /* Total items allocated */ + int js_refs; /* Count of items pending completion */ + struct jsegdep js_deps[0]; /* Dependencies for completion */ +}; Index: /usr/src/sys/ufs/ffs/ffs_balloc.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_balloc.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_balloc.c (working copy) @@ -138,7 +138,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (error) return (error); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, nb, + softdep_setup_allocdirect(ip, nb, nb, dbtofsb(fs, bp->b_blkno), dp->di_db[nb], fs->fs_bsize, osize, bp); ip->i_size = smalllblktosize(fs, nb + 1); @@ -190,7 +190,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (error) return (error); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, lbn, + softdep_setup_allocdirect(ip, lbn, lbn, dbtofsb(fs, bp->b_blkno), nb, nsize, osize, bp); } @@ -210,7 +210,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (flags & BA_CLRBUF) vfs_bio_clrbuf(bp); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, lbn, newb, 0, + softdep_setup_allocdirect(ip, lbn, lbn, newb, 0, nsize, 0, bp); } dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno); @@ -255,7 +255,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse vfs_bio_clrbuf(bp); if (DOINGSOFTDEP(vp)) { softdep_setup_allocdirect(ip, NDADDR + indirs[0].in_off, - newb, 0, fs->fs_bsize, 0, bp); + indirs[0].in_lbn, newb, 0, fs->fs_bsize, 0, bp); bdwrite(bp); } else { /* @@ -305,8 +305,8 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse nbp->b_blkno = fsbtodb(fs, nb); vfs_bio_clrbuf(nbp); if (DOINGSOFTDEP(vp)) { - softdep_setup_allocindir_meta(nbp, ip, bp, - indirs[i - 1].in_off, nb); + softdep_setup_allocindir_meta(nbp, ip, bp, indirs, i, + nb); bdwrite(nbp); } else { /* @@ -361,8 +361,8 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffse if (flags & BA_CLRBUF) vfs_bio_clrbuf(nbp); if (DOINGSOFTDEP(vp)) - softdep_setup_allocindir_page(ip, lbn, bp, - indirs[i].in_off, nb, 0, nbp); + softdep_setup_allocindir_page(ip, bp, indirs, i, lbn, + nb, 0, nbp); bap[indirs[i].in_off] = nb; /* * If required, write synchronously, otherwise use @@ -418,6 +418,8 @@ fail: * slow, running out of disk space is not expected to be a common * occurence. The error return from fsync is ignored as we already * have an error to return to the user. + * + * XXX Still have to journal the free below */ (void) ffs_syncvnode(vp, MNT_WAIT); for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns; @@ -473,7 +475,7 @@ fail: */ for (blkp = allociblk; blkp < allocblk; blkp++) { ffs_blkfree(ump, fs, ip->i_devvp, *blkp, fs->fs_bsize, - ip->i_number); + ip->i_number, NULL); } return (error); } @@ -643,7 +645,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (error) return (error); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, nb, + softdep_setup_allocdirect(ip, nb, nb, dbtofsb(fs, bp->b_blkno), dp->di_db[nb], fs->fs_bsize, osize, bp); @@ -696,7 +698,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (error) return (error); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, lbn, + softdep_setup_allocdirect(ip, lbn, lbn, dbtofsb(fs, bp->b_blkno), nb, nsize, osize, bp); } @@ -716,7 +718,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (flags & BA_CLRBUF) vfs_bio_clrbuf(bp); if (DOINGSOFTDEP(vp)) - softdep_setup_allocdirect(ip, lbn, newb, 0, + softdep_setup_allocdirect(ip, lbn, lbn, newb, 0, nsize, 0, bp); } dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno); @@ -761,7 +763,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse vfs_bio_clrbuf(bp); if (DOINGSOFTDEP(vp)) { softdep_setup_allocdirect(ip, NDADDR + indirs[0].in_off, - newb, 0, fs->fs_bsize, 0, bp); + indirs[0].in_lbn, newb, 0, fs->fs_bsize, 0, bp); bdwrite(bp); } else { /* @@ -811,8 +813,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse nbp->b_blkno = fsbtodb(fs, nb); vfs_bio_clrbuf(nbp); if (DOINGSOFTDEP(vp)) { - softdep_setup_allocindir_meta(nbp, ip, bp, - indirs[i - 1].in_off, nb); + softdep_setup_allocindir_meta(nbp, ip, bp, indirs, i, + nb); bdwrite(nbp); } else { /* @@ -867,8 +869,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffse if (flags & BA_CLRBUF) vfs_bio_clrbuf(nbp); if (DOINGSOFTDEP(vp)) - softdep_setup_allocindir_page(ip, lbn, bp, - indirs[i].in_off, nb, 0, nbp); + softdep_setup_allocindir_page(ip, bp, indirs, i, lbn, + nb, 0, nbp); bap[indirs[i].in_off] = nb; /* * If required, write synchronously, otherwise use @@ -930,6 +932,8 @@ fail: * slow, running out of disk space is not expected to be a common * occurence. The error return from fsync is ignored as we already * have an error to return to the user. + * + * XXX Still have to journal the free below */ (void) ffs_syncvnode(vp, MNT_WAIT); for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns; @@ -985,7 +989,7 @@ fail: */ for (blkp = allociblk; blkp < allocblk; blkp++) { ffs_blkfree(ump, fs, ip->i_devvp, *blkp, fs->fs_bsize, - ip->i_number); + ip->i_number, NULL); } return (error); } Index: /usr/src/sys/ufs/ffs/ffs_inode.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_inode.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_inode.c (working copy) @@ -232,7 +232,7 @@ ffs_truncate(vp, length, flags, cred, td) if (oldblks[i] == 0) continue; ffs_blkfree(ump, fs, ip->i_devvp, oldblks[i], - sblksize(fs, osize, i), ip->i_number); + sblksize(fs, osize, i), ip->i_number, NULL); } } } @@ -336,6 +336,8 @@ ffs_truncate(vp, length, flags, cred, td) * zero'ed in case it ever becomes accessible again because * of subsequent file growth. Directories however are not * zero'ed as they should grow back initialized to empty. + * + * XXX Still need to manually journal this. */ offset = blkoff(fs, length); if (offset == 0) { @@ -445,7 +447,7 @@ ffs_truncate(vp, length, flags, cred, td) if (lastiblock[level] < 0) { DIP_SET(ip, i_ib[level], 0); ffs_blkfree(ump, fs, ip->i_devvp, bn, - fs->fs_bsize, ip->i_number); + fs->fs_bsize, ip->i_number, NULL); blocksreleased += nblocks; } } @@ -464,7 +466,8 @@ ffs_truncate(vp, length, flags, cred, td) continue; DIP_SET(ip, i_db[i], 0); bsize = blksize(fs, ip, i); - ffs_blkfree(ump, fs, ip->i_devvp, bn, bsize, ip->i_number); + ffs_blkfree(ump, fs, ip->i_devvp, bn, bsize, ip->i_number, + NULL); blocksreleased += btodb(bsize); } if (lastblock < 0) @@ -496,7 +499,7 @@ ffs_truncate(vp, length, flags, cred, td) */ bn += numfrags(fs, newspace); ffs_blkfree(ump, fs, ip->i_devvp, bn, - oldspace - newspace, ip->i_number); + oldspace - newspace, ip->i_number, NULL); blocksreleased += btodb(oldspace - newspace); } } @@ -638,7 +641,7 @@ ffs_indirtrunc(ip, lbn, dbn, lastbn, level, countp blocksreleased += blkcount; } ffs_blkfree(ip->i_ump, fs, ip->i_devvp, nb, fs->fs_bsize, - ip->i_number); + ip->i_number, NULL); blocksreleased += nblocks; } Index: /usr/src/sys/ufs/ffs/ffs_snapshot.c =================================================================== --- /usr/src/sys/ufs/ffs/ffs_snapshot.c (revision 200565) +++ /usr/src/sys/ufs/ffs/ffs_snapshot.c (working copy) @@ -582,7 +582,8 @@ loop: len = fragroundup(fs, blkoff(fs, xp->i_size)); if (len != 0 && len < fs->fs_bsize) { ffs_blkfree(ump, copy_fs, vp, - DIP(xp, i_db[loc]), len, xp->i_number); + DIP(xp, i_db[loc]), len, xp->i_number, + NULL); blkno = DIP(xp, i_db[loc]); DIP_SET(xp, i_db[loc], 0); } @@ -598,7 +599,7 @@ loop: DIP_SET(xp, i_db[loc], blkno); if (!error) error = ffs_freefile(ump, copy_fs, vp, xp->i_number, - xp->i_mode); + xp->i_mode, NULL); VOP_UNLOCK(xvp, 0); vdrop(xvp); if (error) { @@ -700,7 +701,7 @@ out1: copy_fs, vp, xp->i_number, - xp->i_mode); + xp->i_mode, NULL); } if (error) { fs->fs_snapinum[snaploc] = 0; @@ -1220,7 +1221,7 @@ mapacct_ufs1(vp, oldblkp, lastblkp, fs, lblkno, ex *ip->i_snapblklist++ = lblkno; if (blkno == BLK_SNAP) blkno = blkstofrags(fs, lblkno); - ffs_blkfree(ip->i_ump, fs, vp, blkno, fs->fs_bsize, inum); + ffs_blkfree(ip->i_ump, fs, vp, blkno, fs->fs_bsize, inum, NULL); } return (0); } @@ -1500,7 +1501,7 @@ mapacct_ufs2(vp, oldblkp, lastblkp, fs, lblkno, ex *ip->i_snapblklist++ = lblkno; if (blkno == BLK_SNAP) blkno = blkstofrags(fs, lblkno); - ffs_blkfree(ip->i_ump, fs, vp, blkno, fs->fs_bsize, inum); + ffs_blkfree(ip->i_ump, fs, vp, blkno, fs->fs_bsize, inum, NULL); } return (0); } Index: /usr/src/sys/ufs/ffs/fs.h =================================================================== --- /usr/src/sys/ufs/ffs/fs.h (revision 200565) +++ /usr/src/sys/ufs/ffs/fs.h (working copy) @@ -337,7 +337,9 @@ struct fs { int32_t fs_avgfilesize; /* expected average file size */ int32_t fs_avgfpdir; /* expected # of files per directory */ int32_t fs_save_cgsize; /* save real cg size to use fs_bsize */ - int32_t fs_sparecon32[26]; /* reserved for future constants */ + int32_t fs_sujournal; /* SUJ journal file */ + int32_t fs_sujfree; /* SUJ free list */ + int32_t fs_sparecon32[24]; /* reserved for future constants */ int32_t fs_flags; /* see FS_ flags below */ int32_t fs_contigsumsize; /* size of cluster summary array */ int32_t fs_maxsymlinklen; /* max length of an internal symlink */ @@ -409,6 +411,7 @@ CTASSERT(sizeof(struct fs) == 1376); #define FS_MULTILABEL 0x20 /* file system is MAC multi-label */ #define FS_GJOURNAL 0x40 /* gjournaled file system */ #define FS_FLAGS_UPDATED 0x80 /* flags have been moved to new location */ +#define FS_SUJ 0x100 /* Filesystem using softupdate journal */ /* * Macros to access bits in the fs_active array. @@ -598,8 +601,32 @@ struct cg { ? (fs)->fs_bsize \ : (fragroundup(fs, blkoff(fs, (size))))) - /* + * Indirect lbns are aligned on NDADDR addresses where single indirects + * are the negated address of the lowest lbn reachable, double indirects + * are this lbn - 1 and triple indirects are this lbn - 2. This yields + * an unusual bit order to determine level. + */ +static inline int +lbn_level(ufs_lbn_t lbn) +{ + if (lbn >= 0) + return 0; + switch (lbn & 0x3) { + case 0: + return (0); + case 1: + break; + case 2: + return (2); + case 3: + return (1); + default: + break; + } + return (-1); +} +/* * Number of inodes in a secondary storage block/fragment. */ #define INOPB(fs) ((fs)->fs_inopb) @@ -610,6 +637,66 @@ struct cg { */ #define NINDIR(fs) ((fs)->fs_nindir) +/* + * Softdep journal record format. + */ + +#define JOP_ADDREF 1 /* Add a reference to an inode. */ +#define JOP_REMREF 2 /* Remove a reference from an inode. */ +#define JOP_NEWBLK 3 /* Allocate a block. */ +#define JOP_FREEBLK 4 /* Free a block or a tree of blocks. */ + +#define JREC_SIZE 32 /* Record and segment header size. */ + +#define SUJ_MIN (1 * 1024 * 1024) /* Minimum journal size */ +#define SUJ_MAX (128 * SUJ_MIN) /* Maximum journal size */ + +/* + * Size of the segment record header. There is at most one for each disk + * block and at least one for each filesystem block in the journal. The + * segment header is followed by an array of records. + */ +struct jsegrec { + uint64_t jsr_seq; /* Our sequence number */ + uint64_t jsr_oldest; /* Oldest valid sequence number */ + uint32_t jsr_cnt; /* Count of valid records */ + uint32_t jsr_crc; /* 32bit crc of the valid space */ + uint64_t jsr_unused; +}; + +struct jrefrec { + uint32_t jr_op; + ino_t jr_ino; + ino_t jr_parent; + int16_t jr_nlink; + uint16_t jr_mode; + off_t jr_diroff; + uint64_t jr_unused; +}; + +struct jblkrec { + uint32_t jb_op; + uint32_t jb_ino; + ufs2_daddr_t jb_blkno; + ufs_lbn_t jb_lbn; + uint16_t jb_frags; + uint16_t jb_oldfrags; + uint32_t jb_unused; +}; + +union jrec { + struct jsegrec rec_jsegrec; + struct jrefrec rec_jrefrec; + struct jblkrec rec_jblkrec; +}; + +#ifdef CTASSERT +CTASSERT(sizeof(struct jsegrec) == JREC_SIZE); +CTASSERT(sizeof(struct jrefrec) == JREC_SIZE); +CTASSERT(sizeof(struct jblkrec) == JREC_SIZE); +CTASSERT(sizeof(union jrec) == JREC_SIZE); +#endif + extern int inside[], around[]; extern u_char *fragtbl[]; -- Test scenario: run.sh marcuscfg