xref: /inferno-os/liblogfs/dump.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
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