/*
- * Copyright (c) 2000-2001 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
//
// If the disk is already full, don't bother.
//
- if (vcb->freeBlocks == 0) {
+ if (hfs_freeblks(VCBTOHFS(vcb), 0) == 0) {
err = dskFulErr;
goto Exit;
}
- if (forceContiguous && vcb->freeBlocks < minBlocks) {
+ if (forceContiguous && hfs_freeblks(VCBTOHFS(vcb), 0) < minBlocks) {
err = dskFulErr;
goto Exit;
}
//
if (forceContiguous) {
err = BlockAllocateContig(vcb, startingBlock, minBlocks, maxBlocks, actualStartBlock, actualNumBlocks);
+ /*
+ * If we allocated from a new position then
+ * also update the roving allocatior.
+ */
+ if ((err == noErr) && (*actualStartBlock > startingBlock))
+ vcb->nextAllocation = *actualStartBlock;
} else {
/*
* Scan the bitmap once, gather the N largest free extents, then
//
VCB_LOCK(vcb);
vcb->freeBlocks += numBlocks;
+ if (vcb->nextAllocation == (firstBlock + numBlocks))
+ vcb->nextAllocation -= numBlocks;
VCB_UNLOCK(vcb);
MarkVCBDirty(vcb);
if (bp) {
if (dirty) {
- bp->b_flags |= B_DIRTY;
bdwrite(bp);
} else {
brelse(bp);
stopBlock = endingBlock - minBlocks + 1;
currentBlock = startingBlock;
+ firstBlock = 0;
//
// Pre-read the first bitmap block.
bitMask = currentBlock & kBitsWithinWordMask;
if (bitMask)
{
- tempWord = *currentWord; // Fetch the current word only once
+ tempWord = SWAP_BE32(*currentWord); // Fetch the current word only once
bitMask = kHighBitInWordMask >> bitMask;
while (tempWord & bitMask)
{
}
// See if any of the bits are clear
- if ((tempWord=*currentWord) + 1) // non-zero if any bits were clear
+ if ((tempWord = SWAP_BE32(*currentWord)) + 1) // non-zero if any bits were clear
{
// Figure out which bit is clear
bitMask = kHighBitInWordMask;
bitMask = currentBlock & kBitsWithinWordMask;
if (bitMask)
{
- tempWord = *currentWord; // Fetch the current word only once
+ tempWord = SWAP_BE32(*currentWord); // Fetch the current word only once
bitMask = kHighBitInWordMask >> bitMask;
while (bitMask && !(tempWord & bitMask))
{
}
// See if any of the bits are set
- if ((tempWord=*currentWord) != 0)
+ if ((tempWord = SWAP_BE32(*currentWord)) != 0)
{
// Figure out which bit is set
bitMask = kHighBitInWordMask;