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
This commit is contained in:
John W. De Boskey 2000-10-24 00:08:30 +00:00
parent a555b1468d
commit 45c29d5cda
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=67478

View File

@ -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 @@ mkfs(pp, fsys, fi, fo)
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;
@ -1329,6 +1332,27 @@ daddr_t wc_sect; /* units of sectorsize */
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
*/
@ -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) {