Module Name: src Committed By: perseant Date: Mon Jan 2 22:10:45 UTC 2012
Modified Files: src/sys/ufs/lfs: lfs.h lfs_bio.c lfs_extern.h lfs_segment.c lfs_subr.c lfs_syscalls.c lfs_vfsops.c lfs_vnops.c src/sys/ufs/ufs: inode.h ufs_readwrite.c Log Message: * Remove PGO_RECLAIM during lfs_putpages()' call to genfs_putpages(), to avoid a live lock in the latter when reclaiming a vnode with dirty pages. * Add a new segment flag, SEGM_RECLAIM, to note when a segment is being written for vnode reclamation, and record which inode is being reclaimed, to aid in forensic debugging. * Add a new segment flag, SEGM_SINGLE, so that opportunistic writes can write a single segment's worth of blocks and then stop, rather than writing all the way up to the cleaner's reserved number of segments. * Add assert statements to check mutex ownership is the way it ought to be, mostly in lfs_putpages; fix problems uncovered by this. * Don't clear VU_DIROP until the inode actually makes its way to disk, avoiding a problem where dirop inodes could become separated (uncovered by a modified version of the "ckckp" forensic regression test). * Move the vfs_getopsbyname() call into lfs_writerd. Prepare code to make lfs_writerd notice when there are no more LFSs, and exit losing the reference, so that, in theory, the module can be unloaded. This code is not enabled, since it causes a crash on exit. * Set IN_MODIFIED on inodes flushed by lfs_flush_dirops. Really we only need to set IN_MODIFIED if we are going to write them again (e.g., to write pages); need to think about this more. Finally, several changes to help avoid "no clean segments" panics: * In lfs_bmapv, note when a vnode is loaded only to discover whether its blocks are live, so it can immediately be recycled. Since the cleaner will try to choose ~empty segments over full ones, this prevents the cleaner from (1) filling the vnode cache with junk, and (2) squeezing any unwritten writes to disk and running the fs out of segments. * Overestimate by half the amount of metadata that will be required to fill the clean segments. This will make the disk appear smaller, but should help avoid a "no clean segments" panic. * Rearrange lfs_writerd. In particular, lfs_writerd now pays attention to the number of clean segments available, and holds off writing until there is room. To generate a diff of this commit: cvs rdiff -u -r1.134 -r1.135 src/sys/ufs/lfs/lfs.h cvs rdiff -u -r1.120 -r1.121 src/sys/ufs/lfs/lfs_bio.c cvs rdiff -u -r1.96 -r1.97 src/sys/ufs/lfs/lfs_extern.h cvs rdiff -u -r1.222 -r1.223 src/sys/ufs/lfs/lfs_segment.c cvs rdiff -u -r1.76 -r1.77 src/sys/ufs/lfs/lfs_subr.c cvs rdiff -u -r1.139 -r1.140 src/sys/ufs/lfs/lfs_syscalls.c cvs rdiff -u -r1.291 -r1.292 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.238 -r1.239 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.58 -r1.59 src/sys/ufs/ufs/inode.h cvs rdiff -u -r1.100 -r1.101 src/sys/ufs/ufs/ufs_readwrite.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.