head 1.10; access; symbols netbsd-11-0-RC4:1.10 netbsd-11-0-RC3:1.10 netbsd-11-0-RC2:1.10 netbsd-11-0-RC1:1.10 perseant-exfatfs-base-20250801:1.10 netbsd-11:1.10.0.202 netbsd-11-base:1.10 netbsd-10-1-RELEASE:1.10 perseant-exfatfs-base-20240630:1.10 perseant-exfatfs:1.10.0.200 perseant-exfatfs-base:1.10 netbsd-8-3-RELEASE:1.10 netbsd-9-4-RELEASE:1.10 netbsd-10-0-RELEASE:1.10 netbsd-10-0-RC6:1.10 netbsd-10-0-RC5:1.10 netbsd-10-0-RC4:1.10 netbsd-10-0-RC3:1.10 netbsd-10-0-RC2:1.10 thorpej-ifq:1.10.0.198 thorpej-ifq-base:1.10 thorpej-altq-separation:1.10.0.196 thorpej-altq-separation-base:1.10 netbsd-10-0-RC1:1.10 netbsd-10:1.10.0.194 netbsd-10-base:1.10 bouyer-sunxi-drm:1.10.0.192 bouyer-sunxi-drm-base:1.10 netbsd-9-3-RELEASE:1.10 thorpej-i2c-spi-conf2:1.10.0.190 thorpej-i2c-spi-conf2-base:1.10 thorpej-futex2:1.10.0.188 thorpej-futex2-base:1.10 thorpej-cfargs2:1.10.0.186 thorpej-cfargs2-base:1.10 cjep_sun2x-base1:1.10 cjep_sun2x:1.10.0.184 cjep_sun2x-base:1.10 cjep_staticlib_x-base1:1.10 netbsd-9-2-RELEASE:1.10 cjep_staticlib_x:1.10.0.182 cjep_staticlib_x-base:1.10 thorpej-i2c-spi-conf:1.10.0.180 thorpej-i2c-spi-conf-base:1.10 thorpej-cfargs:1.10.0.178 thorpej-cfargs-base:1.10 thorpej-futex:1.10.0.176 thorpej-futex-base:1.10 netbsd-9-1-RELEASE:1.10 bouyer-xenpvh-base2:1.10 phil-wifi-20200421:1.10 bouyer-xenpvh-base1:1.10 phil-wifi-20200411:1.10 bouyer-xenpvh:1.10.0.174 bouyer-xenpvh-base:1.10 is-mlppp:1.10.0.172 is-mlppp-base:1.10 phil-wifi-20200406:1.10 netbsd-8-2-RELEASE:1.10 ad-namecache-base3:1.10 netbsd-9-0-RELEASE:1.10 netbsd-9-0-RC2:1.10 ad-namecache-base2:1.10 ad-namecache-base1:1.10 ad-namecache:1.10.0.170 ad-namecache-base:1.10 netbsd-9-0-RC1:1.10 phil-wifi-20191119:1.10 netbsd-9:1.10.0.168 netbsd-9-base:1.10 phil-wifi-20190609:1.10 netbsd-8-1-RELEASE:1.10 netbsd-8-1-RC1:1.10 isaki-audio2:1.10.0.166 isaki-audio2-base:1.10 pgoyette-compat-merge-20190127:1.10 pgoyette-compat-20190127:1.10 pgoyette-compat-20190118:1.10 pgoyette-compat-1226:1.10 pgoyette-compat-1126:1.10 pgoyette-compat-1020:1.10 pgoyette-compat-0930:1.10 pgoyette-compat-0906:1.10 netbsd-7-2-RELEASE:1.10 pgoyette-compat-0728:1.10 netbsd-8-0-RELEASE:1.10 phil-wifi:1.10.0.164 phil-wifi-base:1.10 pgoyette-compat-0625:1.10 netbsd-8-0-RC2:1.10 pgoyette-compat-0521:1.10 pgoyette-compat-0502:1.10 pgoyette-compat-0422:1.10 netbsd-8-0-RC1:1.10 pgoyette-compat-0415:1.10 pgoyette-compat-0407:1.10 pgoyette-compat-0330:1.10 pgoyette-compat-0322:1.10 pgoyette-compat-0315:1.10 netbsd-7-1-2-RELEASE:1.10 pgoyette-compat:1.10.0.162 pgoyette-compat-base:1.10 netbsd-7-1-1-RELEASE:1.10 tls-maxphys-base-20171202:1.10 matt-nb8-mediatek:1.10.0.160 matt-nb8-mediatek-base:1.10 nick-nhusb-base-20170825:1.10 perseant-stdc-iso10646:1.10.0.158 perseant-stdc-iso10646-base:1.10 netbsd-8:1.10.0.156 netbsd-8-base:1.10 prg-localcount2-base3:1.10 prg-localcount2-base2:1.10 prg-localcount2-base1:1.10 prg-localcount2:1.10.0.154 prg-localcount2-base:1.10 pgoyette-localcount-20170426:1.10 bouyer-socketcan-base1:1.10 jdolecek-ncq:1.10.0.152 jdolecek-ncq-base:1.10 pgoyette-localcount-20170320:1.10 netbsd-7-1:1.10.0.150 netbsd-7-1-RELEASE:1.10 netbsd-7-1-RC2:1.10 nick-nhusb-base-20170204:1.10 netbsd-7-nhusb-base-20170116:1.10 bouyer-socketcan:1.10.0.148 bouyer-socketcan-base:1.10 pgoyette-localcount-20170107:1.10 netbsd-7-1-RC1:1.10 nick-nhusb-base-20161204:1.10 pgoyette-localcount-20161104:1.10 netbsd-7-0-2-RELEASE:1.10 nick-nhusb-base-20161004:1.10 localcount-20160914:1.10 netbsd-7-nhusb:1.10.0.146 netbsd-7-nhusb-base:1.10 pgoyette-localcount-20160806:1.10 pgoyette-localcount-20160726:1.10 pgoyette-localcount:1.10.0.144 pgoyette-localcount-base:1.10 nick-nhusb-base-20160907:1.10 nick-nhusb-base-20160529:1.10 netbsd-7-0-1-RELEASE:1.10 nick-nhusb-base-20160422:1.10 nick-nhusb-base-20160319:1.10 nick-nhusb-base-20151226:1.10 netbsd-7-0:1.10.0.142 netbsd-7-0-RELEASE:1.10 nick-nhusb-base-20150921:1.10 netbsd-7-0-RC3:1.10 netbsd-7-0-RC2:1.10 netbsd-7-0-RC1:1.10 nick-nhusb-base-20150606:1.10 nick-nhusb-base-20150406:1.10 nick-nhusb:1.10.0.140 nick-nhusb-base:1.10 netbsd-5-2-3-RELEASE:1.10 netbsd-5-1-5-RELEASE:1.10 netbsd-6-0-6-RELEASE:1.10 netbsd-6-1-5-RELEASE:1.10 netbsd-7:1.10.0.138 netbsd-7-base:1.10 yamt-pagecache-base9:1.10 yamt-pagecache-tag8:1.10 netbsd-6-1-4-RELEASE:1.10 netbsd-6-0-5-RELEASE:1.10 tls-earlyentropy:1.10.0.136 tls-earlyentropy-base:1.10 riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.10 riastradh-drm2-base3:1.10 netbsd-6-1-3-RELEASE:1.10 netbsd-6-0-4-RELEASE:1.10 netbsd-5-2-2-RELEASE:1.10 netbsd-5-1-4-RELEASE:1.10 netbsd-6-1-2-RELEASE:1.10 netbsd-6-0-3-RELEASE:1.10 netbsd-5-2-1-RELEASE:1.10 netbsd-5-1-3-RELEASE:1.10 rmind-smpnet-nbase:1.10 netbsd-6-1-1-RELEASE:1.10 riastradh-drm2-base2:1.10 riastradh-drm2-base1:1.10 riastradh-drm2:1.10.0.134 riastradh-drm2-base:1.10 rmind-smpnet:1.10.0.126 rmind-smpnet-base:1.10 netbsd-6-1:1.10.0.132 netbsd-6-0-2-RELEASE:1.10 netbsd-6-1-RELEASE:1.10 khorben-n900:1.10.0.130 netbsd-6-1-RC4:1.10 netbsd-6-1-RC3:1.10 agc-symver:1.10.0.128 agc-symver-base:1.10 netbsd-6-1-RC2:1.10 netbsd-6-1-RC1:1.10 yamt-pagecache-base8:1.10 netbsd-5-2:1.10.0.124 netbsd-6-0-1-RELEASE:1.10 yamt-pagecache-base7:1.10 netbsd-5-2-RELEASE:1.10 netbsd-5-2-RC1:1.10 matt-nb6-plus-nbase:1.10 yamt-pagecache-base6:1.10 netbsd-6-0:1.10.0.122 netbsd-6-0-RELEASE:1.10 netbsd-6-0-RC2:1.10 tls-maxphys:1.10.0.120 tls-maxphys-base:1.10 matt-nb6-plus:1.10.0.118 matt-nb6-plus-base:1.10 netbsd-6-0-RC1:1.10 jmcneill-usbmp-base10:1.10 yamt-pagecache-base5:1.10 jmcneill-usbmp-base9:1.10 yamt-pagecache-base4:1.10 jmcneill-usbmp-base8:1.10 jmcneill-usbmp-base7:1.10 jmcneill-usbmp-base6:1.10 jmcneill-usbmp-base5:1.10 jmcneill-usbmp-base4:1.10 jmcneill-usbmp-base3:1.10 jmcneill-usbmp-pre-base2:1.10 jmcneill-usbmp-base2:1.10 netbsd-6:1.10.0.116 netbsd-6-base:1.10 netbsd-5-1-2-RELEASE:1.10 netbsd-5-1-1-RELEASE:1.10 jmcneill-usbmp:1.10.0.114 jmcneill-usbmp-base:1.10 jmcneill-audiomp3:1.10.0.112 jmcneill-audiomp3-base:1.10 yamt-pagecache-base3:1.10 yamt-pagecache-base2:1.10 yamt-pagecache:1.10.0.110 yamt-pagecache-base:1.10 rmind-uvmplock-nbase:1.10 cherry-xenmp:1.10.0.108 cherry-xenmp-base:1.10 bouyer-quota2-nbase:1.10 bouyer-quota2:1.10.0.106 bouyer-quota2-base:1.10 jruoho-x86intr:1.10.0.104 jruoho-x86intr-base:1.10 matt-mips64-premerge-20101231:1.10 matt-nb5-mips64-premerge-20101231:1.10 matt-nb5-pq3:1.10.0.102 matt-nb5-pq3-base:1.10 netbsd-5-1:1.10.0.100 netbsd-5-1-RELEASE:1.10 uebayasi-xip-base4:1.10 uebayasi-xip-base3:1.10 yamt-nfs-mp-base11:1.10 netbsd-5-1-RC4:1.10 matt-nb5-mips64-k15:1.10 uebayasi-xip-base2:1.10 yamt-nfs-mp-base10:1.10 netbsd-5-1-RC3:1.10 netbsd-5-1-RC2:1.10 uebayasi-xip-base1:1.10 netbsd-5-1-RC1:1.10 rmind-uvmplock:1.10.0.98 rmind-uvmplock-base:1.10 yamt-nfs-mp-base9:1.10 uebayasi-xip:1.10.0.96 uebayasi-xip-base:1.10 netbsd-5-0-2-RELEASE:1.10 matt-nb5-mips64-premerge-20091211:1.10 matt-premerge-20091211:1.10 yamt-nfs-mp-base8:1.10 matt-nb5-mips64-u2-k2-k4-k7-k8-k9:1.10 matt-nb4-mips64-k7-u2a-k9b:1.10 matt-nb5-mips64-u1-k1-k5:1.10 yamt-nfs-mp-base7:1.10 matt-nb5-mips64:1.10.0.94 netbsd-5-0-1-RELEASE:1.10 jymxensuspend-base:1.10 yamt-nfs-mp-base6:1.10 yamt-nfs-mp-base5:1.10 yamt-nfs-mp-base4:1.10 jym-xensuspend-nbase:1.10 yamt-nfs-mp-base3:1.10 nick-hppapmap-base4:1.10 nick-hppapmap-base3:1.10 netbsd-5-0:1.10.0.92 netbsd-5-0-RELEASE:1.10 netbsd-5-0-RC4:1.10 netbsd-5-0-RC3:1.10 nick-hppapmap-base2:1.10 netbsd-5-0-RC2:1.10 jym-xensuspend:1.10.0.90 jym-xensuspend-base:1.10 netbsd-5-0-RC1:1.10 haad-dm-base2:1.10 haad-nbase2:1.10 ad-audiomp2:1.10.0.88 ad-audiomp2-base:1.10 netbsd-5:1.10.0.86 netbsd-5-base:1.10 nick-hppapmap:1.10.0.84 nick-hppapmap-base:1.10 matt-mips64-base2:1.10 matt-mips64:1.10.0.82 haad-dm-base1:1.10 wrstuden-revivesa-base-4:1.10 netbsd-4-0-1-RELEASE:1.10 wrstuden-revivesa-base-3:1.10 wrstuden-revivesa-base-2:1.10 wrstuden-fixsa-newbase:1.10 nick-csl-alignment-base5:1.10 haad-dm:1.10.0.80 haad-dm-base:1.10 wrstuden-revivesa-base-1:1.10 simonb-wapbl-nbase:1.10 yamt-pf42-base4:1.10 simonb-wapbl:1.10.0.78 simonb-wapbl-base:1.10 yamt-pf42-base3:1.10 hpcarm-cleanup-nbase:1.10 yamt-pf42-baseX:1.10 yamt-pf42-base2:1.10 yamt-nfs-mp-base2:1.10 wrstuden-revivesa:1.10.0.76 wrstuden-revivesa-base:1.10 yamt-nfs-mp:1.10.0.74 yamt-nfs-mp-base:1.10 yamt-pf42:1.10.0.72 yamt-pf42-base:1.10 ad-socklock-base1:1.10 yamt-lazymbuf-base15:1.10 yamt-lazymbuf-base14:1.10 keiichi-mipv6-nbase:1.10 mjf-devfs2:1.10.0.70 mjf-devfs2-base:1.10 nick-net80211-sync:1.10.0.68 nick-net80211-sync-base:1.10 keiichi-mipv6:1.10.0.66 keiichi-mipv6-base:1.10 bouyer-xeni386-merge1:1.10 matt-armv6-prevmlocking:1.10 wrstuden-fixsa-base-1:1.10 vmlocking2-base3:1.10 netbsd-4-0:1.10.0.64 netbsd-4-0-RELEASE:1.10 bouyer-xeni386-nbase:1.10 yamt-kmem-base3:1.10 cube-autoconf:1.10.0.62 cube-autoconf-base:1.10 yamt-kmem-base2:1.10 bouyer-xeni386:1.10.0.60 bouyer-xeni386-base:1.10 yamt-kmem:1.10.0.58 yamt-kmem-base:1.10 vmlocking2-base2:1.10 reinoud-bufcleanup-nbase:1.10 vmlocking2:1.10.0.56 vmlocking2-base1:1.10 netbsd-4-0-RC5:1.10 matt-nb4-arm:1.10.0.54 matt-nb4-arm-base:1.10 matt-armv6-nbase:1.10 jmcneill-base:1.10 netbsd-4-0-RC4:1.10 mjf-devfs:1.10.0.52 mjf-devfs-base:1.10 bouyer-xenamd64-base2:1.10 vmlocking-nbase:1.10 yamt-x86pmap-base4:1.10 bouyer-xenamd64:1.10.0.50 bouyer-xenamd64-base:1.10 netbsd-4-0-RC3:1.10 yamt-x86pmap-base3:1.10 yamt-x86pmap-base2:1.10 netbsd-4-0-RC2:1.10 yamt-x86pmap:1.10.0.48 yamt-x86pmap-base:1.10 netbsd-4-0-RC1:1.10 matt-armv6:1.10.0.46 matt-armv6-base:1.10 matt-mips64-base:1.10 jmcneill-pm:1.10.0.44 jmcneill-pm-base:1.10 hpcarm-cleanup:1.10.0.42 hpcarm-cleanup-base:1.10 nick-csl-alignment:1.10.0.40 nick-csl-alignment-base:1.10 netbsd-3-1-1-RELEASE:1.8.2.1 netbsd-3-0-3-RELEASE:1.8.2.1 yamt-idlelwp-base8:1.10 wrstuden-fixsa:1.10.0.38 wrstuden-fixsa-base:1.10 thorpej-atomic:1.10.0.36 thorpej-atomic-base:1.10 reinoud-bufcleanup:1.10.0.34 reinoud-bufcleanup-base:1.10 mjf-ufs-trans:1.10.0.32 mjf-ufs-trans-base:1.10 vmlocking:1.10.0.30 vmlocking-base:1.10 ad-audiomp:1.10.0.28 ad-audiomp-base:1.10 yamt-idlelwp:1.10.0.26 post-newlock2-merge:1.10 newlock2-nbase:1.10 yamt-splraiseipl-base5:1.10 yamt-splraiseipl-base4:1.10 yamt-splraiseipl-base3:1.10 abandoned-netbsd-4-base:1.10 abandoned-netbsd-4:1.10.0.18 netbsd-3-1:1.8.2.1.0.4 netbsd-3-1-RELEASE:1.8.2.1 netbsd-3-0-2-RELEASE:1.8.2.1 yamt-splraiseipl-base2:1.10 netbsd-3-1-RC4:1.8.2.1 yamt-splraiseipl:1.10.0.22 yamt-splraiseipl-base:1.10 netbsd-3-1-RC3:1.8.2.1 yamt-pdpolicy-base9:1.10 newlock2:1.10.0.20 newlock2-base:1.10 yamt-pdpolicy-base8:1.10 netbsd-3-1-RC2:1.8.2.1 netbsd-3-1-RC1:1.8.2.1 yamt-pdpolicy-base7:1.10 netbsd-4:1.10.0.24 netbsd-4-base:1.10 yamt-pdpolicy-base6:1.10 chap-midi-nbase:1.10 netbsd-3-0-1-RELEASE:1.8.2.1 gdamore-uart:1.10.0.16 gdamore-uart-base:1.10 simonb-timcounters-final:1.10 yamt-pdpolicy-base5:1.10 chap-midi:1.10.0.14 chap-midi-base:1.10 yamt-pdpolicy-base4:1.10 yamt-pdpolicy-base3:1.10 peter-altq-base:1.10 peter-altq:1.10.0.12 yamt-pdpolicy-base2:1.10 elad-kernelauth-base:1.10 elad-kernelauth:1.10.0.10 yamt-pdpolicy:1.10.0.8 yamt-pdpolicy-base:1.10 yamt-uio_vmspace-base5:1.10 simonb-timecounters:1.10.0.6 simonb-timecounters-base:1.10 rpaulo-netinet-merge-pcb:1.10.0.4 rpaulo-netinet-merge-pcb-base:1.10 yamt-uio_vmspace:1.10.0.2 netbsd-3-0:1.8.2.1.0.2 netbsd-3-0-RELEASE:1.8.2.1 netbsd-3-0-RC6:1.8.2.1 yamt-readahead-base3:1.9 netbsd-3-0-RC5:1.8.2.1 netbsd-3-0-RC4:1.8.2.1 netbsd-3-0-RC3:1.8.2.1 yamt-readahead-base2:1.9 netbsd-3-0-RC2:1.8.2.1 yamt-readahead-pervnode:1.9 yamt-readahead-perfile:1.9 yamt-readahead:1.9.0.8 yamt-readahead-base:1.9 netbsd-3-0-RC1:1.8.2.1 yamt-vop-base3:1.9 netbsd-2-0-3-RELEASE:1.7 netbsd-2-1:1.7.8.1.0.2 yamt-vop-base2:1.9 thorpej-vnode-attr:1.9.0.6 thorpej-vnode-attr-base:1.9 netbsd-2-1-RELEASE:1.7.8.1 yamt-vop:1.9.0.4 yamt-vop-base:1.9 netbsd-2-1-RC6:1.7.8.1 netbsd-2-1-RC5:1.7.8.1 netbsd-2-1-RC4:1.7.8.1 netbsd-2-1-RC3:1.7.8.1 netbsd-2-1-RC2:1.7.8.1 netbsd-2-1-RC1:1.7.8.1 yamt-lazymbuf:1.9.0.2 yamt-km-base4:1.8 netbsd-2-0-2-RELEASE:1.7 yamt-km-base3:1.8 netbsd-3:1.8.0.2 netbsd-3-base:1.8 yamt-km-base2:1.7 yamt-km:1.7.0.12 yamt-km-base:1.7 kent-audio2:1.7.0.10 kent-audio2-base:1.9 netbsd-2-0-1-RELEASE:1.7 kent-audio1-beforemerge:1.7 netbsd-2:1.7.0.8 netbsd-2-base:1.7 kent-audio1:1.7.0.6 kent-audio1-base:1.7 netbsd-2-0-RELEASE:1.7 netbsd-2-0-RC5:1.7 netbsd-2-0-RC4:1.7 netbsd-2-0-RC3:1.7 netbsd-2-0-RC2:1.7 netbsd-2-0-RC1:1.7 netbsd-2-0:1.7.0.4 netbsd-2-0-base:1.7 netbsd-1-6-PATCH002-RELEASE:1.5 netbsd-1-6-PATCH002:1.5 netbsd-1-6-PATCH002-RC4:1.5 netbsd-1-6-PATCH002-RC3:1.5 netbsd-1-6-PATCH002-RC2:1.5 netbsd-1-6-PATCH002-RC1:1.5 ktrace-lwp:1.7.0.2 ktrace-lwp-base:1.9 netbsd-1-6-PATCH001:1.5 netbsd-1-6-PATCH001-RELEASE:1.5 netbsd-1-6-PATCH001-RC3:1.5 netbsd-1-6-PATCH001-RC2:1.5 netbsd-1-6-PATCH001-RC1:1.5 nathanw_sa_end:1.4.2.1 nathanw_sa_before_merge:1.5 fvdl_fs64_base:1.5 gmcgarry_ctxsw:1.5.0.18 gmcgarry_ctxsw_base:1.5 gmcgarry_ucred:1.5.0.16 gmcgarry_ucred_base:1.5 nathanw_sa_base:1.5 kqueue-aftermerge:1.5 kqueue-beforemerge:1.5 netbsd-1-6-RELEASE:1.5 netbsd-1-6-RC3:1.5 netbsd-1-6-RC2:1.5 netbsd-1-6-RC1:1.5 netbsd-1-6:1.5.0.14 netbsd-1-6-base:1.5 gehenna-devsw:1.5.0.12 gehenna-devsw-base:1.5 netbsd-1-5-PATCH003:1.3 eeh-devprop:1.5.0.10 eeh-devprop-base:1.5 newlock:1.5.0.8 newlock-base:1.5 ifpoll-base:1.5 thorpej-mips-cache:1.5.0.4 thorpej-mips-cache-base:1.5 thorpej-devvp-base3:1.5 thorpej-devvp-base2:1.5 post-chs-ubcperf:1.5 pre-chs-ubcperf:1.5 thorpej-devvp:1.5.0.2 thorpej-devvp-base:1.5 netbsd-1-5-PATCH002:1.3 kqueue:1.4.0.6 kqueue-base:1.5 perseant-lfsv2:1.4.0.4 perseant-lfsv2-base:1.4 netbsd-1-5-PATCH001:1.3 thorpej_scsipi_beforemerge:1.4 nathanw_sa:1.4.0.2 thorpej_scsipi_nbase:1.4 netbsd-1-5-RELEASE:1.3 netbsd-1-5-BETA2:1.3 netbsd-1-5-BETA:1.3 netbsd-1-4-PATCH003:1.3 netbsd-1-5-ALPHA2:1.3 netbsd-1-5:1.3.0.18 netbsd-1-5-base:1.3 minoura-xpg4dl-base:1.3 minoura-xpg4dl:1.3.0.16 netbsd-1-4-PATCH002:1.3 chs-ubc2-newbase:1.3 wrstuden-devbsize-19991221:1.3 wrstuden-devbsize:1.3.0.14 wrstuden-devbsize-base:1.3 kame_141_19991130:1.3 comdex-fall-1999:1.3.0.12 comdex-fall-1999-base:1.3 fvdl-softdep:1.3.0.10 fvdl-softdep-base:1.3 thorpej_scsipi:1.3.0.8 thorpej_scsipi_base:1.4 netbsd-1-4-PATCH001:1.3 kame_14_19990705:1.3 kame_14_19990628:1.3 kame:1.3.0.6 chs-ubc2:1.3.0.4 chs-ubc2-base:1.3 netbsd-1-4-RELEASE:1.3 netbsd-1-4:1.3.0.2 netbsd-1-4-base:1.3 netbsd-1-3-PATCH003:1.2 netbsd-1-3-PATCH003-CANDIDATE2:1.2 kenh-if-detach:1.2.0.26 kenh-if-detach-base:1.2 netbsd-1-3-PATCH003-CANDIDATE1:1.2 netbsd-1-3-PATCH003-CANDIDATE0:1.2 chs-ubc:1.2.0.24 chs-ubc-base:1.2 eeh-paddr_t:1.2.0.22 eeh-paddr_t-base:1.2 netbsd-1-3-PATCH002:1.2 lite-2:1.1.1.1 lite-1:1.1.1.1 CSRG:1.1.1 netbsd-1-3-PATCH001:1.2 netbsd-1-3-RELEASE:1.2 netbsd-1-3-BETA:1.2 netbsd-1-3:1.2.0.20 netbsd-1-3-base:1.2 thorpej-signal:1.2.0.18 thorpej-signal-base:1.2 marc-pcmcia:1.2.0.16 marc-pcmcia-bp:1.2 marc-pcmcia-base:1.2 bouyer-scsipi:1.2.0.14 is-newarp-before-merge:1.2 is-newarp:1.2.0.12 is-newarp-base:1.2 netbsd-1-2-PATCH001:1.2 mrg-vm-swap:1.2.0.10 thorpej-setroot:1.2.0.6 netbsd-1-2-RELEASE:1.2 netbsd-1-2-BETA:1.2 netbsd-1-2:1.2.0.8 netbsd-1-2-base:1.2 date-03-may-96:1.1.1.1 netbsd:1.1.1 netbsd-1-1-PATCH001:1.2 netbsd-1-1-RELEASE:1.2 netbsd-1-1:1.2.0.4 netbsd-1-1-base:1.2 netbsd-1-0-PATCH06:1.2 netbsd-1-0-PATCH05:1.2 netbsd-1-0-PATCH04:1.2 netbsd-1-0-PATCH03:1.2 netbsd-1-0-PATCH02:1.2 netbsd-1-0-PATCH1:1.2 netbsd-1-0-PATCH0:1.2 netbsd-1-0-RELEASE:1.2 netbsd-1-0:1.2.0.2 netbsd-1-0-base:1.2; locks; strict; comment @# @; 1.10 date 2005.12.11.12.25.26; author christos; state Exp; branches; next 1.9; 1.9 date 2005.04.01.21.59.46; author perseant; state Exp; branches 1.9.2.1; next 1.8; 1.8 date 2005.02.26.05.40.42; author perseant; state Exp; branches 1.8.2.1; next 1.7; 1.7 date 2003.02.23.00.22.33; author perseant; state Exp; branches 1.7.2.1 1.7.8.1 1.7.10.1 1.7.12.1; next 1.6; 1.6 date 2003.02.17.23.48.16; author perseant; state Exp; branches; next 1.5; 1.5 date 2001.07.13.20.30.22; author perseant; state Exp; branches; next 1.4; 1.4 date 2000.11.17.19.14.41; author perseant; state Exp; branches 1.4.2.1 1.4.4.1 1.4.6.1; next 1.3; 1.3 date 99.03.15.00.46.47; author perseant; state Exp; branches 1.3.8.1; next 1.2; 1.2 date 94.06.29.06.46.45; author cgd; state Exp; branches; next 1.1; 1.1 date 94.06.08.11.42.17; author mycroft; state Exp; branches 1.1.1.1; next ; 1.9.2.1 date 2006.06.21.15.12.38; author yamt; state Exp; branches; next ; 1.8.2.1 date 2005.05.07.11.21.29; author tron; state Exp; branches; next ; 1.7.2.1 date 2005.03.04.16.54.46; author skrll; state Exp; branches; next 1.7.2.2; 1.7.2.2 date 2005.11.10.14.12.32; author skrll; state Exp; branches; next ; 1.7.8.1 date 2005.05.10.05.08.57; author riz; state Exp; branches; next ; 1.7.10.1 date 2005.04.29.11.29.39; author kent; state Exp; branches; next ; 1.7.12.1 date 2005.03.19.08.37.03; author yamt; state Exp; branches; next ; 1.4.2.1 date 2001.08.24.00.13.21; author nathanw; state Exp; branches; next ; 1.4.4.1 date 2001.06.27.03.49.38; author perseant; state Exp; branches; next ; 1.4.6.1 date 2001.08.03.04.14.07; author lukem; state Exp; branches; next ; 1.3.8.1 date 2000.11.22.16.06.48; author bouyer; state Exp; branches; next ; 1.1.1.1 date 98.03.01.02.10.46; author fvdl; state Exp; branches; next ; desc @@ 1.10 log @merge ktrace-lwp. @ text @# $NetBSD: TODO,v 1.7.2.2 2005/11/10 14:12:32 skrll Exp $ - Lock audit. Need to check locking for multiprocessor case in particular. - Get rid of lfs_segclean(); the kernel should clean a dirty segment IFF it has passed two checkpoints containing zero live bytes. - Now that our cache is basically all of physical memory, we need to make sure that segwrite is not starving other important things. Need a way to prioritize which blocks are most important to write, and write only those, saving the rest for later. Does this change our notion of what a checkpoint is? - Investigate alternate inode locking strategy: Inode locks are useful for locking against simultaneous changes to inode size (balloc, truncate, write) but because the assignment of disk blocks is also covered by the segment lock, we don't really need to pay attention to the inode lock when writing a segment, right? If this is true, the locking problem in lfs_{bmapv,markv} goes away and lfs_reserve can go, too. - Get rid of DEV_BSIZE, pay attention to the media block size at mount time. - More fs ops need to call lfs_imtime. Which ones? (Blackwell et al., 1995) - lfs_vunref_head exists so that vnodes loaded solely for cleaning can be put back on the *head* of the vnode free list. Make sure we actually do this, since we now take IN_CLEANING off during segment write. - The cleaner could be enhanced to be controlled from other processes, and possibly perform additional tasks: - Backups. At a minimum, turn the cleaner off and on to allow effective live backups. More aggressively, the cleaner itself could be the backup agent, and dump_lfs would merely be a controller. - Cleaning time policies. Be able to tweak the cleaner's thresholds to allow more thorough cleaning during policy-determined idle periods (regardless of actual idleness) or put off until later during short, intensive write periods. - File coalescing and placement. During periods we expect to be idle, coalesce fragmented files into one place on disk for better read performance. Ideally, move files that have not been accessed in a while to the extremes of the disk, thereby shortening seek times for files that are accessed more frequently (though how the cleaner should communicate "please put this near the beginning or end of the disk" to the kernel is a very good question; flags to lfs_markv?). - Versioning. When it cleans a segment it could write data for files that were less than n versions old to tape or elsewhere. Perhaps it could even write them back onto the disk, although that requires more thought (and kernel mods). - Move lfs_countlocked() into vfs_bio.c, to replace count_locked_queue; perhaps keep the name, replace the function. Could it count referenced vnodes as well, if it was in vfs_subr.c instead? - Why not delete the lfs_bmapv call, just mark everything dirty that isn't deleted/truncated? Get some numbers about what percentage of the stuff that the cleaner thinks might be live is live. If it's high, get rid of lfs_bmapv. - There is a nasty problem in that it may take *more* room to write the data to clean a segment than is returned by the new segment because of indirect blocks in segment 2 being dirtied by the data being copied into the log from segment 1. The suggested solution at this point is to detect it when we have no space left on the filesystem, write the extra data into the last segment (leaving no clean ones), make it a checkpoint and shut down the file system for fixing by a utility reading the raw partition. Argument is that this should never happen and is practically impossible to fix since the cleaner would have to theoretically build a model of the entire filesystem in memory to detect the condition occurring. A file coalescing cleaner will help avoid the problem, and one that reads/writes from the raw disk could fix it. - Need to keep vnode v_numoutput up to date for pending writes? - If delete a file that's being executed, the version number isn't updated, and fsck_lfs has to figure this out; case is the same as if have an inode that no directory references, so the file should be reattached into lost+found. - Currently there's no notion of write error checking. + Failed data/inode writes should be rescheduled (kernel level bad blocking). + Failed superblock writes should cause selection of new superblock for checkpointing. - Future fantasies: - unrm, versioning - transactions - extended cleaner policies (hot/cold data, data placement) - Problem with the concept of multiple buffer headers referencing the segment: Positives: Don't lock down 1 segment per file system of physical memory. Don't copy from buffers to segment memory. Don't tie down the bus to transfer 1M. Works on controllers supporting less than large transfers. Disk can start writing immediately instead of waiting 1/2 rotation and the full transfer. Negatives: Have to do segment write then segment summary write, since the latter is what verifies that the segment is okay. (Is there another way to do this?) - The algorithm for selecting the disk addresses of the super-blocks has to be available to the user program which checks the file system. @ 1.9 log @Protect various per-fs structures with fs->lfs_interlock simple_lock, to improve behavior in the multiprocessor case. Add debugging segment-lock assertion statements. @ text @d1 6 a6 1 # $NetBSD: TODO,v 1.8 2005/02/26 05:40:42 perseant Exp $ @ 1.9.2.1 log @sync with head. @ text @d1 1 a1 6 # $NetBSD: TODO,v 1.9 2005/04/01 21:59:46 perseant Exp $ - Lock audit. Need to check locking for multiprocessor case in particular. - Get rid of lfs_segclean(); the kernel should clean a dirty segment IFF it has passed two checkpoints containing zero live bytes. @ 1.8 log @Various minor LFS improvements: * Note when lfs_putpages(9) thinks it is not going to be writing any pages before calling genfs_putpages(9). This prevents a situation in which blocks can be queued for writing without a segment header. * Correct computation of NRESERVE(), though it is still a gross overestimate in most cases. Note that if NRESERVE() is too high, it may be impossible to create files on the filesystem. We catch this case on filesystem mount and refuse to mount r/w. * Allow filesystems to be mounted whose block size is == MAXBSIZE. * Somewhere along the line, ufs_bmaparray(9) started mangling UNWRITTEN entries in indirect blocks again, triggering a failed assertion "daddr <= LFS_MAX_DADDR". Explicitly convert to and from int32_t to correct this. * Add a high-water mark for the number of dirty pages any given LFS can hold before triggering a flush. This is settable by sysctl, but off (zero) by default. * Be more careful about the MAX_BYTES and MAX_BUFS computations so we shouldn't see "please increase to at least zero" messages. * Note that VBLK and VCHR vnodes can have nonzero values in di_db[0] even though their v_size == 0. Don't panic when we see this. * Change lfs_bfree to a signed quantity. The manner in which it is processed before being passed to the cleaner means that sometimes it may drop below zero, and the cleaner must be aware of this. * Never report bfree < 0 (or higher than lfs_dsize) through lfs_statvfs(9). This prevents df(1) from ever telling us that our full filesystems have 16TB free. * Account space allocated through lfs_balloc(9) that does not have associated buffer headers, so that the pagedaemon doesn't run us out of segments. * Return ENOSPC from lfs_balloc(9) when bfree drops to zero. * Address a deadlock in lfs_bmapv/lfs_markv when the filesystem is being unmounted. Because vfs_busy() is a shared lock, and lfs_bmapv/lfs_markv mark the filesystem vfs_busy(), the cleaner can be holding the lock that umount() is blocking on, then try to vfs_busy() again in getnewvnode(). @ text @d1 1 a1 6 # $NetBSD: TODO,v 1.7 2003/02/23 00:22:33 perseant Exp $ - Lock audit. Need to check locking for multiprocessor case in particular. - Get rid of lfs_segclean(); the kernel should clean a dirty segment IFF it has passed two checkpoints containing zero live bytes. d6 2 a7 2 those before giving up the seglock to do the rest. How does this change our notion of what a checkpoint is? @ 1.8.2.1 log @Apply patch (requested by perseant in ticket #242): * fsck_lfs buffer cache fixes, including PR #29151 * Change fsck_lfs phase 0 message to reflect reality * fsck_lfs: check phase 5 (cleanerinfo accounting) even on roll-forward * Keep better track of the free list during roll-forward, avoiding a core dump * Improve hash table use for fsck_lfs buffer and vnode cache * Document fsck_lfs flag -f, and implement -q * Add resize_lfs, including kernel support * Add LFS to mountd's list of exportable filesystem types * Make the LFS lkm work again [christos@@] * Add MP locking to the LFS kernel subsystem * Fix pager_map deadlock in lfs_putpages() * Avoid incomplete file extension that looks like "partial truncation" to fsck * Use lfs_malloc for cleaner malloc, since the cleaner often runs in low-memory conditions. * Use splay trees, not hash table, to track page allocation for write. * Fix mkdir panic on full fs * Fix page accounting leak by counting differently. * Use rightly named structure for lfs_getattr [skrll@@] * Cosmetic changes for readability. @ text @d1 6 a6 1 # $NetBSD: TODO,v 1.8 2005/02/26 05:40:42 perseant Exp $ d11 2 a12 2 those, saving the rest for later. Does this change our notion of what a checkpoint is? @ 1.7 log @Fix a buffer overflow bug in the LFS_UBC case that manifested itself either as a mysterious UVM error or as "panic: dirty bufs". Verify maximum size in lfs_malloc. Teach lfs_updatemeta and lfs_shellsort about oversized cluster blocks from lfs_gop_write. When unwiring pages in lfs_gop_write, deactivate them, under the theory that the pagedaemon wanted to free them last we knew. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.6 2003/02/17 23:48:16 perseant Exp $ a4 4 - Get rid of the syscalls: make them into ioctl calls instead. This would allow LFS to be loaded as a module. We would then ideally have an in-kernel cleaner that runs if no userland cleaner has asserted itself. a21 3 - Fully working fsck_lfs. (Really, need a general-purpose external partial-segment writer.) @ 1.7.8.1 log @Pull up the following revisions (requested by perseant in ticket #1281): 1.8 sys/ufs/lfs/TODO 1.75 sys/ufs/lfs/lfs.h (via patch) 1.74 sys/ufs/lfs/lfs_alloc.c (via patch) 1.49, 1.51 sys/ufs/lfs/lfs_balloc.c (1.51 via patch) 1.78 sys/ufs/lfs/lfs_bio.c 1.62 sys/ufs/lfs/lfs_extern.h (via patch) 1.156 sys/ufs/lfs/lfs_segment.c (via patch) 1.48 sys/ufs/lfs/lfs_subr.c 1.101 sys/ufs/lfs/lfs_syscalls.c 1.163 sys/ufs/lfs/lfs_vfsops.c (via patch) 1.134 sys/ufs/lfs/lfs_vnops.c (via patch) 1.61 sys/ufs/ufs/ufs_readwrite.c (via patch) 1.20 libexec/lfs_cleanerd/clean.h (via patch) 1.52 libexec/lfs_cleanerd/cleanerd.c (via patch) 1.41 libexec/lfs_cleanerd/library.c (via patch) 1.4 regress/sys/fs/lfs/newfs_fsck/Makefile 1.2 regress/sys/fs/lfs/newfs_fsck/mkfs_mount 1.2 regress/sys/fs/lfs/newfs_fsck/smallfiles 1.3 sbin/fsck_lfs/bufcache.c 1.3 sbin/fsck_lfs/bufcache.h 1.3 sbin/fsck_lfs/lfs.h 1.8 sbin/fsck_lfs/lfs.c (via patch) 1.8 sbin/fsck_lfs/pass3.c (via patch) 1.18 sbin/fsck_lfs/pass0.c (via patch) 1.18 sbin/fsck_lfs/utilities.c (via patch) 1.7 sbin/fsck_lfs/segwrite.c 1.19 sbin/fsck_lfs/setup.c (via patch) 1.3 sbin/newfs_lfs/Makefile 0 sbin/newfs_lfs/lfs.c (yes, remove it) 1.1 sbin/newfs_lfs/make_lfs.c 1.15 sbin/newfs_lfs/newfs.c (via patch) Various minor LFS improvements. Kernel: * Note when lfs_putpages(9) thinks it is not going to be writing any pages before calling genfs_putpages(9). This prevents a situation in which blocks can be queued for writing without a segment header. * Correct computation of NRESERVE(), though it is still a gross overestimate in most cases. Note that if NRESERVE() is too high, it may be impossible to create files on the filesystem. We catch this case on filesystem mount and refuse to mount r/w. * Allow filesystems to be mounted whose block size is == MAXBSIZE. * Somewhere along the line, ufs_bmaparray(9) started mangling UNWRITTEN entries in indirect blocks again, triggering a failed assertion "daddr <= LFS_MAX_DADDR". Explicitly convert to and from int32_t to correct this. Should fix PR #29045. * Add a high-water mark for the number of dirty pages any given LFS can hold before triggering a flush. This is settable by sysctl, but off (zero) by default. * Be more careful about the MAX_BYTES and MAX_BUFS computations so we shouldn't see "please increase to at least zero" messages. * Note that VBLK and VCHR vnodes can have nonzero values in di_db[0] even though their v_size == 0. Don't panic when we see this. Fixes PR #26680. * Change lfs_bfree to a signed quantity. The manner in which it is processed before being passed to the cleaner means that sometimes it may drop below zero, and the cleaner must be aware of this. * Never report bfree < 0 (or higher than lfs_dsize) through lfs_statfs(9). This prevents df(1) from ever telling us that our full filesystems have 16TB free. * Account space allocated through lfs_balloc(9) that does not have associated buffer headers, so that the pagedaemon doesn't run us out of segments. * Return ENOSPC from lfs_balloc(9) when bfree drops to zero. * Address a deadlock in lfs_bmapv/lfs_markv when the filesystem is being unmounted. Because vfs_busy() is a shared lock, and lfs_bmapv/lfs_markv mark the filesystem vfs_busy(), the cleaner can be holding the lock that umount() is blocking on, then try to vfs_busy() again in getnewvnode(). cleaner: * Adapt lfs_cleanerd to use the fcntl call to get the Ifile filehandle, so it need not be in the namespace. * Make lfs_cleanerd be more careful when there are very few available segments. * Make lfs_cleanerd less verbose when the filesystem is unmounted. newfs_lfs, fsck_lfs, and regression: * Extend the lfs library from fsck_lfs(8) so that it can be used with a not-yet-existent LFS. Make newfs_lfs(8) use this library, so it can create LFSs whose Ifile is larger than one segment. Addresses PR #11110. * Make newfs_lfs(8) use strsuftoi64() for its arguments, a la newfs(8). * Make fsck_lfs(8) respect the "file system is clean" flag. * Don't let fsck_lfs(8) think it has dirty blocks when invoked with the -n flag. * Remove the Ifile from the filesystem namespace. The cleaner now uses a fcntl call on the root inode to find the Ifile filehandle. (As a side-effect, addresses PR #29144.) @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.8 2005/02/26 05:40:42 perseant Exp $ d5 4 d26 3 @ 1.7.10.1 log @sync with -current @ text @d1 10 a10 1 # $NetBSD: TODO,v 1.9 2005/04/01 21:59:46 perseant Exp $ d15 2 a16 2 those, saving the rest for later. Does this change our notion of what a checkpoint is? d26 3 @ 1.7.12.1 log @sync with head. xen and whitespace. xen part is not finished. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.7 2003/02/23 00:22:33 perseant Exp $ d5 4 d26 3 @ 1.7.2.1 log @Sync with HEAD. Hi Perry! @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.8 2005/02/26 05:40:42 perseant Exp $ d5 4 d26 3 @ 1.7.2.2 log @Sync with HEAD. Here we go again... @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.9 2005/04/01 21:59:46 perseant Exp $ d11 2 a12 2 those, saving the rest for later. Does this change our notion of what a checkpoint is? @ 1.6 log @Add code to UBCify LFS. This is still behind "#ifdef LFS_UBC" for now (there are still some details to work out) but expect that to go away soon. To support these basic changes (creation of lfs_putpages, lfs_gop_write, mods to lfs_balloc) several other changes were made, to wit: * Create a writer daemon kernel thread whose purpose is to handle page writes for the pagedaemon, but which also takes over some of the functions of lfs_check(). This thread is started the first time an LFS is mounted. * Add a "flags" parameter to GOP_SIZE. Current values are GOP_SIZE_READ, meaning that the call should return the size of the in-core version of the file, and GOP_SIZE_WRITE, meaning that it should return the on-disk size. One of GOP_SIZE_READ or GOP_SIZE_WRITE must be specified. * Instead of using malloc(...M_WAITOK) for everything, reserve enough resources to get by and use malloc(...M_NOWAIT), using the reserves if necessary. Use the pool subsystem for structures small enough that this is feasible. This also obsoletes LFS_THROTTLE. And a few that are not strictly necessary: * Moves the LFS inode extensions off onto a separately allocated structure; getting closer to LFS as an LKM. "Welcome to 1.6O." * Unified GOP_ALLOC between FFS and LFS. * Update LFS copyright headers to correct values. * Actually cast to unsigned in lfs_shellsort, like the comment says. * Keep track of which segments were empty before the previous checkpoint; any segments that pass two checkpoints both dirty and empty can be summarily cleaned. Do this. Right now lfs_segclean still works, but this should be turned into an effectless compatibility syscall. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.5 2001/07/13 20:30:22 perseant Exp $ d41 2 a42 2 effective live backups. More aggressively, the cleaner itself could be the backup agent, and dump_lfs would merely be a controller. d45 3 a47 3 to allow more thorough cleaning during policy-determined idle periods (regardless of actual idleness) or put off until later during short, intensive write periods. @ 1.5 log @Merge the short-lived perseant-lfsv2 branch into the trunk. Kernels and tools understand both v1 and v2 filesystems; newfs_lfs generates v2 by default. Changes for the v2 layout include: - Segments of non-PO2 size and arbitrary block offset, so these can be matched to convenient physical characteristics of the partition (e.g., stripe or track size and offset). - Address by fragment instead of by disk sector, paving the way for non-512-byte-sector devices. In theory fragments can be as large as you like, though in reality they must be smaller than MAXBSIZE in size. - Use serial number and filesystem identifier to ensure that roll-forward doesn't get old data and think it's new. Roll-forward is enabled for v2 filesystems, though not for v1 filesystems by default. - The inode free list is now a tailq, paving the way for undelete (undelete is not yet implemented, but can be without further non-backwards-compatible changes to disk structures). - Inode atime information is kept in the Ifile, instead of on the inode; that is, the inode is never written *just* because atime was changed. Because of this the inodes remain near the file data on the disk, rather than wandering all over as the disk is read repeatedly. This speeds up repeated reads by a small but noticeable amount. Other changes of note include: - The ifile written by newfs_lfs can now be of arbitrary length, it is no longer restricted to a single indirect block. - Fixed an old bug where ctime was changed every time a vnode was created. I need to look more closely to make sure that the times are only updated during write(2) and friends, not after-the-fact during a segment write, and certainly not by the cleaner. @ text @d1 16 a16 1 # $NetBSD: TODO,v 1.4.4.1 2001/06/27 03:49:38 perseant Exp $ a27 6 - Inode blocks are currently the same size as the fs block size; but all the ones I've seen are mostly empty, and this will be especially true if atime information is kept in the ifile instead of the inode. Could we shrink the inode block size to DEV_BSIZE? Or parametrize it at fs creation time? @ 1.4 log @Correct accounting of lfs_avail, locked_queue_count, and locked_queue_bytes. (PR #11468). In the case of fragment allocation, check to see if enough space is available before extending a fragment already scheduled for writing. The locked_queue_* variables indicate the number of buffer headers and bytes, respectively, that are unavailable to getnewbuf() because they are locked up waiting for LFS to flush them; make sure that that is actually what we're counting, i.e., never count malloced buffers, and always use b_bufsize instead of b_bcount. If DEBUG is defined, the periodic calls to lfs_countlocked will now complain if either counter is incorrect. (In the future lfs_countlocked will not need to be called at all if DEBUG is not defined.) @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.3 1999/03/15 00:46:47 perseant Exp $ d3 7 a9 5 - If we put an LFS onto a striped disk, we want to be able to specify the segment size to be equal to the stripe size, regardless of whether this is a power of two; also, the first segment should just eat the label pad, like the segments eat the superblocks. Then, we could neatly lay out the segments along stripe boundaries. [v2] d11 1 a11 2 - Working fsck_lfs. (Have something that will verify, need something that will fix too. Really, need a general-purpose external a13 4 - Roll-forward agent, *at least* to verify the newer superblock's checkpoint (easy) but also to create a valid checkpoint for post-checkpoint writes (requires an external partial-segment writer). d17 1 a17 1 we shrink the inode block size to 512? Or parametrize it at fs a27 6 - Investigate the "unlocked access" in lfs_bmapv, see if we could wait there most of the time? Are we getting inconsistent data? - Change the free_lock to be fs-specific, and change the dirvcount to be subsystem-wide. a75 8 - Overlap the version and nextfree fields in the IFILE - Change so that only search one sector of inode block file for the inode by using sector addresses in the ifile instead of logical disk addresses. - Fix the use of the ifile version field to use the generation number instead. a81 5 - Investigate: should the access time be part of the IFILE: pro: theoretically, saves disk writes con: cacheing inodes should obviate this advantage the IFILE is already humongous @ 1.4.2.1 log @Catch up with -current. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.4 2000/11/17 19:14:41 perseant Exp $ d3 5 a7 7 - Investigate alternate inode locking strategy: Inode locks are useful for locking against simultaneous changes to inode size (balloc, truncate, write) but because the assignment of disk blocks is also covered by the segment lock, we don't really need to pay attention to the inode lock when writing a segment, right? If this is true, the locking problem in lfs_{bmapv,markv} goes away and lfs_reserve can go, too. d9 2 a10 1 - Fully working fsck_lfs. (Really, need a general-purpose external d13 4 d20 1 a20 1 we shrink the inode block size to DEV_BSIZE? Or parametrize it at fs d31 6 d85 8 d99 5 @ 1.4.6.1 log @update to -current @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.5 2001/07/13 20:30:22 perseant Exp $ d3 5 a7 7 - Investigate alternate inode locking strategy: Inode locks are useful for locking against simultaneous changes to inode size (balloc, truncate, write) but because the assignment of disk blocks is also covered by the segment lock, we don't really need to pay attention to the inode lock when writing a segment, right? If this is true, the locking problem in lfs_{bmapv,markv} goes away and lfs_reserve can go, too. d9 2 a10 1 - Fully working fsck_lfs. (Really, need a general-purpose external d13 4 d20 1 a20 1 we shrink the inode block size to DEV_BSIZE? Or parametrize it at fs d31 6 d85 8 d99 5 @ 1.4.4.1 log @Import of what I've been calling "LFSv2", that is, LFS with some features added that require changes to the on-disk data structures. These include: - 64-bit time in everything but inodes - User-specified segment offset, and segment size no longer restricted to PO2. - Serial number on segment summaries in addition to timestamp, and a new volume identifier, to make roll-forward feasible without fear of finding old data and thinking it was new. Although I think this version works at least as well as what's on the trunk, we're not done yet; hence this commit is going in on a branch and not on the trunk. Enhancements that are not here yet include fragment addressing, like FFS does, instead of block addressing. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.4 2000/11/17 19:14:41 perseant Exp $ d3 5 a7 7 - Investigate alternate inode locking strategy: Inode locks are useful for locking against simultaneous changes to inode size (balloc, truncate, write) but because the assignment of disk blocks is also covered by the segment lock, we don't really need to pay attention to the inode lock when writing a segment, right? If this is true, the locking problem in lfs_{bmapv,markv} goes away and lfs_reserve can go, too. d9 2 a10 1 - Fully working fsck_lfs. (Really, need a general-purpose external d13 4 d20 1 a20 1 we shrink the inode block size to DEV_BSIZE? Or parametrize it at fs d31 6 d85 8 d99 5 @ 1.3 log @New CHANGES files that describes briefly all nontrivial changes made to the LFS since the 4.4lite2 code was merged into NetBSD. TODO updated to remove everything marked DONE in 4.4, and add in a list of more current things to do. Get rid of comments about the cleaner syscall code and missing fragment support from README. @ text @d1 1 a1 1 # $NetBSD: TODO,v 1.2 1994/06/29 06:46:45 cgd Exp $ d7 1 a7 1 neatly lay out the segments along stripe boundaries. a16 4 - Blocks created in the cache are currently not marked in any way, except that b_blkno == b_lblkno, which can happen naturally too. LFS needs to know for accounting. a64 5 - If we clean a DIROP vnode, and we toss a fake buffer in favor of a pending held real buffer, we risk writing part of the dirop during a synchronous checkpoint. This is bad. Now that we're doing `stingy' cleaning, is there a good reason to favor real blocks over fake ones? @ 1.3.8.1 log @Sync with HEAD. @ text @d1 1 a1 1 # $NetBSD$ d7 1 a7 1 neatly lay out the segments along stripe boundaries. [v2] d17 4 d69 5 @ 1.2 log @New RCS ID's, take two. they're more aesthecially pleasant, and use 'NetBSD' @ text @d1 1 a1 1 # $NetBSD$ d3 133 a135 1 # @@(#)TODO 8.1 (Berkeley) 6/11/93 d137 2 a138 114 NOTE: Changed the lookup on a page of inodes to search from the back in case the same inode gets written twice on the same page. Make sure that if you are writing a file, but not all the blocks make it into a single segment, that you do not write the inode in that segment. Keith: Why not delete the lfs_bmapv call, just mark everything dirty that isn't deleted/truncated? Get some numbers about what percentage of the stuff that the cleaner thinks might be live is live. If it's high, get rid of lfs_bmapv. There is a nasty problem in that it may take *more* room to write the data to clean a segment than is returned by the new segment because of indirect blocks in segment 2 being dirtied by the data being copied into the log from segment 1. The suggested solution at this point is to detect it when we have no space left on the filesystem, write the extra data into the last segment (leaving no clean ones), make it a checkpoint and shut down the file system for fixing by a utility reading the raw partition. Argument is that this should never happen and is practically impossible to fix since the cleaner would have to theoretically build a model of the entire filesystem in memory to detect the condition occurring. A file coalescing cleaner will help avoid the problem, and one that reads/writes from the raw disk could fix it. DONE Currently, inodes are being flushed to disk synchronously upon creation -- see ufs_makeinode. However, only the inode is flushed, the directory "name" is written using VOP_BWRITE, so it's not synchronous. Possible solutions: 1: get some ordering in the writes so that inode/directory entries get stuffed into the same segment. 2: do both synchronously 3: add Mendel's information into the stream so we log creation/deletion of inodes. 4: do some form of partial segment when changing the inode (creation/deletion/rename). DONE Fix i_block increment for indirect blocks. If the file system is tar'd, extracted on top of another LFS, the IFILE ain't worth diddly. Is the cleaner writing the IFILE? If not, let's make it read-only. DONE Delete unnecessary source from utils in main-line source tree. DONE Make sure that we're counting meta blocks in the inode i_block count. Overlap the version and nextfree fields in the IFILE DONE Vinvalbuf (Kirk): Why writing blocks that are no longer useful? Are the semantics of close such that blocks have to be flushed? How specify in the buf chain the blocks that don't need to be written? (Different numbering of indirect blocks.) Margo: Change so that only search one sector of inode block file for the inode by using sector addresses in the ifile instead of logical disk addresses. Fix the use of the ifile version field to use the generation number instead. DONE Unmount; not doing a bgetvp (VHOLD) in lfs_newbuf call. DONE Document in the README file where the checkpoint information is on disk. Variable block sizes (Margo/Keith). Switch the byte accounting to sector accounting. DONE Check lfs.h and make sure that the #defines/structures are all actually needed. DONE Add a check in lfs_segment.c so that if the segment is empty, we don't write it. Need to keep vnode v_numoutput up to date for pending writes? DONE USENIX paper (Carl/Margo). Evelyn: lfsck: If delete a file that's being executed, the version number isn't updated, and lfsck has to figure this out; case is the same as if have an inode that no directory references, so the file should be reattached into lost+found. Recovery/fsck. Carl: Investigate: clustering of reads (if blocks in the segment are ordered, should read them all) and writes (McVoy paper). Investigate: should the access time be part of the IFILE: pro: theoretically, saves disk writes con: cacheing inodes should obviate this advantage the IFILE is already humongous Cleaner. Port to OSF/1 (Carl/Keith). Currently there's no notion of write error checking. + Failed data/inode writes should be rescheduled (kernel level bad blocking). + Failed superblock writes should cause selection of new superblock for checkpointing. FUTURE FANTASIES: ============ + unrm, versioning + transactions + extended cleaner policies (hot/cold data, data placement) ============================== Problem with the concept of multiple buffer headers referencing the segment: Positives: Don't lock down 1 segment per file system of physical memory. Don't copy from buffers to segment memory. Don't tie down the bus to transfer 1M. Works on controllers supporting less than large transfers. Disk can start writing immediately instead of waiting 1/2 rotation and the full transfer. Negatives: Have to do segment write then segment summary write, since the latter is what verifies that the segment is okay. (Is there another way to do this?) ============================== The algorithm for selecting the disk addresses of the super-blocks has to be available to the user program which checks the file system. (Currently in newfs, becomes a common subroutine.) @ 1.1 log @Update to 4.4-Lite fs code, with local changes. @ text @d1 3 a3 2 # from: @@(#)TODO 8.1 (Berkeley) 6/11/93 # $Id: $ @ 1.1.1.1 log @Import 4.4BSD-Lite for reference @ text @d1 2 a2 1 # @@(#)TODO 8.1 (Berkeley) 6/11/93 @