From 618c5e24e67bd153f0e2b63817fb2c156bc3a62f Mon Sep 17 00:00:00 2001 From: art Date: Sun, 5 Dec 1999 07:54:44 +0000 Subject: With soft updates, some buffers will be remarked as dirty after being written. Handle this when syncing filesystems when unmounting. From NetBSD. --- sys/kern/vfs_subr.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'sys/kern/vfs_subr.c') diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 13fae857831..9a362e7f4bb 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_subr.c,v 1.42 1999/12/05 07:39:28 art Exp $ */ +/* $OpenBSD: vfs_subr.c,v 1.43 1999/12/05 07:54:44 art Exp $ */ /* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */ /* @@ -1780,21 +1780,40 @@ vfs_syncwait(verbose) int verbose; { register struct buf *bp; - int iter, nbusy; + int iter, nbusy, dcount, s; sys_sync(&proc0, (void *)0, (register_t *)0); /* Wait for sync to finish. */ + dcount = 10000; for (iter = 0; iter < 20; iter++) { nbusy = 0; - for (bp = &buf[nbuf]; --bp >= buf; ) + for (bp = &buf[nbuf]; --bp >= buf; ) { if ((bp->b_flags & (B_BUSY|B_INVAL)) == B_BUSY) nbusy++; - if (nbusy == 0) - break; - if (verbose) - printf("%d ", nbusy); - DELAY(40000 * iter); + /* + * With soft updates, some buffers that are + * written will be remarked as dirty until other + * buffers are written. + */ + if (bp->b_flags & B_DELWRI) { + s = splbio(); + bremfree(bp); + bp->b_flags |= B_BUSY; + splx(s); + nbusy++; + bawrite(bp); + if (dcount-- <= 0) { + printf("softdep "); + return 1; + } + } + } + if (nbusy == 0) + break; + if (verbose) + printf("%d ", nbusy); + DELAY(40000 * iter); } return nbusy; -- cgit v1.2.3-59-g8ed1b