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
walk(void * magic,Extent * e,int hole)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 *
logfsserverreadpathextent(LogfsServer * server,u32int path,int nth,u32int * flashaddrp,u32int * lengthp,long * blockp,int * pagep,int * offsetp)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