head	1.10;
access;
symbols
	netbsd-9-5-RELEASE:1.10
	netbsd-11-0-RELEASE:1.10
	netbsd-11-0-RC7:1.10
	netbsd-11-0-RC6:1.10
	netbsd-11-0-RC5:1.10
	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
@
