shithub: riscv

Download patch

ref: 0460e4be7d85168f52cf9f03a98448b6575fdc2b
parent: 5982c50fa4d29c7b2230d180959c679278c6a88f
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Oct 11 06:17:17 EDT 2013

cwfs: add checktag() call for cache bucket in dumpblock(), fix error strings

--- a/sys/src/cmd/cwfs/cw.c
+++ b/sys/src/cmd/cwfs/cw.c
@@ -170,7 +170,7 @@
 
 	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 @@
 	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 @@
 	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 @@
 
 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 @@
 	return 1;
 
 stop:
-	putbuf(p1);
-	putbuf(p);
 	fprint(2, "stopping dump!!\n");
 	cw->nodump = 1;
 	return 0;
@@ -419,6 +427,8 @@
 	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 @@
 	}
 	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 @@
 	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 @@
 
 	ps = getbuf(devnone, Cwxx2, 0);
 	if(!ps) {
-		fprint(2, "sbstore: getbuf\n");
+		fprint(2, "storesb: getbuf\n");
 		return;
 	}
 
@@ -1825,7 +1835,7 @@
 	 */
 	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 @@
 	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 @@
 		}
 		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 @@
 
 	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 @@
 	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);
--