⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chk.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
		print("%s->name (%s) name too large\n", name, d->name);		return 0;	}	strcat(name, d->name);	if(d->mode & DDIR) {		if(edent.ns > 1) {			strcat(name, "/");			edent.ns++;		}		if(flags & Cpdir) {			print("%s\n", name);			prflush();		}	} else	if(flags & Cpfile) {		print("%s\n", name);		prflush();	}	/* check qid */	edent.qpath = d->qid.path & ~QPDIR;	qmark(edent.qpath);	if(edent.qpath > maxq)		maxq = edent.qpath;	/* check direct blocks (the common case) */	dmod = 0;	{		Off a;		for(i=0; i<NDBLOCK; i++) {			dmod += daddrck(&d->dblock[i], &a);			if (a)				dmod += dirck(&edent, a);		}	}	/* check indirect^n blocks, if any */	for (i = 0; i < NIBLOCK; i++)		dmod += indiraddrck(&edent, &d->iblocks[i], Tind1+i);	return dmod;}#define	XFEN	(FEPERBUF+6)typedef struct {	int	flag;	int	count;	int	next;	Off	addr[XFEN];} Xfree;staticvoidxaddfree(Device *dev, Off a, Superb *sb, Iobuf *p){	Xfree *x;	x = (Xfree*)p->iobuf;	if(x->count < XFEN) {		x->addr[x->count] = a;		x->count++;		return;	}	if(!x->flag) {		memset(&sb->fbuf, 0, sizeof(sb->fbuf));		sb->fbuf.free[0] = 0L;		sb->fbuf.nfree = 1;		sb->tfree = 0;		x->flag = 1;	}	addfree(dev, a, sb);}staticvoidxflush(Device *dev, Superb *sb, Iobuf *p){	int i;	Xfree *x;	x = (Xfree*)p->iobuf;	if(!x->flag) {		memset(&sb->fbuf, 0, sizeof(sb->fbuf));		sb->fbuf.free[0] = 0L;		sb->fbuf.nfree = 1;		sb->tfree = 0;	}	for(i=0; i<x->count; i++)		addfree(dev, x->addr[i], sb);}/* * make freelist * from existing freelist * (cw devices) */staticvoidtrfreelist(Superb *sb){	Off a, n;	int i;	Iobuf *p, *xp;	Fbuf *fb;	xp = getbuf(devnone, Cckbuf, 0);	memset(xp->iobuf, 0, BUFSIZE);	fb = &sb->fbuf;	p = 0;	for(;;) {		n = fb->nfree;		if(n < 0 || n > FEPERBUF)			break;		for(i=1; i<n; i++) {			a = fb->free[i];			if(a && !ftest(a))				xaddfree(dev, a, sb, xp);		}		a = fb->free[0];		if(!a)			break;		if(ftest(a))			break;		xaddfree(dev, a, sb, xp);		if(p)			putbuf(p);		p = xtag(a, Tfree, QPNONE);		if(!p)			break;		fb = (Fbuf*)p->iobuf;	}	if(p)		putbuf(p);	xflush(dev, sb, xp);	putbuf(xp);	mod++;	print("%lld blocks free\n", (Wideoff)sb->tfree);}staticvoidckfreelist(Superb *sb){	Off a, lo, hi;	int n, i;	Iobuf *p;	Fbuf *fb;	strcpy(name, "free list");	print("check %s\n", name);	fb = &sb->fbuf;	a = sbaddr;	p = 0;	lo = 0;	hi = 0;	for(;;) {		n = fb->nfree;		if(n < 0 || n > FEPERBUF) {			print("check: nfree bad %lld\n", (Wideoff)a);			break;		}		for(i=1; i<n; i++) {			a = fb->free[i];			if(a && !fmark(a)) {				if(!lo || lo > a)					lo = a;				if(!hi || hi < a)					hi = a;			}		}		a = fb->free[0];		if(!a)			break;		if(fmark(a))			break;		if(!lo || lo > a)			lo = a;		if(!hi || hi < a)			hi = a;		if(p)			putbuf(p);		p = xtag(a, Tfree, QPNONE);		if(!p)			break;		fb = (Fbuf*)p->iobuf;	}	if(p)		putbuf(p);	if (flags & Ctrim) {		fsize = hi--;		/* fsize = hi + 1 */		sb->fsize = fsize;		mod++;		print("set fsize to %lld\n", (Wideoff)fsize);	}	print("lo = %lld; hi = %lld\n", (Wideoff)lo, (Wideoff)hi);}/* * make freelist from scratch */staticvoidmkfreelist(Superb *sb){	Off a;	int i, b;	if(ronly) {		print("cant make freelist on ronly device\n");		return;	}	strcpy(name, "free list");	memset(&sb->fbuf, 0, sizeof(sb->fbuf));	sb->fbuf.free[0] = 0L;	sb->fbuf.nfree = 1;	sb->tfree = 0;	for(a=fsize-fstart-1; a >= 0; a--) {		i = a/8;		if(i < 0 || i >= sizabits)			continue;		b = 1 << (a&7);		if(abits[i] & b)			continue;		addfree(dev, fstart+a, sb);	}	print("%lld blocks free\n", (Wideoff)sb->tfree);	mod++;}staticDentry*maked(Off a, int s, Off qpath){	Iobuf *p;	Dentry *d, *d1;	p = xtag(a, Tdir, qpath);	if(!p)		return 0;	d = getdir(p, s);	d1 = malloc(sizeof(Dentry));	memmove(d1, d, sizeof(Dentry));	putbuf(p);	return d1;}staticvoidmodd(Off a, int s, Dentry *d1){	Iobuf *p;	Dentry *d;	if(!(flags & Cbad))		return;	p = getbuf(dev, a, Bread);	d = getdir(p, s);	if(!d) {		if(p)			putbuf(p);		return;	}	memmove(d, d1, sizeof(Dentry));	p->flags |= Bmod;	putbuf(p);}staticvoidxread(Off a, Off qpath){	Iobuf *p;	p = xtag(a, Tfile, qpath);	if(p)		putbuf(p);}staticIobuf*xtag(Off a, int tag, Off qpath){	Iobuf *p;	if(a == 0)		return 0;	p = getbuf(dev, a, Bread);	if(!p) {		print("check: \"%s\": xtag: p null\n", name);		if(flags & (Cream|Ctag)) {			p = getbuf(dev, a, Bmod);			if(p) {				memset(p->iobuf, 0, RBUFSIZE);				settag(p, tag, qpath);				mod++;				return p;			}		}		return 0;	}	if(checktag(p, tag, qpath)) {		print("check: \"%s\": xtag: checktag\n", name);		if(flags & (Cream|Ctag)) {			if(flags & Cream)				memset(p->iobuf, 0, RBUFSIZE);			settag(p, tag, qpath);			mod++;			return p;		}		return p;	}	return p;}staticintamark(Off a){	Off i;	int b;	if(a < fstart || a >= fsize) {		if(a == 0)			return 0;		print("check: \"%s\": range %lld\n",			name, (Wideoff)a);		nbad++;		return 1;	}	a -= fstart;	i = a/8;	b = 1 << (a&7);	if(abits[i] & b) {		if(!ronly) {			if(ndup < 10)				print("check: \"%s\": address dup %lld\n",					name, (Wideoff)fstart+a);			else			if(ndup == 10)				print("...");		}		ndup++;		return 1;	}	abits[i] |= b;	nused++;	return 0;}staticintfmark(Off a){	Off i;	int b;	if(a < fstart || a >= fsize) {		print("check: \"%s\": range %lld\n",			name, (Wideoff)a);		nbad++;		return 1;	}	a -= fstart;	i = a/8;	b = 1 << (a&7);	if(abits[i] & b) {		print("check: \"%s\": address dup %lld\n",			name, (Wideoff)fstart+a);		nfdup++;		return 1;	}	abits[i] |= b;	nfree++;	return 0;}staticintftest(Off a){	Off i;	int b;	if(a < fstart || a >= fsize)		return 1;	a -= fstart;	i = a/8;	b = 1 << (a&7);	if(abits[i] & b)		return 1;	abits[i] |= b;	return 0;}staticvoidmissing(void){	Off a, i;	int b, n;	n = 0;	for(a=fsize-fstart-1; a>=0; a--) {		i = a/8;		b = 1 << (a&7);		if(!(abits[i] & b)) {			print("missing: %lld\n", (Wideoff)fstart+a);			n++;		}		if(n > 10) {			print(" ...\n");			break;		}	}}staticvoidqmark(Off qpath){	int b;	Off i;	i = qpath/8;	b = 1 << (qpath&7);	if(i < 0 || i >= sizqbits) {		nqbad++;		if(nqbad < 20)			print("check: \"%s\": qid out of range %llux\n",				name, (Wideoff)qpath);		return;	}	if((qbits[i] & b) && !ronly) {		nqbad++;		if(nqbad < 20)			print("check: \"%s\": qid dup %llux\n", name,				(Wideoff)qpath);	}	qbits[i] |= b;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -