[comp.bugs.4bsd] miniroot file system corruption

chris@isieng.UUCP (Chris Horne) (05/05/87)

	There is a bug in BSD4.2 and BSD4.3 based kernels when running in the 
miniroot which can cause corruption of the miniroot file system.  

	When running in the miniroot "argdev", "rootdev" and "swdevt[0].sw_dev"
all refer to the same device.  For swap operations transfers are offset by 
MINIROOTSIZE in sys/vm_sw.c:swstrategy before doing any actual io (any 
buffer or cmap <dev,bn> caching is relative to /dev/drum).  However, "argdev" 
references are never offset by MINIROOTSIZE in sys/kern_exec.c. This causes a 
<dev,bn> conflict in the buffer cache between data on "rootdev" and "argdev".
This same problem exists on NFS/vnode based kernels with a <dev_vp,bn> conflict.

	The fix which I have applied involves moving the definition of 
MINIROOTSIZE from sys/vm_sw.c to machine/machparam.h and applying the following
diff to sys/kern_exec.c.  For vnode based kernels use rootvp and argdev_vp for
rootdev and argdev in the diff's below.


*** kern_exec.c	Mon May  4 13:38:31 1987
--- x	Mon May  4 13:40:07 1987
***************
*** 191,198
  	nc = 0;
  	cc = 0;
  	uap = (struct execa *)u.u_ap;
  	bno = rmalloc(argmap, (long)ctod(clrnd((int)btoc(NCARGS))));
  	if (bno == 0) {
  		swkill(u.u_procp, "exec: no swap space");
  		goto bad;
  	}

--- 191,200 -----
  	nc = 0;
  	cc = 0;
  	uap = (struct execa *)u.u_ap;
  	bno = rmalloc(argmap, (long)ctod(clrnd((int)btoc(NCARGS))));
+ 	if (rootdev == argdev)
+ 		bno += MINIROOTSIZE;
  	if (bno == 0) {
  		swkill(u.u_procp, "exec: no swap space");
  		goto bad;
  	}
***************
*** 369,377
  	}
  bad:
  	if (bp)
  		brelse(bp);
! 	if (bno)
  		rmfree(argmap, (long)ctod(clrnd((int) btoc(NCARGS))), bno);
  	if (ip)
  		iput(ip);
  }

--- 371,381 -----
  	}
  bad:
  	if (bp)
  		brelse(bp);
! 	if (bno) {
! 		if (rootdev == argdev)
! 			bno += MINIROOTSIZE;
  		rmfree(argmap, (long)ctod(clrnd((int) btoc(NCARGS))), bno);
  	}
  	if (ip)
  		iput(ip);
***************
*** 371,378
  	if (bp)
  		brelse(bp);
  	if (bno)
  		rmfree(argmap, (long)ctod(clrnd((int) btoc(NCARGS))), bno);
  	if (ip)
  		iput(ip);
  }
  

--- 375,383 -----
  	if (bno) {
  		if (rootdev == argdev)
  			bno += MINIROOTSIZE;
  		rmfree(argmap, (long)ctod(clrnd((int) btoc(NCARGS))), bno);
+ 	}
  	if (ip)
  		iput(ip);
  }
  

--
Chris Horne       Integrated Solutions, 1140 Ringwood Court, San Jose, CA 95131