Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Apr 1998 12:00:03 -0700 (PDT)
From:      Matthew Dillon <dillon@backplane.com>
To:        freebsd-bugs
Subject:   Re: kern/6212: Two bugs with MFS filesystem fixed, two features added 
Message-ID:  <199804071900.MAA15714@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/6212; it has been noted by GNATS.

From: Matthew Dillon <dillon@backplane.com>
To: David Greenman <dg@root.com>
Cc: freebsd-bugs@hub.freebsd.org, freebsd-gnats-submit@hub.freebsd.org
Subject: Re: kern/6212: Two bugs with MFS filesystem fixed, two features added 
Date: Tue, 7 Apr 1998 11:54:19 -0700 (PDT)

 :
 :   ...only if you want us to commit the changes. :-)
 :
 :-DG
 :
 :David Greenman
 :Core-team/Principal Architect, The FreeBSD Project
 
     heh heh.
 
 
     Matthew Dillon   Engineering, BEST Internet Communications, Inc.
 		     <dillon@backplane.com>
     [always include a portion of the original email in any response!]
 
 
 Index: mkfs.c
 ===================================================================
 RCS file: /src/FreeBSD-CVS/ncvs/src/sbin/newfs/mkfs.c,v
 retrieving revision 1.21
 diff -u -r1.21 mkfs.c
 --- mkfs.c	1998/01/19 16:55:26	1.21
 +++ mkfs.c	1998/04/07 04:06:28
 @@ -40,6 +40,7 @@
  #include <sys/time.h>
  #include <sys/wait.h>
  #include <sys/resource.h>
 +#include <sys/stat.h>
  #include <ufs/ufs/dinode.h>
  #include <ufs/ufs/dir.h>
  #include <ufs/ffs/fs.h>
 @@ -106,6 +107,7 @@
  extern caddr_t	malloc(), calloc();
  #endif
  extern char *	filename;
 +extern int	skipnewfs;
  
  union {
  	struct fs fs;
 @@ -178,19 +180,29 @@
  		if(filename) {
  			unsigned char buf[BUFSIZ];
  			unsigned long l,l1;
 -			fd = open(filename,O_RDWR|O_TRUNC|O_CREAT,0644);
 +			struct stat st;
 +
 +			fd = open(filename,O_RDWR|O_CREAT,0644);
  			if(fd < 0) {
  				perror(filename);
  				exit(12);
  			}
 -			for(l=0;l< fssize * sectorsize;l += l1) {
 -				l1 = fssize * sectorsize;
 -				if (BUFSIZ < l1)
 -					l1 = BUFSIZ;
 -				if (l1 != write(fd,buf,l1)) {
 -					perror(filename);
 +			fstat(fd, &st);
 +			if (st.st_size != fssize * sectorsize) {
 +				if (skipnewfs) {
 +					fprintf(stderr, "Filesize does not match filesystem sector count\n");
  					exit(12);
  				}
 +				ftruncate(fd, fssize * sectorsize);
 +				for(l=0;l< fssize * sectorsize;l += l1) {
 +					l1 = fssize * sectorsize;
 +					if (BUFSIZ < l1)
 +						l1 = BUFSIZ;
 +					if (l1 != write(fd,buf,l1)) {
 +						perror(filename);
 +						exit(12);
 +					}
 +				}
  			}
  			membase = mmap(
  				0,
 @@ -216,6 +228,8 @@
  			}
  		}
  	}
 +	if (skipnewfs == 0) { 	/* didn't re-indent context so submitted cvs diff would be more readable */
 +
  	fsi = fi;
  	fso = fo;
  	if (Oflag) {
 @@ -699,6 +713,9 @@
  	pp->p_fsize = sblock.fs_fsize;
  	pp->p_frag = sblock.fs_frag;
  	pp->p_cpg = sblock.fs_cpg;
 +
 +	}	/* endif skipnewfs */
 +
  	/*
  	 * Notify parent process of success.
  	 * Dissociate from session and tty.
 Index: newfs.c
 ===================================================================
 RCS file: /src/FreeBSD-CVS/ncvs/src/sbin/newfs/newfs.c,v
 retrieving revision 1.18
 diff -u -r1.18 newfs.c
 --- newfs.c	1998/01/16 06:31:23	1.18
 +++ newfs.c	1998/04/07 04:02:25
 @@ -193,6 +193,7 @@
  u_long	memleft;		/* virtual memory available */
  caddr_t	membase;		/* start address of memory based filesystem */
  char	*filename;
 +int	skipnewfs;
  #ifdef COMPAT
  char	*disktype;
  int	unlabeled;
 @@ -234,7 +235,7 @@
  	}
  
  	opstring = mfs ?
 -	    "NF:T:a:b:c:d:e:f:i:m:o:s:" :
 +	    "NF:U:T:a:b:c:d:e:f:i:m:o:s:" :
  	    "NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:x:";
  	while ((ch = getopt(argc, argv, opstring)) != -1)
  		switch (ch) {
 @@ -253,6 +254,9 @@
  			disktype = optarg;
  			break;
  #endif
 +		case 'U':
 +			skipnewfs = 1;
 +			/* fall through */
  		case 'F':
  			filename = optarg;
  			break;
 Index: mfs_vfsops.c
 ===================================================================
 RCS file: /src/FreeBSD-CVS/ncvs/src/sys/ufs/mfs/mfs_vfsops.c,v
 retrieving revision 1.41
 diff -u -r1.41 mfs_vfsops.c
 --- mfs_vfsops.c	1998/03/01 22:46:53	1.41
 +++ mfs_vfsops.c	1998/04/05 02:21:16
 @@ -46,6 +46,8 @@
  #include <sys/signalvar.h>
  #include <sys/vnode.h>
  #include <sys/malloc.h>
 +#include <sys/sysproto.h>	/* for msync_args */
 +#include <sys/mman.h>	/* for msync_args */
  
  #include <ufs/ufs/quota.h>
  #include <ufs/ufs/inode.h>
 @@ -430,6 +432,13 @@
  error_1:	/* no state to back out*/
  
  success:
 +	/*
 +	 * must mark the calling process as a system process
 +	 * so the pager doesn't try to kill it.  Doh!  And the
 +	 * pager may because the resident set size may be huge.
 +	 */
 +	p->p_flag |= P_SYSTEM;
 +
  	return( err);
  }
  
 @@ -468,7 +477,8 @@
  		 * If a non-ignored signal is received, try to unmount.
  		 * If that fails, clear the signal (it has been "processed"),
  		 * otherwise we will loop here, as tsleep will always return
 -		 * EINTR/ERESTART.
 +		 * EINTR/ERESTART.  It will return EWOULDBLOCK if the timer
 +		 * expired.
  		 */
  		/*
  		 * Note that dounmount() may fail if work was queued after
 @@ -479,9 +489,37 @@
  			gotsig = 0;
  			if (dounmount(mp, 0, p) != 0)
  				CLRSIG(p, CURSIG(p));	/* try sleep again.. */
 -		}
 -		else if (tsleep((caddr_t)vp, mfs_pri, "mfsidl", 0))
 +		} else {
 +		    int r = tsleep((caddr_t)vp, mfs_pri, "mfsidl", hz * 10);
 +
 +		    if (r && r != EWOULDBLOCK)
  			gotsig++;	/* try to unmount in next pass */
 +		}
 +
 +		/*
 +		 * we should call msync on the backing store every 30 seconds,
 +		 * otherwise the pages are not associated with the file and guess
 +		 * what!  the syncer never sees them.  msync has no effect 
 +		 * if the backing store is swap, but a big effect if it's a file
 +		 * (e.g. an NFS mounted file).
 +		 */
 +		{
 +			static long lsec;
 +			int dt = time_second - lsec;
 +
 +			if (dt < -30 || dt > 30) {
 +				struct msync_args uap;
 +
 +				lsec = time_second;
 +
 +				uap.addr = mfsp->mfs_baseoff;
 +				uap.len = mfsp->mfs_size;
 +				uap.flags = MS_ASYNC;
 +
 +				msync(curproc, &uap);
 +			}
 +		}
 +
  	}
  	return (0);
  }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804071900.MAA15714>