📄 chk.c
字号:
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 + -