Enhanced to specify number of arenas rather than size. Mutually exclusive, of course, with size specification. And the function used to translate from text to numeric is overkill, too. Notes: Wed Jun 16 13:26:06 EDT 2004 rsc I'm not going to apply this just yet, since I've more or less frozen the Venti source tree. When I bring in the new Venti code that I've been working on, I'll put this in. Russ Reference: /n/sources/patch/sorry/ventildr01 Date: Sat Oct 16 06:16:40 CES 2004 Reviewed-by: rsc --- /sys/src/cmd/venti/fmtarenas.c Sat Oct 16 06:16:40 2004 +++ /sys/src/cmd/venti/fmtarenas.c Sat Oct 16 06:16:40 2004 @@ -5,7 +5,7 @@ void usage(void) { - fprint(2, "usage: fmtarenas [-Z] [-b blocksize] [-a arenasize] name file\n"); + fprint(2, "usage: fmtarenas [-Z] [-b blocksize] [-a arenasize | -n arenanum] name file\n"); exits(0); } @@ -17,7 +17,7 @@ Arena *arena; u64int addr, limit, asize, apsize; char *file, *name, aname[ANameSize]; - int i, n, blockSize, tabSize, zero; + int i, anum, blockSize, tabSize, zero; fmtinstall('V', vtScoreFmt); fmtinstall('R', vtErrFmt); @@ -25,11 +25,14 @@ statsInit(); blockSize = 8 * 1024; - asize = 512 * 1024 *1024; + asize = 0; + anum = 0; tabSize = 64 * 1024; /* BUG: should be determine from number of arenas */ zero = 1; ARGBEGIN{ case 'a': + if (anum > 0) + usage(); asize = unittoull(ARGF()); if(asize == TWID64) usage(); @@ -43,6 +46,13 @@ exits("usage"); } break; + case 'n': + if (asize > 0) + usage(); + anum = unittoull(ARGF()); + if(anum == TWID64) + usage(); + break; case 'Z': zero = 0; break; @@ -72,17 +82,22 @@ fatal("can't initialize arena: %R"); apsize = ap->size - ap->arenaBase; - n = apsize / asize; + if (asize == 0 && anum == 0) + asize = 512 * 1024 * 1024; + if (anum == 0) + anum = apsize / asize; + else + asize = apsize / anum; fprint(2, "configuring %s with arenas=%d for a total storage of bytes=%lld and directory bytes=%d\n", - file, n, apsize, ap->tabSize); + file, anum, apsize, ap->tabSize); - ap->narenas = n; - ap->map = MKNZ(AMap, n); - ap->arenas = MKNZ(Arena*, n); + ap->narenas = anum; + ap->map = MKNZ(AMap, anum); + ap->arenas = MKNZ(Arena*, anum); addr = ap->arenaBase; - for(i = 0; i < n; i++){ + for(i = 0; i < anum; i++){ limit = addr + asize; snprint(aname, ANameSize, "%s%d", name, i); fprint(2, "adding arena %s at [%lld,%lld)\n", aname, addr, limit);