> I've been running a vac-based backup on a few unix systems for a while > now. A bit over a week ago, one of them started failing with this > error: > > vac: vtcachelocal: asked for block #6289076; only 6288808 > blocks > [...] > > If a new cache block must be allocated... but the cache is > filled... > the > library prints the score and reference count of every block in > the > cache > and then aborts.
i mention this because it sounds so similar to a bug i found in ken's fs. i hope this is useful, but it probablly isn't. if you change an indirect block but not a direct block, it's possible to miss dumping the direct block if that block doesn't happen to be cached. this is because the test was from cw.c:/^isdirty if(tag >= Tind1 && tag <= Tmaxind) /* botch, get these modified */ if(s != Cnone) return 1; but i found that this is safer: /* * botch: we should mark the parents of modified * indirect blocks as split-on-dump. */ if(tag >= Tind1 && tag <= Tmaxind) return 2; a better solution would be to do as the comment suggests. i think that vac cache.c:/^lumpWalk makes the same sort of determination about these lines (from the plan 9 version) cache.c:623,626 if(0)fprint(2, "lumpWalk: %V:%s %d:%d-> %V:%d\n", u->score, lumpState(u->state), u->type, offset, score, type); v = cacheGetLump(c, score, type, size); if(v == nil) return nil; - erik