summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorjwd <jwd@FreeBSD.org>2000-10-24 00:08:30 +0000
committerjwd <jwd@FreeBSD.org>2000-10-24 00:08:30 +0000
commitdc1ac7c889936f769ee914fab5ec60033cf5a275 (patch)
tree024d0ab7704f7fbd52f587fbd4d96b790c6937dd /sbin
parentdd3e4087e878ed28bb919eff2503f1465f3b114f (diff)
downloadFreeBSD-src-dc1ac7c889936f769ee914fab5ec60033cf5a275.zip
FreeBSD-src-dc1ac7c889936f769ee914fab5ec60033cf5a275.tar.gz
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
Diffstat (limited to 'sbin')
-rw-r--r--sbin/newfs/mkfs.c37
1 files changed, 25 insertions, 12 deletions
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) {
OpenPOWER on IntegriCloud