+}
+
+int
+lfs_segwrite(mp, flags)
+ struct mount *mp;
+ int flags; /* Do a checkpoint. */
+{
+ struct buf *bp;
+ struct inode *ip;
+ struct lfs *fs;
+ struct segment *sp;
+ struct vnode *vp;
+ SEGUSE *segusep;
+ daddr_t ibno;
+ CLEANERINFO *cip;
+ int clean, do_ckp, error, i;
+
+ fs = VFSTOUFS(mp)->um_lfs;
+
+ /*
+ * If we have fewer than 2 clean segments, wait until cleaner
+ * writes.
+ */
+ do {
+ LFS_CLEANERINFO(cip, fs, bp);
+ clean = cip->clean;
+ brelse(bp);
+ if (clean <= 2) {
+ printf ("segs clean: %d\n", clean);
+ wakeup(&lfs_allclean_wakeup);
+ if (error = tsleep(&fs->lfs_avail, PRIBIO + 1,
+ "lfs writer", 0))
+ return (error);
+ }
+ } while (clean <= 2 );
+
+ /*
+ * Allocate a segment structure and enough space to hold pointers to
+ * the maximum possible number of buffers which can be described in a
+ * single summary block.
+ */
+ do_ckp = flags & SEGM_CKP || fs->lfs_nactive > MAX_ACTIVE;
+ lfs_seglock(fs, flags | (do_ckp ? SEGM_CKP : 0));
+ sp = fs->lfs_sp;
+
+ lfs_writevnodes(fs, mp, sp, VN_REG);
+
+ /* XXX ignore ordering of dirops for now */
+ /* XXX
+ fs->lfs_writer = 1;
+ if (fs->lfs_dirops && (error =
+ tsleep(&fs->lfs_writer, PRIBIO + 1, "lfs writer", 0))) {
+ free(sp->bpp, M_SEGMENT);
+ free(sp, M_SEGMENT);
+ fs->lfs_writer = 0;
+ return (error);
+ }
+
+ lfs_writevnodes(fs, mp, sp, VN_DIROP);
+ */
+
+ /*
+ * If we are doing a checkpoint, mark everything since the
+ * last checkpoint as no longer ACTIVE.
+ */
+ if (do_ckp)
+ for (ibno = fs->lfs_cleansz + fs->lfs_segtabsz;
+ --ibno >= fs->lfs_cleansz; ) {
+ if (bread(fs->lfs_ivnode, ibno, fs->lfs_bsize,
+ NOCRED, &bp))
+
+ panic("lfs: ifile read");
+ segusep = (SEGUSE *)bp->b_data;
+ for (i = fs->lfs_sepb; i--; segusep++)
+ segusep->su_flags &= ~SEGUSE_ACTIVE;
+
+ error = VOP_BWRITE(bp);
+ }
+
+ if (do_ckp || fs->lfs_doifile) {
+redo: