diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-11 10:17:17 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-11 10:17:17 +0200 |
commit | 0460e4be7d85168f52cf9f03a98448b6575fdc2b (patch) | |
tree | 73e0b5d6baea2e0d1bb3df47ace5965c1fd35719 | |
parent | 5982c50fa4d29c7b2230d180959c679278c6a88f (diff) | |
download | plan9front-0460e4be7d85168f52cf9f03a98448b6575fdc2b.tar.xz |
cwfs: add checktag() call for cache bucket in dumpblock(), fix error strings
-rw-r--r-- | sys/src/cmd/cwfs/cw.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/sys/src/cmd/cwfs/cw.c b/sys/src/cmd/cwfs/cw.c index bba69304c..dad3d5a38 100644 --- a/sys/src/cmd/cwfs/cw.c +++ b/sys/src/cmd/cwfs/cw.c @@ -170,7 +170,7 @@ cmd_statw(int, char*[]) p = getbuf(cw->cdev, CACHE_ADDR, Brd|Bres); if(!p || checktag(p, Tcache, QPSUPER)) { - print("cwstats: checktag c bucket\n"); + print("cwstats: checktag super\n"); if(p) putbuf(p); return; @@ -244,7 +244,7 @@ dumpblock(Device *dev) Cache *h; Centry *c, *ce, *bc; Bucket *b; - Off m, a, msize, maddr, wmax, caddr; + Off m, a, bn, msize, maddr, wmax, caddr; int s1, s2, count; Cw *cw; @@ -261,12 +261,19 @@ dumpblock(Device *dev) putbuf(cb); for(m=msize; m>=0; m--) { - a = cw->dbucket + 1; - if(a < 0 || a >= msize) - a = 0; - cw->dbucket = a; - p = getbuf(cw->cdev, maddr + a/BKPERBLK, Brd); - b = (Bucket*)p->iobuf + a%BKPERBLK; + bn = cw->dbucket + 1; + if(bn < 0 || bn >= msize) + bn = 0; + cw->dbucket = bn; + a = maddr + bn/BKPERBLK; + p = getbuf(cw->cdev, a, Brd); + if(!p || checktag(p, Tbuck, a)) { + fprint(2, "dump: checktag c bucket\n"); + if(p) + putbuf(p); + goto stop; + } + b = (Bucket*)p->iobuf + bn%BKPERBLK; ce = b->entry + CEPERBK; bc = 0; for(c = b->entry; c < ce; c++) @@ -301,16 +308,19 @@ dumpblock(Device *dev) found: if (conf.newcache) - a += (c - b->entry)*msize + caddr; + a = bn + (c - b->entry)*msize + caddr; else - a = a*CEPERBK + (c - b->entry) + caddr; + a = bn*CEPERBK + (c - b->entry) + caddr; p1 = getbuf(devnone, Cwdump1, 0); count = 0; retry: count++; - if(count > 10 || devread(cw->cdev, a, p1->iobuf)) + if(count > 10 || devread(cw->cdev, a, p1->iobuf)) { + putbuf(p1); + putbuf(p); goto stop; + } m = c->waddr; cw->daddr = m; s1 = devwrite(cw->wdev, m, p1->iobuf); @@ -368,8 +378,6 @@ stop1: return 1; stop: - putbuf(p1); - putbuf(p); fprint(2, "stopping dump!!\n"); cw->nodump = 1; return 0; @@ -419,6 +427,8 @@ cwinit(Device *dev) cw = dev->private; l = devsize(cw->wdev); cb = getbuf(cw->cdev, CACHE_ADDR, Brd|Bmod|Bres); + if(!cb || checktag(cb, Tcache, QPSUPER)) + panic("cwinit: checktag super"); h = (Cache*)cb->iobuf; h->toytime = toytime() + SECOND(30); h->time = time(nil); @@ -1705,7 +1715,7 @@ mvstates(Device *dev, int s1, int s2, int side) } cb = getbuf(cw->cdev, CACHE_ADDR, Brd|Bres); if(!cb || checktag(cb, Tcache, QPSUPER)) - panic("cwstats: checktag c bucket"); + panic("mvstates: checktag super"); h = (Cache*)cb->iobuf; msize = h->msize; maddr = h->maddr; @@ -1714,7 +1724,7 @@ mvstates(Device *dev, int s1, int s2, int side) for(m=0; m<msize; m++) { p = getbuf(cw->cdev, maddr + m/BKPERBLK, Brd|Bmod); if(!p || checktag(p, Tbuck, maddr + m/BKPERBLK)) - panic("cwtest: checktag c bucket"); + panic("mvstates: checktag c bucket"); b = (Bucket*)p->iobuf + m%BKPERBLK; ce = b->entry + CEPERBK; for(c=b->entry; c<ce; c++) @@ -1795,7 +1805,7 @@ storesb(Device *dev, Off last, int doit) ps = getbuf(devnone, Cwxx2, 0); if(!ps) { - fprint(2, "sbstore: getbuf\n"); + fprint(2, "storesb: getbuf\n"); return; } @@ -1825,7 +1835,7 @@ storesb(Device *dev, Off last, int doit) */ ph = getbuf(CDEV(dev), CACHE_ADDR, Brd|Bres); if(!ph || checktag(ph, Tcache, QPSUPER)) { - print("cwstats: checktag c bucket\n"); + print("storesb: checktag super\n"); if(ph) putbuf(ph); putbuf(ps); @@ -1887,7 +1897,7 @@ savecache(Device *dev) cdev = CDEV(dev); cb = getbuf(cdev, CACHE_ADDR, Brd|Bres); if(!cb || checktag(cb, Tcache, QPSUPER)) - panic("savecache: checktag c bucket"); + panic("savecache: checktag super"); h = (Cache*)cb->iobuf; msize = h->msize; maddr = h->maddr; @@ -1912,7 +1922,7 @@ savecache(Device *dev) } p = getbuf(cdev, maddr + m/BKPERBLK, Brd); if(!p || checktag(p, Tbuck, maddr + m/BKPERBLK)) - panic("cwtest: checktag c bucket"); + panic("savecache: checktag c bucket"); b = (Bucket*)p->iobuf + m%BKPERBLK; ce = b->entry + CEPERBK; for(c = b->entry; c < ce; c++) @@ -1980,7 +1990,7 @@ morecache(Device *dev, int dskno, Off size) p = getbuf(CDEV(dev), CACHE_ADDR, Brd|Bres); if(!p || checktag(p, Tcache, QPSUPER)) - panic("savecache: checktag c bucket"); + panic("morecache: checktag super"); h = (Cache*)p->iobuf; mm = h->wmax; putbuf(p); @@ -2069,7 +2079,7 @@ cwtest(Device*) cdev = CDEV(dev); cb = getbuf(cdev, CACHE_ADDR, Brd|Bres); if(!cb || checktag(cb, Tcache, QPSUPER)) - panic("cwstats: checktag c bucket"); + panic("cwtest: checktag super"); h = (Cache*)cb->iobuf; for(m=0; m<h->msize; m++) { p = getbuf(cdev, h->maddr + m/BKPERBLK, Brd|Bmod); |