]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/cwfs/cw.c
cwfs: fix interpretation of startdump argument
[plan9front.git] / sys / src / cmd / cwfs / cw.c
index dad3d5a38b0835e5f00bee13fbf361efd34b31e4..49d8924d9c7b0c2b8b65a3654e1f3d4ff8f67387 100644 (file)
@@ -55,6 +55,7 @@ struct        Cw
  * following are cached variables for dumps
  */
        Off     fsize;
+       Off     wsize;
        Off     ndump;
        int     depth;
        int     all;            /* local flag to recur on modified dirs */
@@ -400,7 +401,7 @@ cwinit1(Device *dev)
                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;
@@ -440,6 +441,7 @@ cwinit(Device *dev)
                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);
@@ -768,8 +770,10 @@ cwgrow(Device *dev, Superb *sb, int)
        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;
@@ -1259,6 +1263,10 @@ split(Cw *cw, Iobuf *p, Off addr)
 
        case Cdump1:
        case Cwrite:
+               /* worm full */
+               if(cw->fsize >= cw->wsize)
+                       break;
+
                /*
                 * botch.. could be done by relabeling
                 */
@@ -1269,9 +1277,7 @@ split(Cw *cw, Iobuf *p, Off addr)
                                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);
@@ -1305,11 +1311,11 @@ isdirty(Cw *cw, Iobuf *p, Off addr, int tag)
 }
 
 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;
@@ -1367,14 +1373,16 @@ cwrecur(Cw *cw, Off addr, int tag, int tag1, long qp)
                        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) {
@@ -1523,6 +1531,11 @@ cfsdump(Filsys *fs)
        h->cwraddr = rba;
        putbuf(p);
 
+       if(cw->fsize+50 > cw->wsize){
+               fprint(2, "dump: worm full after dump\n");
+               goto done;
+       }
+
        /*
         * ro root
         */
@@ -1642,8 +1655,7 @@ found:
        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;
 
@@ -1667,6 +1679,7 @@ found:
        h->sbaddr = sba;
        putbuf(p);
 
+done:
        rewalk(cw);
        sync("all done");
 
@@ -2268,8 +2281,9 @@ cmd_cwcmd(int argc, char *argv[])
                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