Date: Sun, 22 Oct 2000 08:31:32 -0400 From: "John W. De Boskey" <jwd@FreeBSD.ORG> To: Tor.Egge@fast.no Cc: freebsd-current@FreeBSD.ORG, peter@FreeBSD.ORG Subject: Re: newfs/fsck problem (bad superblocks) Message-ID: <20001022083132.A35694@bsdwins.com> In-Reply-To: <200010220822.KAA59278@midten.fast.no>; from Tor.Egge@fast.no on Sun, Oct 22, 2000 at 10:22:07AM %2B0200 References: <20001022003609.A33732@bsdwins.com> <200010220822.KAA59278@midten.fast.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Patch appears to fix the problem. Do you want to commit it? Peter? me? Thanks, John ps: it would be interesting to add a statistic to determine how often the cache block is flushed due to size or read interference. May determine that the cache should be larger (or smaller). Did you happen to look at this Peter? ----- Tor.Egge@fast.no's Original Message ----- > > Reverting src/sbin/newfs/mkfs.c to revision 1.29 fixes > > the problem. > > > > With just a quick review of the patch, I'm not sure I > > understand what forces the last dirty buffer to be > > written. > > > > revert the patch? try to fix it? comments? > > Try the enclosed patch. It flushes the dirty buffer before > program exit and before reading blocks. > > - Tor Egge > > Index: sbin/newfs/mkfs.c > =================================================================== > RCS file: /home/ncvs/src/sbin/newfs/mkfs.c,v > retrieving revision 1.30 > diff -u -r1.30 mkfs.c > --- sbin/newfs/mkfs.c 2000/10/17 00:41:36 1.30 > +++ sbin/newfs/mkfs.c 2000/10/22 08:17:05 > @@ -153,6 +153,7 @@ > 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 @@ > 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 @@ > { > int n; > > + wtfsflush(); > if (mfs) { > memmove(bf, membase + bno * sectorsize, size); > return; > @@ -1330,6 +1333,27 @@ > 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 > @@ -1363,19 +1387,8 @@ > if (wc_end < WCSIZE) > 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) { To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001022083132.A35694>