* following are cached variables for dumps
*/
Off fsize;
+ Off wsize;
Off ndump;
int depth;
int all; /* local flag to recur on modified dirs */
roflag = flag_install("ro", "-- ro reads and writes");
first = 1;
}
- cw = malloc(sizeof(Cw));
+ cw = ialloc(sizeof(Cw), 0);
dev->private = cw;
cw->allflag = 0;
h->wsize = l;
cb->flags |= Bmod;
}
+ cw->wsize = l;
for(m=0; m<h->msize; m++) {
p = getbuf(cw->cdev, h->maddr + m/BKPERBLK, Brd);
h = (Cache*)cb->iobuf;
ws = h->wsize;
fs = h->fsize;
- if(fs >= ws)
+ if(fs >= ws){
+ putbuf(cb);
return 0;
+ }
nfs = fs + ADDFREE;
if(nfs >= ws)
nfs = ws;
case Cdump1:
case Cwrite:
+ /* worm full */
+ if(cw->fsize >= cw->wsize)
+ break;
+
/*
* botch.. could be done by relabeling
*/
break;
}
}
-
- na = cw->fsize;
- cw->fsize = na+1;
+ na = cw->fsize++;
cwio(cw->dev, na, 0, Ogrow);
cwio(cw->dev, na, p->iobuf, Owrite);
cwio(cw->dev, na, 0, Odump);
}
Off
-cwrecur(Cw *cw, Off addr, int tag, int tag1, long qp)
+cwrecur(Cw *cw, Off addr, int tag, int tag1, Off qp)
{
Iobuf *p;
Dentry *d;
- long qp1;
+ Off qp1;
int i, j, shouldstop;
Off na;
char *np;
d = getdir(p, i);
if((d->mode & (DALLOC|DTMP)) != DALLOC)
continue;
- qp1 = d->qid.path & ~QPDIR;
if(np)
strncpy(np, d->name, NAMELEN);
else if(i > 0)
fprint(2, "cwrecur: root with >1 directory\n");
+ qp1 = d->qid.path;
tag1 = Tfile;
- if(d->mode & DDIR)
+ if(d->mode & DDIR){
+ qp1 ^= QPDIR;
tag1 = Tdir;
+ }
for(j=0; j<NDBLOCK; j++) {
na = d->dblock[j];
if(na) {
h->cwraddr = rba;
putbuf(p);
+ if(cw->fsize+50 > cw->wsize){
+ fprint(2, "dump: worm full after dump\n");
+ goto done;
+ }
+
/*
* ro root
*/
s = (Superb*)p->iobuf;
s->last = a;
sba = s->next;
- s->next = cw->fsize;
- cw->fsize++;
+ s->next = cw->fsize++;
s->fsize = cw->fsize;
s->roraddr = roa;
h->sbaddr = sba;
putbuf(p);
+done:
rewalk(cw);
sync("all done");
blockcmp(dev, s1, s2);
} else if(strcmp(arg, "startdump") == 0) {
if(argc > 2)
- cw->nodump = number(argv[2], 0, 10);
- cw->nodump = !cw->nodump;
+ cw->nodump = !number(argv[2], 0, 10);
+ else
+ cw->nodump = !cw->nodump;
if(cw->nodump)
print("dump stopped\n");
else