Up to [cvs.NetBSD.org] / src / sys / ufs / ufs
Request diff between arbitrary revisions
Default branch: MAIN
Current tag: yamt-nfs-mp-base9
Revision 1.65 / (download) - annotate - [select for diffs], Fri Jan 15 19:46:35 2010 UTC (14 years, 3 months ago) by bouyer
Branch: MAIN
CVS Tags: yamt-nfs-mp-base9,
uebayasi-xip-base1,
uebayasi-xip-base
Branch point for: uebayasi-xip,
rmind-uvmplock
Changes since 1.64: +10 -8
lines
Diff to previous 1.64 (colored)
vclean() actually sets v_tag to VT_NON but doesn't touch v_type. getcleanvnode() sets v_type to VNON after releasing v_interlock. So the thread doing quotaon(), quotaoff() or qsync() could vget() a vnode which is being recycled in getcleanvnode(), after is has been cleaned and v_interlock released, but before v_type has been reset, leading to KASSERT(vp->v_usecount == 1) firing in getnewvnode(), or qsync() dereferending a NULL pointer as in PR kern/42205. Fix by using the same tests as other ffs function traversing the mount list: also check for VTOI(vp) == NULL, and VI_XLOCK in addition to VI_CLEAN.