From 0460e4be7d85168f52cf9f03a98448b6575fdc2b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 11 Oct 2013 10:17:17 +0200 Subject: cwfs: add checktag() call for cache bucket in dumpblock(), fix error strings --- sys/src/cmd/cwfs/cw.c | 52 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'sys/src/cmd/cwfs/cw.c') 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; mcdev, 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; ciobuf; 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; mmsize; m++) { p = getbuf(cdev, h->maddr + m/BKPERBLK, Brd|Bmod); -- cgit v1.2.3