X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d7e50217d7adf6e52786a38bcaa4cd698cb9a79e..ff6e181ae92fc6f1e89841290f461d1f2f9badd9:/bsd/hfs/hfscommon/BTree/BTreeScanner.c diff --git a/bsd/hfs/hfscommon/BTree/BTreeScanner.c b/bsd/hfs/hfscommon/BTree/BTreeScanner.c index a406754bf..696ea9962 100644 --- a/bsd/hfs/hfscommon/BTree/BTreeScanner.c +++ b/bsd/hfs/hfscommon/BTree/BTreeScanner.c @@ -1,10 +1,8 @@ /* - * Copyright (c) 1996-2002 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1996-2005 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -25,6 +23,7 @@ * @(#)BTreeScanner.c */ #include +#include "../../hfs_endian.h" #include "../headers/BTreeScanner.h" @@ -142,7 +141,9 @@ int BTScanNextRecord( BTScanState * scanState, static int FindNextLeafNode( BTScanState *scanState, Boolean avoidIO ) { - int err; + int err; + BlockDescriptor block; + FileReference fref; err = noErr; // Assume everything will be OK @@ -182,12 +183,23 @@ static int FindNextLeafNode( BTScanState *scanState, Boolean avoidIO ) (u_int8_t *) scanState->currentNodePtr += scanState->btcb->nodeSize; } - // Make sure this is a valid node - if ( CheckNode( scanState->btcb, scanState->currentNodePtr ) != noErr ) - { + /* Fake a BlockDescriptor */ + block.blockHeader = NULL; /* No buffer cache buffer */ + block.buffer = scanState->currentNodePtr; + block.blockNum = scanState->nodeNum; + block.blockSize = scanState->btcb->nodeSize; + block.blockReadFromDisk = 1; + block.isModified = 0; + + fref = scanState->btcb->fileRefNum; + + /* This node was read from disk, so it must be swapped/checked. */ + err = hfs_swap_BTNode(&block, fref, kSwapBTNodeBigToHost); + if ( err != noErr ) { + printf("FindNextLeafNode: Error from hfs_swap_BTNode (node %u)\n", scanState->nodeNum); continue; } - + if ( scanState->currentNodePtr->kind == kBTLeafNode ) break; } @@ -215,7 +227,7 @@ static int ReadMultipleNodes( BTScanState *theScanStatePtr ) { int myErr = E_NONE; BTreeControlBlockPtr myBTreeCBPtr; - daddr_t myPhyBlockNum; + daddr64_t myPhyBlockNum; u_int32_t myBufferSize; struct vnode * myDevPtr; int myBlockRun; @@ -224,8 +236,8 @@ static int ReadMultipleNodes( BTScanState *theScanStatePtr ) // release old buffer if we have one if ( theScanStatePtr->bufferPtr != NULL ) { - theScanStatePtr->bufferPtr->b_flags |= (B_INVAL | B_AGE); - brelse( theScanStatePtr->bufferPtr ); + buf_markinvalid(theScanStatePtr->bufferPtr); + buf_brelse( theScanStatePtr->bufferPtr ); theScanStatePtr->bufferPtr = NULL; theScanStatePtr->currentNodePtr = NULL; } @@ -233,8 +245,8 @@ static int ReadMultipleNodes( BTScanState *theScanStatePtr ) myBTreeCBPtr = theScanStatePtr->btcb; // map logical block in catalog btree file to physical block on volume - myErr = VOP_BMAP( myBTreeCBPtr->fileRefNum, theScanStatePtr->nodeNum, - &myDevPtr, &myPhyBlockNum, &myBlockRun ); + myErr = hfs_bmap(myBTreeCBPtr->fileRefNum, theScanStatePtr->nodeNum, + &myDevPtr, &myPhyBlockNum, &myBlockRun); if ( myErr != E_NONE ) { goto ExitThisRoutine; @@ -251,18 +263,18 @@ static int ReadMultipleNodes( BTScanState *theScanStatePtr ) } // now read blocks from the device - myErr = bread( myDevPtr, - myPhyBlockNum, - myBufferSize, - NOCRED, - &theScanStatePtr->bufferPtr ); + myErr = (int)buf_bread(myDevPtr, + myPhyBlockNum, + myBufferSize, + NOCRED, + &theScanStatePtr->bufferPtr ); if ( myErr != E_NONE ) { goto ExitThisRoutine; } - theScanStatePtr->nodesLeftInBuffer = theScanStatePtr->bufferPtr->b_bcount / theScanStatePtr->btcb->nodeSize; - theScanStatePtr->currentNodePtr = (BTNodeDescriptor *) theScanStatePtr->bufferPtr->b_data; + theScanStatePtr->nodesLeftInBuffer = buf_count(theScanStatePtr->bufferPtr) / theScanStatePtr->btcb->nodeSize; + theScanStatePtr->currentNodePtr = (BTNodeDescriptor *) buf_dataptr(theScanStatePtr->bufferPtr); ExitThisRoutine: return myErr; @@ -342,7 +354,7 @@ int BTScanInitialize( const FCB * btreeFile, scanState->currentNodePtr = NULL; scanState->nodesLeftInBuffer = 0; // no nodes currently in buffer scanState->recordsFound = recordsFound; - scanState->startTime = time; // initialize our throttle + microuptime(&scanState->startTime); // initialize our throttle return noErr; @@ -376,8 +388,8 @@ int BTScanTerminate( BTScanState * scanState, if ( scanState->bufferPtr != NULL ) { - scanState->bufferPtr->b_flags |= (B_INVAL | B_AGE); - brelse( scanState->bufferPtr ); + buf_markinvalid(scanState->bufferPtr); + buf_brelse( scanState->bufferPtr ); scanState->bufferPtr = NULL; scanState->currentNodePtr = NULL; }