rem: if (uint32(start + numBlocks) > fNumBits) { FATAL(("Allocation::Free(): tried to free too many blocks: %u (numBlocks = %lu)!\n", numBlocks, fNumBits)); DIE(("Allocation::Free(): tried to free too many blocks"));
add: if (fFirstFree > start) fFirstFree = start; fFreeBits += length;  Volume *volume = transaction.GetVolume();   uint32 bitsPerBlock = volume->BlockSize() << 3; uint32 block = start / bitsPerBlock; start = start % bitsPerBlock;  AllocationBlock cached(volume);  while (length > 0) { if (cached.SetToWritable(transaction, *this, block) < B_OK) RETURN_ERROR(B_IO_ERROR);  uint16 freeLength = length; if (uint32(start + length) > cached.NumBlockBits()) freeLength = cached.NumBlockBits() - start;  cached.Free(start, freeLength);  length -= freeLength; start = 0; block++;
context: AllocationBlock::Free(uint16 start, uint16 numBlocks){	ASSERT(start < fNumBits);	ASSERT(uint32(start + numBlocks) <= fNumBits);	if (uint32(start + numBlocks) > fNumBits) {		FATAL(("Allocation::Free(): tried to free too many blocks: %u (numBlocks = %lu)!\n", numBlocks, fNumBits));		DIE(("Allocation::Free(): tried to free too many blocks"));	}	int32 block = start >> 5;	while (numBlocks > 0) {		uint32 mask = 0;		for (int32 i = start % 32; i < 32 && numBlocks; i++, numBlocks--)			mask |= 1UL << (i % 32);		Block(block++) &= HOST_ENDIAN_TO_BFS_INT32(~mask);		start = 0;	}}