Plan 9 from Bell Labs’s /usr/web/sources/extra/changes/2006/0226

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


tapefs: more 64-bit tar fixes, add block size parameter to 32vfs
 [rsc] --rw-rw-r-- M 1812954 glenda sys 1815 Feb 26 10:06 sys/src/cmd/tapefs/tapefs.h
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/tapefs.h:1,7 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/tapefs.h:1,10
	  #define	g2byte(x)	(((x)[1]<<8) + (x)[0])		/* little-endian */
	  #define	g3byte(x)	(((x)[2]<<16) + ((x)[1]<<8) + (x)[0])
	  #define	g4byte(x)	(((x)[3]<<24) + ((x)[2]<<16) + ((x)[1]<<8) + (x)[0])
	- #define	g8byte(x)	(((vlong)g4byte(x)<<32) | (u32int)g4byte(x+4))
	+ 
	+ /* big endian */
	+ #define	b4byte(x)	(((x)[0]<<24) + ((x)[1]<<16) + ((x)[2]<<8) + (x)[3])
	+ #define	b8byte(x)	(((vlong)b4byte(x)<<32) | (u32int)b4byte((x)+4))
	  enum
	  {
	  	OPERM	= 0x3,		/* mask of all permission types in open mode */
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/tapefs.h:75,80 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/tapefs.h:78,84
	  extern	Idmap	*uidmap;
	  extern	Idmap	*gidmap;
	  extern	int	replete;
	+ extern	int	blocksize;
	  void	error(char*);
	  void	*erealloc(void*, ulong);
	  void	*emalloc(ulong);
 [rsc] --rw-rw-r-- M 1812954 glenda sys 1861 Feb 26 09:58 sys/man/4/tapefs
	/n/sourcesdump/2006/0226/plan9/sys/man/4/tapefs:4,9 - 
	/n/sourcesdump/2006/0227/plan9/sys/man/4/tapefs:4,13
	  .SH SYNOPSIS
	  .B fs/32vfs
	  [
	+ .B -b
	+ .I blocksize
	+ ]
	+ [
	  .B -m
	  .I mountpoint
	  ]
	/n/sourcesdump/2006/0226/plan9/sys/man/4/tapefs:52,58 - 
	/n/sourcesdump/2006/0227/plan9/sys/man/4/tapefs:56,62
	  .PP
	  .I 32vfs
	  interprets raw disk images of 32V systems, which are ca. 1978 research Unix systems for
	- the VAX, and also pre-FFS Berkeley VAX systems (1KB block size).
	+ the VAX (512 byte block size, the default), and also pre-FFS Berkeley VAX systems (1KB block size).
	  .PP
	  .I Cpiofs
	  interprets
	/n/sourcesdump/2006/0226/plan9/sys/man/4/tapefs:101,106 - 
	/n/sourcesdump/2006/0227/plan9/sys/man/4/tapefs:105,109
	  turn derive substantially from
	  .IR ramfs (4).
	  .SH "SEE ALSO
	- Section 5
	- .IR passim ,
	+ .IR intro (5),
	  .IR ramfs (4).
 [rsc] --rw-rw-r-- M 1812954 glenda sys 3922 Feb 26 09:56 sys/src/cmd/tapefs/32vfs.c
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/32vfs.c:20,28 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/32vfs.c:20,30
	  #define	VSUPERB	1
	  #define	VROOT		2	/* root inode */
	  #define	VNAMELEN	14
	- #define	BLSIZE	512
	+ #define	MAXBLSIZE	1024
	+ int	BLSIZE;
	  #define	LINOPB	(BLSIZE/sizeof(struct v32dinode))
	- #define	LNINDIR	(BLSIZE/sizeof(unsigned long))
	+ #define	LNINDIR	(BLSIZE/4)
	+ #define	MAXLNINDIR	(MAXBLSIZE/4)
	  
	  struct v32dinode {
	  	unsigned char flags[2];
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/32vfs.c:50,56 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/32vfs.c:52,66
	  populate(char *name)
	  {
	  	Fileinf f;
	+ 	uchar buf[MAXBLSIZE];
	  
	+ 	BLSIZE = 512;	/* 32v */
	+ 	if(blocksize){
	+ 		/* 1024 for 4.1BSD */
	+ 		if(blocksize != 512 && blocksize != 1024)
	+ 			error("bad block size");
	+ 		BLSIZE = blocksize;
	+ 	}
	  	replete = 0;
	  	tapefile = open(name, OREAD);
	  	if (tapefile<0)
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/32vfs.c:106,112 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/32vfs.c:116,122
	  char *
	  doread(Ram *r, vlong off, long cnt)
	  {
	- 	static char buf[Maxbuf+BLSIZE];
	+ 	static char buf[Maxbuf+MAXBLSIZE];
	  	int bno, i;
	  
	  	bno = off/BLSIZE;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/32vfs.c:147,153 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/32vfs.c:157,163
	  Fileinf
	  iget(int ino)
	  {
	- 	char buf[BLSIZE];
	+ 	char buf[MAXBLSIZE];
	  	struct v32dinode *dp;
	  	long flags, i;
	  	Fileinf f;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/32vfs.c:194,200 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/32vfs.c:204,210
	  long
	  bmap(Ram *r, long bno)
	  {
	- 	unsigned char indbuf[LNINDIR][sizeof(long)];
	+ 	unsigned char indbuf[MAXLNINDIR][4];
	  
	  	if (bno < VNADDR-3)
	  		return ((long*)r->data)[bno];
 [rsc] --rw-rw-r-- M 1812954 glenda sys 2964 Feb 26 10:01 sys/src/cmd/tapefs/util.c
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/util.c:58,76 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/util.c:58,82
	  Ram *
	  poppath(Fileinf fi, int new)
	  {
	- 	char *suffix;
	+ 	char *suffix, *origname;
	  	Ram *dir, *ent;
	  	Fileinf f;
	  
	  	if (*fi.name=='\0')
	  		return 0;
	+ 	origname = estrdup(fi.name);
	  	if (suffix=strrchr(fi.name, '/')){
	  		*suffix = 0;
	  		suffix++;
	  		if (*suffix=='\0'){
	  			fi.mode |= DMDIR;
	+ 			free(origname);
	  			return poppath(fi, 1);
	  		}
	+ 		/*
	+ 		 * create parent directory of suffix;
	+ 		 * may recurse, thus shortening fi.name even further.
	+ 		 */
	  		f = fi;
	  		f.size = 0;
	  		f.addr = 0;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/util.c:81,95 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/util.c:87,106
	  	} else {
	  		suffix = fi.name;
	  		dir = ram;
	- 		if (strcmp(suffix, ".")==0)
	+ 		if (strcmp(suffix, ".")==0) {
	+ 			free(origname);
	  			return dir;
	+ 		}
	  	}
	  	ent = lookup(dir, suffix);
	  	fi.mode |= 0400;			/* at least user read */
	  	if (ent){
	  		if (((fi.mode&DMDIR)!=0) != ((ent->qid.type&QTDIR)!=0)){
	- 			fprint(2, "%s/%s directory botch\n", fi.name, suffix);
	- 			exits("");
	+ 			fprint(2,
	+ 		"%s file type changed; probably due to union dir.; ignoring\n",
	+ 				origname);
	+ 			free(origname);
	+ 			return ent;
	  		}
	  		if (new)  {
	  			ent->ndata = fi.size;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/util.c:104,109 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/util.c:115,121
	  		fi.name = suffix;
	  		ent = popfile(dir, fi);
	  	}
	+ 	free(origname);
	  	return ent;
	  }
	  
 [rsc] --rw-rw-r-- M 1812954 glenda sys 1815 Feb 26 10:06 sys/src/cmd/tapefs/tapefs.h
 [rsc] --rw-rw-r-- M 1812954 glenda sys 9887 Feb 26 20:22 sys/src/cmd/tapefs/fs.c
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/fs.c:16,23 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/fs.c:16,25
	  Idmap	*uidmap;
	  Idmap	*gidmap;
	  int	replete;
	+ int	blocksize;		/* for 32v */
	  int	verbose;
	  int	newtap;		/* tap with time in sec */
	+ int	blocksize;
	  
	  Fid *	newfid(int);
	  int	ramstat(Ram*, uchar*, int);
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/fs.c:80,98 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/fs.c:82,103
	  	defmnt = "/n/tapefs";
	  	ARGBEGIN{
	  	case 'm':
	- 		defmnt = ARGF();
	+ 		defmnt = EARGF(usage());
	  		break;
	  	case 'p':			/* password file */
	- 		uidmap = getpass(ARGF());
	+ 		uidmap = getpass(EARGF(usage()));
	  		break;
	  	case 'g':			/* group file */
	- 		gidmap = getpass(ARGF());
	+ 		gidmap = getpass(EARGF(usage()));
	  		break;
	  	case 'v':
	  		verbose++;
	- 
	+ 		break;
	  	case 'n':
	  		newtap++;
	+ 		break;
	+ 	case 'b':
	+ 		blocksize = atoi(EARGF(usage()));
	  		break;
	  	default:
	  		usage();
 [rsc] --rw-rw-r-- M 1812954 glenda sys 2759 Feb 26 20:22 sys/src/cmd/tapefs/tarfs.c
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/tapefs/tarfs.c:53,59 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/tapefs/tarfs.c:53,59
	  		f.uid = strtoul(dblock.dbuf.uid, 0, 8);
	  		f.gid = strtoul(dblock.dbuf.gid, 0, 8);
	  		if((uchar)dblock.dbuf.size[0] == 0x80)
	- 			f.size = g8byte(dblock.dbuf.size+3);
	+ 			f.size = b8byte(dblock.dbuf.size+3);
	  		else
	  			f.size = strtoull(dblock.dbuf.size, 0, 8);
	  		f.mdate = strtoul(dblock.dbuf.mtime, 0, 8);

aux/disksim: use even less memory
 [rsc] --rw-rw-r-- M 1812954 rsc sys 11178 Feb 26 09:40 sys/src/cmd/aux/disksim.c
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/aux/disksim.c:23,28 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/aux/disksim.c:23,29
	  	LOGNPTR = LOGBLKSZ-2,	/* assume sizeof(void*) == 4 */
	  	NPTR = 1<<LOGNPTR,
	  };
	+ static uchar zero[BLKSZ];
	  
	  struct Trip
	  {
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/aux/disksim.c:239,245 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/aux/disksim.c:240,245
	  uchar*
	  getblock(vlong addr, int alloc)
	  {
	- 	static uchar zero[BLKSZ];
	   	Dbl *p2;
	  	Ind *p1;
	  	uchar *p0;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/aux/disksim.c:356,364 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/aux/disksim.c:356,377
	  }
	  
	  int
	+ isnonzero(void *v, ulong n)
	+ {
	+ 	uchar *a, *ea;
	+ 	
	+ 	a = v;
	+ 	ea = a+n;
	+ 	for(; a<ea; a++)
	+ 		if(*a)
	+ 			return 1;
	+ 	return 0;
	+ }
	+ 
	+ int
	  rdwrpart(Req *r)
	  {
	- 	int q;
	+ 	int q, nonzero;
	  	Part *p;
	  	vlong offset;
	  	long count, tot, n, o;
	/n/sourcesdump/2006/0226/plan9/sys/src/cmd/aux/disksim.c:396,429 - 
	/n/sourcesdump/2006/0227/plan9/sys/src/cmd/aux/disksim.c:409,444
	  		move = evommem;
	  
	  	tot = 0;
	+ 	nonzero = 1;
	  	if(r->ifcall.type == Tread)
	  		dat = (uchar*)r->ofcall.data;
	- 	else
	+ 	else{
	  		dat = (uchar*)r->ifcall.data;
	+ 		nonzero = isnonzero(dat, r->ifcall.count);
	+ 	}
	  	o = offset & (BLKSZ-1);
	  
	  	/* left fringe block */
	- 	if(o && count){	
	- 		blk = getblock(offset, r->ifcall.type==Twrite);
	- 		if(blk == nil)
	- 			abort();
	+ 	if(o && count){
	+ 		blk = getblock(offset, r->ifcall.type==Twrite && nonzero);
	  		n = BLKSZ - o;
	  		if(n > count)
	  			n = count;
	- 		(*move)(dat, blk+o, n);
	+ 		if(r->ifcall.type != Twrite || blk != zero)
	+ 			(*move)(dat, blk+o, n);
	  		if(r->ifcall.type == Twrite)
	  			dirty(offset, blk);
	  		tot += n;
	  	}
	+ next:
	  	/* full and right fringe blocks */
	  	while(tot < count){
	- 		blk = getblock(offset+tot, r->ifcall.type==Twrite);
	- 		if(blk == nil)
	- 			abort();
	+ 		blk = getblock(offset+tot, r->ifcall.type==Twrite && nonzero);
	  		n = BLKSZ;
	  		if(n > count-tot)
	  			n = count-tot;
	- 		(*move)(dat+tot, blk, n);
	+ 		if(r->ifcall.type != Twrite || blk != zero)
	+ 			(*move)(dat+tot, blk, n);
	  		if(r->ifcall.type == Twrite)
	  			dirty(offset+tot, blk);
	  		tot += n;
 [rsc] --rw-rw-r-- M 1812954 rsc sys 1452 Feb 26 22:08 sys/man/8/disksim

tar: 64-bit fixes
 [rsc] --rw-rw-r-- M 1812954 glenda sys 24018 Feb 26 21:37 sys/src/cmd/tar.c
	[diffs elided - too long]
	[diff -c /n/sourcesdump/2006/0226/plan9/sys/src/cmd/tar.c /n/sourcesdump/2006/0227/plan9/sys/src/cmd/tar.c]


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.