xref: /inferno-os/liblogfs/findfreeblock.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "local.h"
4 
5 long
logfsfindfreeblock(LogfsLowLevel * ll,AllocReason reason)6 logfsfindfreeblock(LogfsLowLevel *ll, AllocReason reason)
7 {
8 	long b;
9 	long total;
10 	b = (*ll->findfreeblock)(ll, &total);
11 	if(b < 0)
12 		return b;
13 	switch(reason) {
14 	case AllocReasonReplace:
15 		break;
16 	case AllocReasonTransfer:
17 		if(total <= Replacements)
18 			return -1;
19 		break;
20 	case AllocReasonLogExtend:
21 		if(total <= Replacements + Transfers)
22 			return -1;
23 		break;
24 	case AllocReasonDataExtend:
25 		if(total <= Replacements + Transfers + LogSlack)
26 			return -1;
27 		break;
28 	}
29 //print("allocated free block %ld\n", b);
30 	return b;
31 }
32