]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/hfs/hfscommon/BTree/BTree.c
xnu-792.6.22.tar.gz
[apple/xnu.git] / bsd / hfs / hfscommon / BTree / BTree.c
index f11af332afca5e58f0b6370b45c36881c771476c..9920c87422c2c7a5d2ee18e5fd398fcf8fbd1437 100644 (file)
@@ -315,15 +315,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 +333,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);
        }
 
@@ -1286,15 +1283,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;