diff options
-rw-r--r-- | include/venti.h | 41 | ||||
-rw-r--r-- | src/libventi/cache.c | 7 | ||||
-rw-r--r-- | src/libventi/entry.c | 14 | ||||
-rw-r--r-- | src/libventi/file.c | 32 | ||||
-rw-r--r-- | src/libventi/mkfile | 1 | ||||
-rw-r--r-- | src/libventi/packet.c | 22 |
6 files changed, 64 insertions, 53 deletions
diff --git a/include/venti.h b/include/venti.h index a828101a..557d2420 100644 --- a/include/venti.h +++ b/include/venti.h @@ -22,9 +22,9 @@ int packetconsume(Packet*, uchar *buf, int n); int packettrim(Packet*, int offset, int n); uchar *packetheader(Packet*, int n); uchar *packettrailer(Packet*, int n); -int packetprefix(Packet*, uchar *buf, int n); -int packetappend(Packet*, uchar *buf, int n); -int packetconcat(Packet*, Packet*); +void packetprefix(Packet*, uchar *buf, int n); +void packetappend(Packet*, uchar *buf, int n); +void packetconcat(Packet*, Packet*); uchar *packetpeek(Packet*, uchar *buf, int offset, int n); int packetcopy(Packet*, uchar *buf, int offset, int n); int packetfragments(Packet*, IOchunk*, int nio, int offset); @@ -43,7 +43,6 @@ void packetsha1(Packet*, uchar sha1[20]); */ typedef struct VtFcall VtFcall; -typedef struct VtSha1 VtSha1; typedef struct VtConn VtConn; typedef struct VtEntry VtEntry; typedef struct VtRoot VtRoot; @@ -85,6 +84,7 @@ enum VtMaxType, VtTypeDepthMask = 7, + VtTypeBaseMask = ~VtTypeDepthMask, }; /* convert to/from on-disk type numbers */ @@ -97,9 +97,9 @@ uint vtfromdisktype(uint); enum { VtEntryActive = 1<<0, /* entry is in use */ - VtEntryDir = 1<<1, /* a directory */ - VtEntryDepthShift = 2, /* shift for pointer depth */ - VtEntryDepthMask = 7<<2, /* mask for pointer depth */ + _VtEntryDir = 1<<1, /* a directory */ + _VtEntryDepthShift = 2, /* shift for pointer depth */ + _VtEntryDepthMask = 7<<2, /* mask for pointer depth */ VtEntryLocal = 1<<5, /* for local storage only */ }; enum @@ -152,7 +152,7 @@ uint vtzerotruncate(int type, uchar *buf, uint n); /* * parse score: mungs s */ -int vtparsescore(char *s, uint len, char **prefix, uchar[VtScoreSize]); +int vtparsescore(char *s, char **prefix, uchar[VtScoreSize]); /* * formatting @@ -384,11 +384,30 @@ u32int vtcacheblocksize(VtCache*); int vtblockwrite(VtBlock*); VtBlock *vtblockcopy(VtBlock*); void vtblockduplock(VtBlock*); +int vtblockdirty(VtBlock*); /* * Hash tree file tree. */ typedef struct VtFile VtFile; +struct VtFile +{ + QLock lk; + int ref; + int local; + VtBlock *b; /* block containing this file */ + uchar score[VtScoreSize]; /* score of block containing this file */ + +/* immutable */ + VtCache *c; + int mode; + u32int gen; + int dsize; + int dir; + VtFile *parent; + int epb; /* entries per block in parent */ + u32int offset; /* entry offset in parent */ +}; enum { @@ -403,13 +422,13 @@ VtFile *vtfilecreateroot(VtCache*, int psize, int dsize, int type); VtFile *vtfileopen(VtFile*, u32int, int); VtFile *vtfilecreate(VtFile*, int psize, int dsize, int dir); VtBlock *vtfileblock(VtFile*, u32int, int mode); -int vtfileblockhash(VtFile*, u32int, uchar[VtScoreSize]); long vtfileread(VtFile*, void*, long, vlong); long vtfilewrite(VtFile*, void*, long, vlong); int vtfileflush(VtFile*); void vtfileincref(VtFile*); void vtfileclose(VtFile*); int vtfilegetentry(VtFile*, VtEntry*); +int vtfilesetentry(VtFile*, VtEntry*); int vtfileblockscore(VtFile*, u32int, uchar[VtScoreSize]); u32int vtfilegetdirsize(VtFile*); int vtfilesetdirsize(VtFile*, u32int); @@ -417,6 +436,10 @@ void vtfileunlock(VtFile*); int vtfilelock(VtFile*, int); int vtfilelock2(VtFile*, VtFile*, int); int vtfileflushbefore(VtFile*, u64int); +int vtfiletruncate(VtFile*); +uvlong vtfilegetsize(VtFile*); +int vtfilesetsize(VtFile*, uvlong); +int vtfileremove(VtFile*); #if defined(__cplusplus) } diff --git a/src/libventi/cache.c b/src/libventi/cache.c index ed8a7f2f..dff32cd6 100644 --- a/src/libventi/cache.c +++ b/src/libventi/cache.c @@ -558,3 +558,10 @@ vtglobaltolocal(uchar score[VtScoreSize]) return NilBlock; return (score[16]<<24)|(score[17]<<16)|(score[18]<<8)|score[19]; } + +int +vtblockdirty(VtBlock *b) +{ + return 0; +} + diff --git a/src/libventi/entry.c b/src/libventi/entry.c index 59c09e9a..ca1d2009 100644 --- a/src/libventi/entry.c +++ b/src/libventi/entry.c @@ -31,10 +31,10 @@ vtentrypack(VtEntry *e, uchar *p, int index) U16PUT(p, e->dsize); p += 2; depth = e->type&VtTypeDepthMask; - flags = (e->flags&~(VtEntryDir|VtEntryDepthShift)); - flags |= depth << VtEntryDepthShift; - if(e->type - depth == VtEntryDir) - flags |= VtEntryDir; + flags = (e->flags&~(_VtEntryDir|_VtEntryDepthMask)); + flags |= depth << _VtEntryDepthShift; + if(e->type - depth == VtDirType) + flags |= _VtEntryDir; U8PUT(p, flags); p++; memset(p, 0, 5); @@ -62,9 +62,9 @@ vtentryunpack(VtEntry *e, uchar *p, int index) e->dsize = U16GET(p); p += 2; e->flags = U8GET(p); - e->type = (e->flags&VtEntryDir) ? VtDirType : VtDataType; - e->type += (e->flags & VtEntryDepthMask) >> VtEntryDepthShift; - e->flags &= ~(VtEntryDir|VtEntryDepthMask); + e->type = (e->flags&_VtEntryDir) ? VtDirType : VtDataType; + e->type += (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift; + e->flags &= ~(_VtEntryDir|_VtEntryDepthMask); p++; p += 5; e->size = U48GET(p); diff --git a/src/libventi/file.c b/src/libventi/file.c index 40484117..655b3891 100644 --- a/src/libventi/file.c +++ b/src/libventi/file.c @@ -21,25 +21,6 @@ enum MaxBlock = (1UL<<31), }; -struct VtFile -{ - QLock lk; - int ref; - int local; - VtBlock *b; /* block containing this file */ - uchar score[VtScoreSize]; /* score of block containing this file */ - -/* immutable */ - VtCache *c; - int mode; - u32int gen; - int dsize; - int dir; - VtFile *parent; - int epb; /* entries per block in parent */ - u32int offset; /* entry offset in parent */ -}; - static char EBadEntry[] = "bad VtEntry"; static char ENotDir[] = "walk in non-directory"; static char ETooBig[] = "file too big"; @@ -109,7 +90,7 @@ vtfilealloc(VtCache *c, VtBlock *b, VtFile *p, u32int offset, int mode) r->mode = mode; r->dsize = e.dsize; r->gen = e.gen; - r->dir = (e.flags & VtEntryDir) != 0; + r->dir = (e.type & VtTypeBaseMask) == VtDirType; r->ref = 1; r->parent = p; if(p){ @@ -169,8 +150,7 @@ vtfilecreateroot(VtCache *c, int psize, int dsize, int type) e.flags = VtEntryActive; e.psize = psize; e.dsize = dsize; - if(type == VtDirType) - e.flags |= VtEntryDir; + e.type = type; memmove(e.score, vtzeroscore, VtScoreSize); return vtfileopenroot(c, &e); @@ -679,13 +659,15 @@ static int mkindices(VtEntry *e, u32int bn, int *index) { int i, np; + u32int obn; + obn = bn; memset(index, 0, VtPointerDepth*sizeof(int)); np = e->psize/VtScoreSize; for(i=0; bn > 0; i++){ if(i >= VtPointerDepth){ - werrstr(EBadAddr); + werrstr("bad address 0x%lux", (ulong)bn); return -1; } index[i] = bn % np; @@ -715,7 +697,7 @@ vtfileblock(VtFile *r, u32int bn, int mode) return nil; if(i > DEPTH(e.type)){ if(mode == VtOREAD){ - werrstr(EBadAddr); + werrstr("bad address 0x%lux", (ulong)bn); goto Err; } index[i] = 0; @@ -746,7 +728,7 @@ Err: } int -vtfileblockhash(VtFile *r, u32int bn, uchar score[VtScoreSize]) +vtfileblockscore(VtFile *r, u32int bn, uchar score[VtScoreSize]) { VtBlock *b, *bb; int index[VtPointerDepth+1]; diff --git a/src/libventi/mkfile b/src/libventi/mkfile index 735e1e3c..24a80aa1 100644 --- a/src/libventi/mkfile +++ b/src/libventi/mkfile @@ -17,6 +17,7 @@ OFILES=\ hangup.$O\ mem.$O\ packet.$O\ + parsescore.$O\ queue.$O\ root.$O\ rpc.$O\ diff --git a/src/libventi/packet.c b/src/libventi/packet.c index c781eb39..7ca6be86 100644 --- a/src/libventi/packet.c +++ b/src/libventi/packet.c @@ -113,7 +113,7 @@ packetalloc(void) p->last = nil; p->next = nil; -if(1)fprint(2, "packetalloc %p from %08lux %08lux %08lux\n", p, *((uint*)&p+2), *((uint*)&p+3), *((uint*)&p+4)); +if(0)fprint(2, "packetalloc %p from %08lux %08lux %08lux\n", p, *((uint*)&p+2), *((uint*)&p+3), *((uint*)&p+4)); return p; } @@ -123,7 +123,7 @@ packetfree(Packet *p) { Frag *f, *ff; -if(1)fprint(2, "packetfree %p from %08lux\n", p, getcallerpc(&p)); +if(0)fprint(2, "packetfree %p from %08lux\n", p, getcallerpc(&p)); if(p == nil) return; @@ -237,7 +237,7 @@ packetconsume(Packet *p, uchar *buf, int n) { NOTFREE(p); if(buf && packetcopy(p, buf, 0, n) < 0) - return 0; + return -1; return packettrim(p, n, p->size-n); } @@ -371,7 +371,7 @@ packettrailer(Packet *p, int n) return f->rp; } -int +void packetprefix(Packet *p, uchar *buf, int n) { Frag *f; @@ -380,7 +380,7 @@ packetprefix(Packet *p, uchar *buf, int n) NOTFREE(p); if(n <= 0) - return 0; + return; p->size += n; @@ -410,10 +410,9 @@ packetprefix(Packet *p, uchar *buf, int n) n -= nn; memmove(f->rp, buf+n, nn); } - return 0; } -int +void packetappend(Packet *p, uchar *buf, int n) { Frag *f; @@ -422,7 +421,7 @@ packetappend(Packet *p, uchar *buf, int n) NOTFREE(p); if(n <= 0) - return 0; + return; p->size += n; /* try and fix in current frag */ @@ -455,16 +454,16 @@ packetappend(Packet *p, uchar *buf, int n) buf += nn; n -= nn; } - return 0; + return; } -int +void packetconcat(Packet *p, Packet *pp) { NOTFREE(p); NOTFREE(pp); if(pp->size == 0) - return 0; + return; p->size += pp->size; p->asize += pp->asize; @@ -477,7 +476,6 @@ packetconcat(Packet *p, Packet *pp) pp->asize = 0; pp->first = nil; pp->last = nil; - return 0; } uchar * |