URI: 
       tallow fixarenas of single arena file - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit c482feff4bc6002f0c1373a8d41e04f86dda5a21
   DIR parent 1d53bf4a03cc30b2204ff0286dd71ee97d467458
  HTML Author: rsc <devnull@localhost>
       Date:   Thu,  3 May 2007 03:14:02 +0000
       
       allow fixarenas of single arena file
       
       Diffstat:
         M src/cmd/venti/srv/fixarenas.c       |      30 ++++++++++++++++++++++++------
       
       1 file changed, 24 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/src/cmd/venti/srv/fixarenas.c b/src/cmd/venti/srv/fixarenas.c
       t@@ -650,7 +650,16 @@ showdiffs(uchar *want, uchar *have, int len, Info *info)
                }
        }
        
       -static int tabsizes[] = { 64*1024, 512*1024, };
       +/*
       + * Does part begin with an arena?
       + */
       +int
       +isonearena(void)
       +{
       +        return u32(pagein(0, Block)) == ArenaHeadMagic;
       +}
       +
       +static int tabsizes[] = { 16*1024, 64*1024, 512*1024, };
        /*
         * Poke around on the disk to guess what the ArenaPart numbers are.
         */
       t@@ -808,7 +817,6 @@ guessgeometry(void)
                        u32(p)!=ArenaHeadMagic ? " (but no arena head there)" : "");
        
                ap.tabsize = ap.arenabase - ap.tabbase;
       -        
        }
        
        /*
       t@@ -1078,6 +1086,8 @@ okayname(char *name, int n)
                if(nameok(name) < 0)
                        return 0;
                sprint(buf, "%d", n);
       +        if(n == 0)
       +                buf[0] = 0;
                if(strlen(name) < strlen(buf) 
                || strcmp(name+strlen(name)-strlen(buf), buf) != 0)
                        return 0;
       t@@ -1201,9 +1211,12 @@ print("old arena: sealed=%d\n", oarena.diskstats.sealed);
                }
                if(arena->version == 0)
                        arena->version = ArenaVersion5;
       -        if(basename)
       -                snprint(arena->name, ANameSize, "%s%d", basename, anum);
       -        else if(lastbase[0])
       +        if(basename){
       +                if(anum == -1)
       +                        snprint(arena->name, ANameSize, "%s", basename);
       +                else
       +                        snprint(arena->name, ANameSize, "%s%d", basename, anum);
       +        }else if(lastbase[0])
                        snprint(arena->name, ANameSize, "%s%d", lastbase, anum);
                else if(head->name[0])
                        strcpy(arena->name, head->name);
       t@@ -1382,7 +1395,7 @@ guessarena(vlong offset0, int anum, ArenaHead *head, Arena *arena,
                                }
        
                                if(haveclump(cl.info.score))
       -                                print("warning: duplicate clump %d %V\n", cl.info.type, cl.info.score);
       +                                print("warning: duplicate clump %d %V at %#llux+%#d\n", cl.info.type, cl.info.score, offset, n);
        
                                /*
                                 * If clumps use different magic numbers, we don't care.
       t@@ -1538,6 +1551,7 @@ guessarena(vlong offset0, int anum, ArenaHead *head, Arena *arena,
                eci = bci+clumps+1;
                bcit = cibuf;
                ecit = cibuf+ncibuf;
       +        
                smart = 1;
        Again:
                nbad = 0;
       t@@ -1886,6 +1900,10 @@ threadmain(int argc, char **argv)
                        sysfatal("can't open %s: %r", file);
                partend = part->size;
                
       +        if(isonearena()){
       +                checkarena(0, -1);
       +                threadexitsall(nil);
       +        }
                checkarenas(argc > 1 ? argv[1] : nil);
                checkmap();
                threadexitsall(nil);