--- /n/sources/plan9/sys/src/cmd/fossil/cache.c Mon Nov 14 16:09:31 2016 +++ /sys/src/cmd/fossil/cache.c Tue Oct 6 12:00:00 2020 @@ -144,14 +144,13 @@ * Allocate the memory cache. */ Cache * -cacheAlloc(Disk *disk, VtConn *z, ulong nblocks, int mode) +cacheAlloc(Disk *disk, VtConn *z, uvlong nblocks, int mode) { - int i; + uvlong i, nbl; Cache *c; Block *b; BList *bl; u8int *p; - int nbl; c = vtmallocz(sizeof(Cache)); @@ -283,7 +282,6 @@ { u32int size, now; int i, k, refed; - static uchar zero[VtScoreSize]; Block *b; size = c->size; @@ -305,7 +303,7 @@ refed = 0; for(i = 0; i < c->nblocks; i++){ b = &c->blocks[i]; - if(b->data != &c->mem[i * size]) + if(b->data != &c->mem[(uintptr)i * size]) sysfatal("mis-blocked at %d", i); if(b->ref && b->heap == BadHeap){ refed++; @@ -851,7 +849,6 @@ *used = nused; *total = fl->end; qunlock(&fl->lk); - return; } static FreeList * @@ -1209,7 +1206,7 @@ fprint(2, "%s: %d:%x:%d iostate is %d in blockWrite\n", argv0, bb->part, bb->addr, bb->l.type, bb->iostate); /* probably BioWriting if it happens? */ - if(bb->iostate == BioClean){ + if(bb->iostate == BioClean) { blockPut(bb); goto ignblock; } --- /n/sources/plan9/sys/src/cmd/fossil/dat.h Mon Nov 14 16:09:31 2016 +++ /sys/src/cmd/fossil/dat.h Tue Oct 6 12:00:00 2020 @@ -59,6 +59,11 @@ UserTag = 32, /* all other tags should be >= UserTag */ }; +/* + * use of u32int for block numbers here limits fossil write buffer partitions + * to 32TB. using wider integers will invalidate any existing superblocks. + * see also superPack and superUnpack. + */ struct Super { u16int version; u32int epochLow; @@ -235,7 +240,7 @@ QLock lk; int part; - u32int addr; + u32int addr; /* should be uvlong */ uchar score[VtScoreSize]; /* score */ Label l; --- /n/sources/plan9/sys/src/cmd/fossil/file.c Wed Apr 7 19:24:25 2021 +++ /sys/src/cmd/fossil/file.c Wed Apr 28 12:00:00 2021 @@ -1569,7 +1569,7 @@ b = sourceBlock(ms, bo, OReadWrite); if(b == nil) goto Err; - sourceSetSize(ms, (nb+1)*ms->dsize); + sourceSetSize(ms, ((uvlong)nb+1)*ms->dsize); mbInit(&mb, b->data, ms->dsize, ms->dsize/BytesPerEntry); } --- /n/sources/plan9/sys/src/cmd/fossil/fns.h Mon Nov 14 16:09:31 2016 +++ /sys/src/cmd/fossil/fns.h Tue Oct 6 12:00:00 2020 @@ -18,7 +18,7 @@ void sourceUnlock(Source*); Block* cacheAllocBlock(Cache*, int, u32int, u32int, u32int); -Cache* cacheAlloc(Disk*, VtConn*, ulong, int); +Cache* cacheAlloc(Disk*, VtConn*, uvlong, int); void cacheCountUsed(Cache*, u32int, u32int*, u32int*, u32int*); int cacheDirty(Cache*); void cacheFlush(Cache*, int); --- /n/sources/plan9/sys/src/cmd/fossil/fs.c Mon Nov 14 16:09:31 2016 +++ /sys/src/cmd/fossil/fs.c Tue Oct 6 12:00:00 2020 @@ -8,7 +8,7 @@ static void snapClose(Snap*); Fs * -fsOpen(char *file, VtConn *z, long ncache, int mode) +fsOpen(char *file, VtConn *z, vlong ncache, int mode) { int fd, m; uchar oscore[VtScoreSize]; @@ -432,7 +432,6 @@ return 0; } - if(0) fprint(2, "%s: snapshot root from %d to %d\n", argv0, oldaddr, b->addr); entryPack(&e, b->data, 1); blockDirty(b); @@ -451,6 +450,8 @@ super.active = b->addr; if(doarchive) super.next = oldaddr; + if(0) fprint(2, "%s: snapshot root from %d to %d\n", + argv0, oldaddr, b->addr); /* * Record that the new super.active can't get written out until --- /n/sources/plan9/sys/src/cmd/fossil/fs.h Mon Nov 14 16:09:31 2016 +++ /sys/src/cmd/fossil/fs.h Tue Oct 6 12:00:00 2020 @@ -26,7 +26,7 @@ int fsEpochLow(Fs*, u32int); File *fsGetRoot(Fs*); int fsHalt(Fs*); -Fs *fsOpen(char*, VtConn*, long, int); +Fs *fsOpen(char*, VtConn*, vlong, int); int fsRedial(Fs*, char*); void fsSnapshotCleanup(Fs*, u32int); int fsSnapshot(Fs*, char*, char*, int);