code: mafs

ref: e5fae21d7c28103cbd4d5414538f18a448a60766
dir: /extents.h/

View raw version

/*
 * an ordered linked list sorted by block number (->low, ->high).
 * ->big or ->small sorted by size and then block number.
 */
typedef struct Extent Extent;
typedef struct Extents Extents;

/*
When allocating blocks from extents:
1. Of all the extents with the len we need, pick the extent with the lowest blkno.
2. If no extent of the len we need is available, then break up the smallest extent.
*/
struct Extent {
	struct Extent *low, *high;	/* sorted by start */
	u64 start;					/* where this extent starts from */
	u64 len; 					/* how many units in this extent */

	/* circular least recently used linked list limited to Nlru items */
	struct Extent *prev, *next;
};
struct Extents {
	Extent *head;	/* find the first block in a jiffy */
	QLock lck;
	u32 n;			/* number of extents */
	Rendez isempty; /* fully used, nothing available */

	u8 nlru;		/* number of items in the lru linked list */
	Extent *lru;	/* least recently used extent in the circular lru linked list */
	char name[32];

	void (*flush)(void);
};

extern int chatty9p;
void	*emalloc(u32 sz);
s8	*estrdup(s8 *s);
void	panic(char *fmt, ...);
s8	find(Extents *es, u64 bno);
Extent *add(Extents *es, u64 blkno, u64 len);

void	showblocknos(int fd, Extents *es);
void	showextents(int fd, char *msg, Extents *es);
s32	sizeofextents(Extents *es);
s32	saveextents(Extents *es, s8 *buf, u32 nbuf);
s32	loadextents(Extents *es, s8 *buf, u32 nbuf);

u64	 balloc(Extents *es, u64 len);
void bfree(Extents *es, u64 blkno, u64 len);
u64	 nfrees(Extents *es);

Extent *lowest(Extents *es);
void	initextents(Extents *es, char *name, void (*flush)(void));