From dc1ac7c889936f769ee914fab5ec60033cf5a275 Mon Sep 17 00:00:00 2001 From: jwd Date: Tue, 24 Oct 2000 00:08:30 +0000 Subject: The write combining code in revision 1.30 needs a few additional touch ups. The cache needs to be flushed against block reads, and a final flush at process termination to force the backup superblocks to disk. I believe this will allow 'make release' to complete. Submitted by: Tor.Egge@fast.no --- sbin/newfs/mkfs.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'sbin') diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index fea37d6..8e1931e 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -153,6 +153,7 @@ int makedir __P((struct direct *, int)); void rdfs __P((daddr_t, int, char *)); void setblock __P((struct fs *, unsigned char *, int)); void wtfs __P((daddr_t, int, char *)); +void wtfsflush __P((void)); #ifndef STANDALONE void get_memleft __P((void)); @@ -719,6 +720,7 @@ next: for (cylno = 0; cylno < sblock.fs_ncg; cylno++) wtfs(fsbtodb(&sblock, cgsblock(&sblock, cylno)), sbsize, (char *)&sblock); + wtfsflush(); /* * Update information about this partion in pack * label, to that it may be updated on disk. @@ -1309,6 +1311,7 @@ rdfs(bno, size, bf) { int n; + wtfsflush(); if (mfs) { memmove(bf, membase + bno * sectorsize, size); return; @@ -1330,6 +1333,27 @@ int wc_end; /* bytes */ static char wc[WCSIZE]; /* bytes */ /* + * Flush dirty write behind buffer. + */ +void +wtfsflush() +{ + int n; + if (wc_end) { + if (lseek(fso, (off_t)wc_sect * sectorsize, SEEK_SET) < 0) { + printf("seek error: %ld\n", (long)wc_sect); + err(35, "wtfs - writecombine"); + } + n = write(fso, wc, wc_end); + if (n != wc_end) { + printf("write error: %ld\n", (long)wc_sect); + err(36, "wtfs - writecombine"); + } + wc_end = 0; + } +} + +/* * write a block to the file system */ void @@ -1364,18 +1388,7 @@ wtfs(bno, size, bf) return; done = 1; } - if (wc_end) { - if (lseek(fso, (off_t)wc_sect * sectorsize, SEEK_SET) < 0) { - printf("seek error: %ld\n", (long)wc_sect); - err(35, "wtfs - writecombine"); - } - n = write(fso, wc, wc_end); - if (n != wc_end) { - printf("write error: %ld\n", (long)wc_sect); - err(36, "wtfs - writecombine"); - } - wc_end = 0; - } + wtfsflush(); if (done) return; if (lseek(fso, (off_t)bno * sectorsize, SEEK_SET) < 0) { -- cgit v1.1