xref: /inferno-os/liblogfs/findfreeblock.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth 
537da2899SCharles.Forsyth long
logfsfindfreeblock(LogfsLowLevel * ll,AllocReason reason)637da2899SCharles.Forsyth logfsfindfreeblock(LogfsLowLevel *ll, AllocReason reason)
737da2899SCharles.Forsyth {
837da2899SCharles.Forsyth 	long b;
937da2899SCharles.Forsyth 	long total;
1037da2899SCharles.Forsyth 	b = (*ll->findfreeblock)(ll, &total);
1137da2899SCharles.Forsyth 	if(b < 0)
1237da2899SCharles.Forsyth 		return b;
1337da2899SCharles.Forsyth 	switch(reason) {
1437da2899SCharles.Forsyth 	case AllocReasonReplace:
1537da2899SCharles.Forsyth 		break;
1637da2899SCharles.Forsyth 	case AllocReasonTransfer:
1737da2899SCharles.Forsyth 		if(total <= Replacements)
1837da2899SCharles.Forsyth 			return -1;
1937da2899SCharles.Forsyth 		break;
2037da2899SCharles.Forsyth 	case AllocReasonLogExtend:
2137da2899SCharles.Forsyth 		if(total <= Replacements + Transfers)
2237da2899SCharles.Forsyth 			return -1;
2337da2899SCharles.Forsyth 		break;
2437da2899SCharles.Forsyth 	case AllocReasonDataExtend:
2537da2899SCharles.Forsyth 		if(total <= Replacements + Transfers + LogSlack)
2637da2899SCharles.Forsyth 			return -1;
2737da2899SCharles.Forsyth 		break;
2837da2899SCharles.Forsyth 	}
2937da2899SCharles.Forsyth //print("allocated free block %ld\n", b);
3037da2899SCharles.Forsyth 	return b;
3137da2899SCharles.Forsyth }
32