Skip site navigation (1)Skip section navigation (2)
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>