X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/e5568f75972dfc723778653c11cb6b4dc825716a..8f6c56a50524aa785f7e596d52dddfb331e18961:/bsd/hfs/hfscommon/BTree/BTree.c diff --git a/bsd/hfs/hfscommon/BTree/BTree.c b/bsd/hfs/hfscommon/BTree/BTree.c index dc6c30940..a1334a712 100644 --- a/bsd/hfs/hfscommon/BTree/BTree.c +++ b/bsd/hfs/hfscommon/BTree/BTree.c @@ -1,23 +1,29 @@ /* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * 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 + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* File: BTree.c @@ -315,15 +321,12 @@ OSStatus BTOpenPath(FCB *filePtr, KeyCompareProcPtr keyCompareProc) } } - // if nodeSize Matches then we don't need to release, just CheckNode - if ( btreePtr->nodeSize == nodeRec.blockSize ) - { - err = CheckNode (btreePtr, nodeRec.buffer); - if (err) - VTOVCB(btreePtr->fileRefNum)->vcbFlags |= kHFS_DamagedVolume; - M_ExitOnError (err); - } - else + /* + * If the actual node size is different than the amount we read, + * then release and trash this block, and re-read with the correct + * node size. + */ + if ( btreePtr->nodeSize != nodeRec.blockSize ) { err = SetBTreeBlockSize (btreePtr->fileRefNum, btreePtr->nodeSize, 32); M_ExitOnError (err); @@ -336,7 +339,7 @@ OSStatus BTOpenPath(FCB *filePtr, KeyCompareProcPtr keyCompareProc) ++btreePtr->numReleaseNodes; M_ExitOnError (err); - err = GetNode (btreePtr, kHeaderNodeNum, &nodeRec ); // calls CheckNode... + err = GetNode (btreePtr, kHeaderNodeNum, &nodeRec ); M_ExitOnError (err); } @@ -1120,7 +1123,7 @@ ProcessData: } while (err == 0) { - if (callBackProc(keyPtr, recordPtr, len, callBackState) == 0) + if (callBackProc(keyPtr, recordPtr, callBackState) == 0) break; if ((index+1) < ((NodeDescPtr)node.buffer)->numRecords) { @@ -1286,15 +1289,19 @@ OSStatus BTInsertRecord (FCB *filePtr, goto ErrorExit; } - err = UpdateNode (btreePtr, &nodeRec, 0, kLockTransaction); - M_ExitOnError (err); - - // update BTreeControlBlock + /* + * Update the B-tree control block. Do this before + * calling UpdateNode since it will compare the node's + * height with treeDepth. + */ btreePtr->treeDepth = 1; btreePtr->rootNode = insertNodeNum; btreePtr->firstLeafNode = insertNodeNum; btreePtr->lastLeafNode = insertNodeNum; + err = UpdateNode (btreePtr, &nodeRec, 0, kLockTransaction); + M_ExitOnError (err); + M_BTreeHeaderDirty (btreePtr); goto Success; @@ -1548,7 +1555,7 @@ BTUpdateRecord(FCB *filePtr, BTreeIterator *iterator, btreePtr = (BTreeControlBlockPtr) filePtr->fcbBTCBPtr; - REQUIRE_FILE_LOCK(btreePtr->fileRefNum, false); + REQUIRE_FILE_LOCK(btreePtr->fileRefNum, true); ////////////////////////////// Take A Hint ////////////////////////////////// @@ -1571,7 +1578,7 @@ BTUpdateRecord(FCB *filePtr, BTreeIterator *iterator, // XXXdbg ModifyBlockStart(btreePtr->fileRefNum, &nodeRec); - err = callBackProc(keyPtr, recordPtr, recordLen, callBackState); + err = callBackProc(keyPtr, recordPtr, callBackState); M_ExitOnError (err); err = UpdateNode (btreePtr, &nodeRec, 0, 0); @@ -1606,7 +1613,7 @@ BTUpdateRecord(FCB *filePtr, BTreeIterator *iterator, // XXXdbg ModifyBlockStart(btreePtr->fileRefNum, &nodeRec); - err = callBackProc(keyPtr, recordPtr, recordLen, callBackState); + err = callBackProc(keyPtr, recordPtr, callBackState); M_ExitOnError (err); err = UpdateNode (btreePtr, &nodeRec, 0, 0); @@ -1786,7 +1793,7 @@ OSStatus BTFlushPath (FCB *filePtr) M_ReturnErrorIf (btreePtr == nil, fsBTInvalidFileErr); - REQUIRE_FILE_LOCK(btreePtr->fileRefNum, false); + REQUIRE_FILE_LOCK(btreePtr->fileRefNum, true); err = UpdateHeader (btreePtr, false);