1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include "logfsos.h"
- #include "logfs.h"
- #include "local.h"
- #include "fcall.h"
- typedef struct WalkState {
- u32int *flashaddrp;
- u32int *lengthp;
- int i;
- int nth;
- } WalkState;
- static int
- walk(void *magic, Extent *e, int hole)
- {
- WalkState *s = magic;
- USED(hole);
- if(s->i == s->nth) {
- *s->flashaddrp = e->flashaddr;
- *s->lengthp = e->max - e->min;
- return 0;
- }
- s->i++;
- return 1;
- }
- char *
- logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp,
- long *blockp, int *pagep, int *offsetp)
- {
- Entry *e;
- WalkState s;
- long index;
- e = logfspathmapfinde(server->pathmap, path);
- if(e == nil)
- return logfseunknownpath;
- if(e->perm & DMDIR)
- return Eisdir;
- s.flashaddrp = flashaddrp;
- s.lengthp = lengthp;
- s.i = 0;
- s.nth = nth;
- *lengthp = 0;
- logfsextentlistwalk(e->u.file.extent, walk, &s);
- if(*lengthp) {
- logfsflashaddr2spo(server, *flashaddrp, &index, pagep, offsetp);
- if(*flashaddrp & LogAddr)
- if(index >= server->activelog->unsweptblockindex)
- if(index <= server->activelog->curblockindex)
- *blockp = server->activelog->blockmap[index];
- else
- *blockp = -1;
- else if(server->sweptlog)
- if(index <= server->sweptlog->curblockindex)
- *blockp = server->sweptlog->blockmap[index];
- else
- *blockp = -1;
- else
- *blockp = -1;
- else if(index < server->ndatablocks)
- *blockp = server->datablock[index].block;
- else
- *blockp = -1;
- }
- else {
- *blockp = 0;
- *pagep = 0;
- *offsetp = 0;
- }
- return nil;
- }
|