ref: d3d1b3b47ff80f451c6c9f8b7f1262fef6545f2b
dir: /liblogfs/dump.c/
#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;
}