1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth #include "fcall.h"
537da2899SCharles.Forsyth
637da2899SCharles.Forsyth typedef struct WalkState {
737da2899SCharles.Forsyth u32int *flashaddrp;
837da2899SCharles.Forsyth u32int *lengthp;
937da2899SCharles.Forsyth int i;
1037da2899SCharles.Forsyth int nth;
1137da2899SCharles.Forsyth } WalkState;
1237da2899SCharles.Forsyth
1337da2899SCharles.Forsyth static int
walk(void * magic,Extent * e,int hole)1437da2899SCharles.Forsyth walk(void *magic, Extent *e, int hole)
1537da2899SCharles.Forsyth {
1637da2899SCharles.Forsyth WalkState *s = magic;
1737da2899SCharles.Forsyth USED(hole);
1837da2899SCharles.Forsyth if(s->i == s->nth) {
1937da2899SCharles.Forsyth *s->flashaddrp = e->flashaddr;
2037da2899SCharles.Forsyth *s->lengthp = e->max - e->min;
2137da2899SCharles.Forsyth return 0;
2237da2899SCharles.Forsyth }
2337da2899SCharles.Forsyth s->i++;
2437da2899SCharles.Forsyth return 1;
2537da2899SCharles.Forsyth }
2637da2899SCharles.Forsyth
2737da2899SCharles.Forsyth char *
logfsserverreadpathextent(LogfsServer * server,u32int path,int nth,u32int * flashaddrp,u32int * lengthp,long * blockp,int * pagep,int * offsetp)2837da2899SCharles.Forsyth logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp,
2937da2899SCharles.Forsyth long *blockp, int *pagep, int *offsetp)
3037da2899SCharles.Forsyth {
3137da2899SCharles.Forsyth Entry *e;
3237da2899SCharles.Forsyth WalkState s;
3337da2899SCharles.Forsyth long index;
3437da2899SCharles.Forsyth e = logfspathmapfinde(server->pathmap, path);
3537da2899SCharles.Forsyth if(e == nil)
3637da2899SCharles.Forsyth return logfseunknownpath;
3737da2899SCharles.Forsyth if(e->perm & DMDIR)
3837da2899SCharles.Forsyth return Eisdir;
3937da2899SCharles.Forsyth s.flashaddrp = flashaddrp;
4037da2899SCharles.Forsyth s.lengthp = lengthp;
4137da2899SCharles.Forsyth s.i = 0;
4237da2899SCharles.Forsyth s.nth = nth;
4337da2899SCharles.Forsyth *lengthp = 0;
4437da2899SCharles.Forsyth logfsextentlistwalk(e->u.file.extent, walk, &s);
4537da2899SCharles.Forsyth if(*lengthp) {
4637da2899SCharles.Forsyth logfsflashaddr2spo(server, *flashaddrp, &index, pagep, offsetp);
4737da2899SCharles.Forsyth if(*flashaddrp & LogAddr)
4837da2899SCharles.Forsyth if(index >= server->activelog->unsweptblockindex)
4937da2899SCharles.Forsyth if(index <= server->activelog->curblockindex)
5037da2899SCharles.Forsyth *blockp = server->activelog->blockmap[index];
5137da2899SCharles.Forsyth else
5237da2899SCharles.Forsyth *blockp = -1;
5337da2899SCharles.Forsyth else if(server->sweptlog)
5437da2899SCharles.Forsyth if(index <= server->sweptlog->curblockindex)
5537da2899SCharles.Forsyth *blockp = server->sweptlog->blockmap[index];
5637da2899SCharles.Forsyth else
5737da2899SCharles.Forsyth *blockp = -1;
5837da2899SCharles.Forsyth else
5937da2899SCharles.Forsyth *blockp = -1;
6037da2899SCharles.Forsyth else if(index < server->ndatablocks)
6137da2899SCharles.Forsyth *blockp = server->datablock[index].block;
6237da2899SCharles.Forsyth else
6337da2899SCharles.Forsyth *blockp = -1;
6437da2899SCharles.Forsyth }
6537da2899SCharles.Forsyth else {
6637da2899SCharles.Forsyth *blockp = 0;
6737da2899SCharles.Forsyth *pagep = 0;
6837da2899SCharles.Forsyth *offsetp = 0;
6937da2899SCharles.Forsyth }
7037da2899SCharles.Forsyth return nil;
7137da2899SCharles.Forsyth }
72