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?

----- [EMAIL PROTECTED]'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 [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to