rem: if (uint32(start + numBlocks) > fNumBits) { FATAL(("Allocation::Allocate(): tried to allocate too many blocks: %u (numBlocks = %lu)!\n", numBlocks, fNumBits)); DIE(("Allocation::Allocate(): tried to allocate too many blocks"));
add: if (start == fFirstFree) fFirstFree = start + length; 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);  uint32 numBlocks = length; if (start + numBlocks > cached.NumBlockBits()) numBlocks = cached.NumBlockBits() - start;  cached.Allocate(start, numBlocks);  length -= numBlocks; start = 0; block++;
context: AllocationBlock::Allocate(uint16 start, uint16 numBlocks){	ASSERT(start < fNumBits);	ASSERT(uint32(start + numBlocks) <= fNumBits);	if (uint32(start + numBlocks) > fNumBits) {		FATAL(("Allocation::Allocate(): tried to allocate too many blocks: %u (numBlocks = %lu)!\n", numBlocks, fNumBits));		DIE(("Allocation::Allocate(): tried to allocate 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);#ifdef DEBUG		// check for already set blocks		if (HOST_ENDIAN_TO_BFS_INT32(mask) & ((uint32 *)fBlock)[block]) {			FATAL(("AllocationBlock::Allocate(): some blocks are already allocated, start = %u, numBlocks = %u\n", start, numBlocks));			DEBUGGER(("blocks already set!"));		}#endif		Block(block++) |= HOST_ENDIAN_TO_BFS_INT32(mask);		start = 0;	}}