xref: /inferno-os/liblogfs/dump.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth #include "fcall.h"
537da2899SCharles.Forsyth 
637da2899SCharles.Forsyth typedef struct WalkState {
737da2899SCharles.Forsyth 	u32int *flashaddrp;
837da2899SCharles.Forsyth 	u32int *lengthp;
937da2899SCharles.Forsyth 	int i;
1037da2899SCharles.Forsyth 	int nth;
1137da2899SCharles.Forsyth } WalkState;
1237da2899SCharles.Forsyth 
1337da2899SCharles.Forsyth static int
walk(void * magic,Extent * e,int hole)1437da2899SCharles.Forsyth walk(void *magic, Extent *e, int hole)
1537da2899SCharles.Forsyth {
1637da2899SCharles.Forsyth 	WalkState *s = magic;
1737da2899SCharles.Forsyth 	USED(hole);
1837da2899SCharles.Forsyth 	if(s->i == s->nth) {
1937da2899SCharles.Forsyth 		*s->flashaddrp = e->flashaddr;
2037da2899SCharles.Forsyth 		*s->lengthp = e->max - e->min;
2137da2899SCharles.Forsyth 		return 0;
2237da2899SCharles.Forsyth 	}
2337da2899SCharles.Forsyth 	s->i++;
2437da2899SCharles.Forsyth 	return 1;
2537da2899SCharles.Forsyth }
2637da2899SCharles.Forsyth 
2737da2899SCharles.Forsyth char *
logfsserverreadpathextent(LogfsServer * server,u32int path,int nth,u32int * flashaddrp,u32int * lengthp,long * blockp,int * pagep,int * offsetp)2837da2899SCharles.Forsyth logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp,
2937da2899SCharles.Forsyth 	long *blockp, int *pagep, int *offsetp)
3037da2899SCharles.Forsyth {
3137da2899SCharles.Forsyth 	Entry *e;
3237da2899SCharles.Forsyth 	WalkState s;
3337da2899SCharles.Forsyth 	long index;
3437da2899SCharles.Forsyth 	e = logfspathmapfinde(server->pathmap, path);
3537da2899SCharles.Forsyth 	if(e == nil)
3637da2899SCharles.Forsyth 		return logfseunknownpath;
3737da2899SCharles.Forsyth 	if(e->perm & DMDIR)
3837da2899SCharles.Forsyth 		return Eisdir;
3937da2899SCharles.Forsyth 	s.flashaddrp = flashaddrp;
4037da2899SCharles.Forsyth 	s.lengthp = lengthp;
4137da2899SCharles.Forsyth 	s.i = 0;
4237da2899SCharles.Forsyth 	s.nth = nth;
4337da2899SCharles.Forsyth 	*lengthp = 0;
4437da2899SCharles.Forsyth 	logfsextentlistwalk(e->u.file.extent, walk, &s);
4537da2899SCharles.Forsyth 	if(*lengthp) {
4637da2899SCharles.Forsyth 		logfsflashaddr2spo(server, *flashaddrp, &index, pagep, offsetp);
4737da2899SCharles.Forsyth 		if(*flashaddrp & LogAddr)
4837da2899SCharles.Forsyth 			if(index >= server->activelog->unsweptblockindex)
4937da2899SCharles.Forsyth 				if(index <= server->activelog->curblockindex)
5037da2899SCharles.Forsyth 					*blockp = server->activelog->blockmap[index];
5137da2899SCharles.Forsyth 				else
5237da2899SCharles.Forsyth 					*blockp = -1;
5337da2899SCharles.Forsyth 			else if(server->sweptlog)
5437da2899SCharles.Forsyth 				if(index <= server->sweptlog->curblockindex)
5537da2899SCharles.Forsyth 					*blockp = server->sweptlog->blockmap[index];
5637da2899SCharles.Forsyth 				else
5737da2899SCharles.Forsyth 					*blockp = -1;
5837da2899SCharles.Forsyth 			else
5937da2899SCharles.Forsyth 				*blockp = -1;
6037da2899SCharles.Forsyth 		else if(index < server->ndatablocks)
6137da2899SCharles.Forsyth 			*blockp = server->datablock[index].block;
6237da2899SCharles.Forsyth 		else
6337da2899SCharles.Forsyth 			*blockp = -1;
6437da2899SCharles.Forsyth 	}
6537da2899SCharles.Forsyth 	else {
6637da2899SCharles.Forsyth 		*blockp = 0;
6737da2899SCharles.Forsyth 		*pagep = 0;
6837da2899SCharles.Forsyth 		*offsetp = 0;
6937da2899SCharles.Forsyth 	}
7037da2899SCharles.Forsyth 	return nil;
7137da2899SCharles.Forsyth }
72