xref: /inferno-os/libnandfs/findfreeblock.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "nandfs.h"
437da2899SCharles.Forsyth #include "local.h"
537da2899SCharles.Forsyth 
637da2899SCharles.Forsyth long
nandfsfindfreeblock(Nandfs * nandfs,long * freeblocksp)737da2899SCharles.Forsyth nandfsfindfreeblock(Nandfs *nandfs, long *freeblocksp)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth 	long bestnewblock;
1037da2899SCharles.Forsyth 	long bestnerase;
1137da2899SCharles.Forsyth 	long i;
1237da2899SCharles.Forsyth 
1337da2899SCharles.Forsyth 	if (freeblocksp)
1437da2899SCharles.Forsyth 		*freeblocksp = 0;
1537da2899SCharles.Forsyth 	for (i = 0, bestnewblock = -1, bestnerase = 0x7fffffff; i < nandfs->ll.blocks; i++) {
1637da2899SCharles.Forsyth 		long nerase;
1737da2899SCharles.Forsyth 		if (nandfsgettag(nandfs, i) == LogfsTnone) {
1837da2899SCharles.Forsyth 			if (freeblocksp) {
1937da2899SCharles.Forsyth 				(*freeblocksp)++;
2037da2899SCharles.Forsyth 			}
2137da2899SCharles.Forsyth 			if ((nerase = nandfsgetnerase(nandfs, i)) < bestnerase) {
2237da2899SCharles.Forsyth 				bestnewblock = i;
2337da2899SCharles.Forsyth 				bestnerase = nerase;
2437da2899SCharles.Forsyth 			}
2537da2899SCharles.Forsyth 		}
2637da2899SCharles.Forsyth 	}
2737da2899SCharles.Forsyth 	return bestnewblock;
2837da2899SCharles.Forsyth }
29