1 #include "logfsos.h" 2 #include "logfs.h" 3 #include "local.h" 4 #include "fcall.h" 5 6 typedef struct WalkState { 7 u32int *flashaddrp; 8 u32int *lengthp; 9 int i; 10 int nth; 11 } WalkState; 12 13 static int 14 walk(void *magic, Extent *e, int hole) 15 { 16 WalkState *s = magic; 17 USED(hole); 18 if(s->i == s->nth) { 19 *s->flashaddrp = e->flashaddr; 20 *s->lengthp = e->max - e->min; 21 return 0; 22 } 23 s->i++; 24 return 1; 25 } 26 27 char * 28 logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp, 29 long *blockp, int *pagep, int *offsetp) 30 { 31 Entry *e; 32 WalkState s; 33 long index; 34 e = logfspathmapfinde(server->pathmap, path); 35 if(e == nil) 36 return logfseunknownpath; 37 if(e->perm & DMDIR) 38 return Eisdir; 39 s.flashaddrp = flashaddrp; 40 s.lengthp = lengthp; 41 s.i = 0; 42 s.nth = nth; 43 *lengthp = 0; 44 logfsextentlistwalk(e->u.file.extent, walk, &s); 45 if(*lengthp) { 46 logfsflashaddr2spo(server, *flashaddrp, &index, pagep, offsetp); 47 if(*flashaddrp & LogAddr) 48 if(index >= server->activelog->unsweptblockindex) 49 if(index <= server->activelog->curblockindex) 50 *blockp = server->activelog->blockmap[index]; 51 else 52 *blockp = -1; 53 else if(server->sweptlog) 54 if(index <= server->sweptlog->curblockindex) 55 *blockp = server->sweptlog->blockmap[index]; 56 else 57 *blockp = -1; 58 else 59 *blockp = -1; 60 else if(index < server->ndatablocks) 61 *blockp = server->datablock[index].block; 62 else 63 *blockp = -1; 64 } 65 else { 66 *blockp = 0; 67 *pagep = 0; 68 *offsetp = 0; 69 } 70 return nil; 71 } 72