Lines Matching refs:hfsmp

365 static int hfs_track_unmap_blocks (struct hfsmount *hfsmp, u_int32_t offset, 
368 static int hfs_issue_unmap (struct hfsmount *hfsmp, struct jnl_trim_list *list);
370 static int hfs_alloc_scan_block(struct hfsmount *hfsmp,
376 int hfs_isallocated_scan (struct hfsmount *hfsmp,
410 hfs_isrbtree_allocated (struct hfsmount * hfsmp,
416 hfs_validate_rbtree (struct hfsmount *hfsmp,
420 static void hfs_checktreelinks (struct hfsmount *hfsmp);
423 void check_rbtree_extents (struct hfsmount *hfsmp,
434 static void remove_free_extent_cache(struct hfsmount *hfsmp, u_int32_t startBlock, u_int32_t blockCount);
435 static Boolean add_free_extent_cache(struct hfsmount *hfsmp, u_int32_t startBlock, u_int32_t blockCount);
436 static void sanity_check_free_ext(struct hfsmount *hfsmp, int check_allocated);
445 int trim_validate_bitmap (struct hfsmount *hfsmp);
446 int trim_validate_bitmap (struct hfsmount *hfsmp) {
456 if (hfsmp->jnl) {
457 struct journal *jnl = (struct journal*)hfsmp->jnl;
463 blockno_offset = blockno_offset - (uint64_t)hfsmp->hfsPlusIOPosOffset;
464 blockno_offset = blockno_offset / hfsmp->blockSize;
465 numblocks = trim->extents[i].length / hfsmp->blockSize;
469 err = hfs_count_allocated (hfsmp, startblk, blks, &alloccount);
499 ; hfsmp - The volume containing the allocation blocks.
504 static void hfs_unmap_free_extent(struct hfsmount *hfsmp, u_int32_t startingBlock, u_int32_t numBlocks)
515 if (hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
516 panic("hfs: %p: (%u,%u) unmapping allocated blocks", hfsmp, startingBlock, numBlocks);
520 if (hfsmp->jnl != NULL) {
521 device_sz = hfsmp->hfs_logical_bytes;
522 offset = (u_int64_t) startingBlock * hfsmp->blockSize + (u_int64_t) hfsmp->hfsPlusIOPosOffset;
523 length = (u_int64_t) numBlocks * hfsmp->blockSize;
532 err = journal_trim_add_extent(hfsmp->jnl, offset, length);
566 ; hfsmp - The volume containing the allocation blocks.
572 static int hfs_track_unmap_blocks (struct hfsmount *hfsmp, u_int32_t start,
579 if ((hfsmp->hfs_flags & HFS_UNMAP) && (hfsmp->jnl != NULL)) {
581 offset = (u_int64_t) start * hfsmp->blockSize + (u_int64_t) hfsmp->hfsPlusIOPosOffset;
582 length = (u_int64_t) numBlocks * hfsmp->blockSize;
589 error = hfs_issue_unmap (hfsmp, list);
604 ; hfsmp - The volume containing the allocation blocks.
609 static int hfs_issue_unmap (struct hfsmount *hfsmp, struct jnl_trim_list *list) {
619 error = VNOP_IOCTL(hfsmp->hfs_devvp, DKIOCUNMAP, (caddr_t)&unmap, 0, vfs_context_kernel());
640 ; hfsmp - The volume containing the allocation blocks.
645 static void hfs_unmap_alloc_extent(struct hfsmount *hfsmp, u_int32_t startingBlock, u_int32_t numBlocks)
654 if (hfsmp->jnl != NULL) {
655 offset = (u_int64_t) startingBlock * hfsmp->blockSize + (u_int64_t) hfsmp->hfsPlusIOPosOffset;
656 length = (u_int64_t) numBlocks * hfsmp->blockSize;
658 err = journal_trim_remove_extent(hfsmp->jnl, offset, length);
702 struct hfsmount *hfsmp = arg;
709 startBlock = (extents[i].offset - hfsmp->hfsPlusIOPosOffset) / hfsmp->blockSize;
710 numBlocks = extents[i].length / hfsmp->blockSize;
711 (void) add_free_extent_cache(hfsmp, startBlock, numBlocks);
729 ; hfsmp - The volume containing the allocation blocks.
734 u_int32_t UnmapBlocks (struct hfsmount *hfsmp) {
759 while ((blocks_scanned < hfsmp->totalBlocks) && (error == 0)){
760 error = hfs_alloc_scan_block (hfsmp, blocks_scanned, hfsmp->totalBlocks,
768 hfs_issue_unmap(hfsmp, &trimlist);
829 struct hfsmount *hfsmp;
866 hfsmp = VCBTOHFS (vcb);
867 freeBlocks = hfs_freeblks(hfsmp, 0);
974 if (hfsmp->extent_tree_flags & HFS_ALLOC_RB_ACTIVE) {
975 hfsmp->extent_tree_flags |= HFS_ALLOC_RB_ERRORED;
976 DestroyTrees(hfsmp);
977 ResetVCBFreeExtCache(hfsmp);
1039 lck_spin_lock(&hfsmp->vcbFreeExtLock);
1043 lck_spin_unlock(&hfsmp->vcbFreeExtLock);
1056 (void) remove_free_extent_cache(hfsmp, *actualStartBlock, *actualNumBlocks);
1075 if (*actualStartBlock >= hfsmp->totalBlocks) {
1078 if (*actualStartBlock >= hfsmp->allocLimit) {
1082 if ((*actualStartBlock + *actualNumBlocks) >= hfsmp->totalBlocks) {
1086 if ((*actualStartBlock + *actualNumBlocks) >= hfsmp->allocLimit) {
1127 struct hfsmount *hfsmp;
1128 hfsmp = VCBTOHFS(vcb);
1143 if (firstBlock >= hfsmp->totalBlocks) {
1147 if ((firstBlock + numBlocks) >= hfsmp->totalBlocks) {
1207 if (hfsmp->jnl == NULL) {
1306 struct hfsmount *hfsmp = VCBTOHFS(vcb);
1308 if ((hfsmp->hfs_flags & HFS_METADATA_ZONE) == 0)
1313 if ((bit >= hfsmp->hfs_metazone_start) &&
1314 (bit <= hfsmp->hfs_metazone_end)) {
1315 bit = hfsmp->hfs_metazone_end + 1;
1421 struct hfsmount *hfsmp = VCBTOHFS(vcb);
1423 if (hfsmp->jnl) {
1424 journal_modify_block_end(hfsmp->jnl, bp, NULL, NULL);
1584 struct hfsmount *hfsmp = VCBTOHFS(vcb);
1602 node = extent_tree_off_search_next(&hfsmp->offset_tree, &search_sentinel);
1620 if (hfs_isallocated(hfsmp, *actualStartBlock, *actualNumBlocks)) {
1636 if (!hfs_isallocated(hfsmp, *actualStartBlock, *actualNumBlocks)) {
1659 search_sentinel.offset = hfsmp->hfs_metazone_end;
1664 node = extent_tree_off_search_next(&hfsmp->offset_tree, &search_sentinel);
1671 node = extent_tree_off_search_nextWithSize (&hfsmp->offset_tree, &search_sentinel);
1686 metaend_node = extent_tree_off_search_prev(&hfsmp->offset_tree, &search_sentinel);
1688 if ((metaend_node) && (metaend_node->offset < hfsmp->hfs_metazone_end)) {
1690 if (node_end > hfsmp->hfs_metazone_end) {
1691 u_int32_t modified_length = node_end - hfsmp->hfs_metazone_end;
1697 tempnode.offset = hfsmp->hfs_metazone_end;
1711 node = extent_tree_off_search_nextWithSize (&hfsmp->offset_tree, &search_sentinel);
1729 if (!hfs_isallocated(hfsmp, *actualStartBlock, *actualNumBlocks)) {
1751 hfsmp->vcbVN, node, startingBlock, minBlocks, maxBlocks);
1754 extent_tree_offset_print(&hfsmp->offset_tree);
1757 hfsmp->vcbVN, minBlocks, maxBlocks);
1885 struct hfsmount *hfsmp = VCBTOHFS(vcb);
1999 if (hfsmp->jnl) {
2000 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2047 if (hfsmp->jnl) {
2048 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2196 struct hfsmount *hfsmp;
2198 hfsmp = VCBTOHFS(vcb);
2200 if (hfs_isrbtree_active(hfsmp)) {
2203 if ((startingBlock >= hfsmp->offset_block_end) &&
2204 (hfsmp->hfs_flags & HFS_RESIZE_IN_PROGRESS)) {
2215 REQUIRE_FILE_LOCK(hfsmp->hfs_allocation_vp, false);
2216 if (!hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2220 check_rbtree_extents (hfsmp, startingBlock, numBlocks, ASSERT_ALLOC);
2271 struct hfsmount *hfsmp = VCBTOHFS(vcb);
2299 if (hfsmp->jnl) {
2300 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2347 if (hfsmp->jnl) {
2348 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2385 if (hfsmp->jnl) {
2386 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2430 struct hfsmount *hfsmp = VCBTOHFS(vcb);
2436 if (hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2448 if (!hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2457 rb_err = extent_tree_offset_alloc_space(&hfsmp->offset_tree, numBlocks, startingBlock);
2472 node = extent_tree_off_search_prev(&hfsmp->offset_tree, &search_sentinel);
2475 rb_err = extent_tree_offset_alloc_unaligned (&hfsmp->offset_tree, numBlocks, startingBlock);
2498 hfsmp->extent_tree_flags |= HFS_ALLOC_RB_ERRORED;
2499 DestroyTrees(hfsmp);
2501 ResetVCBFreeExtCache(hfsmp);
2525 struct hfsmount *hfsmp;
2526 hfsmp = VCBTOHFS(vcb);
2528 if (hfs_isrbtree_active(hfsmp)) {
2531 if ((startingBlock >= hfsmp->offset_block_end) &&
2532 (hfsmp->hfs_flags & HFS_RESIZE_IN_PROGRESS)) {
2543 REQUIRE_FILE_LOCK(hfsmp->hfs_allocation_vp, false);
2544 if (hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2548 check_rbtree_extents (hfsmp, startingBlock, numBlocks, ASSERT_FREE);
2587 struct hfsmount *hfsmp = VCBTOHFS(vcb);
2593 bitsPerBlock = hfsmp->vcbVBMIOSize * kBitsPerByte;
2635 if (hfs_isallocated(hfsmp, startingBlock, curNumBlocks) == true) {
2690 struct hfsmount *hfsmp = VCBTOHFS(vcb);
2718 if (hfsmp->jnl) {
2719 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2796 if (hfsmp->jnl) {
2797 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2833 if (hfsmp->jnl) {
2834 journal_modify_block_start(hfsmp->jnl, (struct buf *)blockRef);
2916 struct hfsmount *hfsmp = VCBTOHFS(vcb);
2921 if (!hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2937 if ((startingBlock >= hfsmp->offset_block_end) &&
2938 (hfsmp->hfs_flags & HFS_RESIZE_IN_PROGRESS)) {
2950 if (hfs_isallocated(hfsmp, startingBlock, numBlocks)) {
2956 if ((hfsmp->extent_tree_flags & HFS_ALLOC_RB_ACTIVE) == 0) {
2957 if (startingBlock >= hfsmp->offset_block_end) {
2969 newnode = extent_tree_free_space(&hfsmp->offset_tree, numBlocks, startingBlock);
2985 * back off, destroy the trees, and persistently set a bit in the runtime hfsmp flags
2990 hfsmp->extent_tree_flags |= HFS_ALLOC_RB_ERRORED;
2991 DestroyTrees(hfsmp);
2993 ResetVCBFreeExtCache(hfsmp);
3369 void check_rbtree_extents (struct hfsmount *hfsmp, u_int32_t startBlocks,
3375 alloc = hfs_isrbtree_allocated (hfsmp, startBlocks, numBlocks, &node1);
3421 hfs_validate_rbtree (struct hfsmount *hfsmp, u_int32_t start, u_int32_t end){
3426 hfs_checktreelinks (hfsmp);
3430 int rbtree = hfs_isrbtree_allocated(hfsmp, current, 1, &node1);
3431 int bitmap = hfs_isallocated(hfsmp, current, 1);
3449 hfs_checktreelinks (struct hfsmount *hfsmp) {
3450 extent_tree_offset_t *tree = &hfsmp->offset_tree;
3487 hfs_isrbtree_allocated (struct hfsmount *hfsmp, u_int32_t startBlock,
3501 node = extent_tree_off_search_prev(&hfsmp->offset_tree, &search_sentinel);
3505 nextnode = extent_tree_off_next (&hfsmp->offset_tree, node);
3582 hfs_isallocated_internal(struct hfsmount *hfsmp, u_int32_t startingBlock,
3603 error = ReadBitmapBlock(hfsmp, startingBlock, &buffer, &blockRef);
3613 bitsPerBlock = hfsmp->vcbVBMIOSize * kBitsPerByte;
3614 wordsPerBlock = hfsmp->vcbVBMIOSize / kBytesPerWord;
3653 error = ReleaseBitmapBlock(hfsmp, blockRef, false);
3656 error = ReadBitmapBlock(hfsmp, startingBlock, &buffer, &blockRef);
3685 error = ReleaseBitmapBlock(hfsmp, blockRef, false);
3688 error = ReadBitmapBlock(hfsmp, startingBlock, &buffer, &blockRef);
3704 (void)ReleaseBitmapBlock(hfsmp, blockRef, false);
3729 hfs_count_allocated(struct hfsmount *hfsmp, u_int32_t startBlock,
3732 return hfs_isallocated_internal(hfsmp, startBlock, numBlocks, false, allocCount);
3752 hfs_isallocated(struct hfsmount *hfsmp, u_int32_t startingBlock, u_int32_t numBlocks)
3757 error = hfs_isallocated_internal(hfsmp, startingBlock, numBlocks, true, &allocCount);
3780 hfs_isrbtree_active(struct hfsmount *hfsmp){
3787 REQUIRE_FILE_LOCK(hfsmp->hfs_allocation_vp, false);
3789 if (hfsmp){
3791 if (hfsmp->extent_tree_flags & HFS_ALLOC_RB_ENABLED) {
3796 #pragma unused (hfsmp)
3823 static int hfs_alloc_scan_block(struct hfsmount *hfsmp, u_int32_t startbit,
3832 u_int32_t blockSize = (u_int32_t)hfsmp->vcbVBMIOSize;
3842 error = ReadBitmapBlock(hfsmp, startbit, &buffer, (uintptr_t*)&blockRef);
3863 u_int32_t res = hfs_isallocated_scan (hfsmp, curAllocBlock, buffer);
3886 extent_tree_free_space(&hfsmp->offset_tree, size, offset);
3888 hfs_track_unmap_blocks (hfsmp, offset, size, list);
3909 extent_tree_free_space(&hfsmp->offset_tree, size, offset);
3911 hfs_track_unmap_blocks (hfsmp, offset, size, list);
3933 int hfs_isallocated_scan(struct hfsmount *hfsmp, u_int32_t startingBlock, u_int32_t *bp_buf) {
3957 error = ReadBitmapBlock(hfsmp, startingBlock, &buffer, &blockRef);
3967 bitsPerBlock = hfsmp->vcbVBMIOSize * kBitsPerByte;
3968 wordsPerBlock = hfsmp->vcbVBMIOSize / kBytesPerWord;
3993 (void)ReleaseBitmapBlock(hfsmp, blockRef, false);
4010 u_int32_t InitTree(struct hfsmount *hfsmp) {
4011 extent_tree_init (&(hfsmp->offset_tree));
4036 u_int32_t GenerateTree(struct hfsmount *hfsmp, u_int32_t endBlock, int *flags, int initialscan) {
4038 REQUIRE_FILE_LOCK(hfsmp->hfs_allocation_vp, false);
4046 cur_block_eof = &hfsmp->offset_block_end;
4067 * update our endBlock to match the current allocation limit in the hfsmp struct.
4071 if ((initialscan) && (endBlock != hfsmp->allocLimit)) {
4074 if (*cur_block_eof >= hfsmp->allocLimit ) {
4077 endBlock = hfsmp->allocLimit;
4098 error = hfs_alloc_scan_block (hfsmp, *cur_block_eof, endBlock, cur_block_eof);
4102 hfs_systemfile_unlock(hfsmp, *flags);
4103 *flags = hfs_systemfile_lock(hfsmp, SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
4115 void DestroyTrees(struct hfsmount *hfsmp) {
4118 REQUIRE_FILE_LOCK(hfsmp->hfs_allocation_vp, false);
4119 printf("DestroyTrees: Validating red/black tree for vol %s\n", (char*) hfsmp->vcbVN);
4120 hfs_validate_rbtree (hfsmp, 0, hfsmp->offset_block_end );
4129 if (hfsmp->extent_tree_flags & HFS_ALLOC_RB_ENABLED) {
4130 extent_tree_destroy(&hfsmp->offset_tree);
4133 hfsmp->extent_tree_flags &= ~HFS_ALLOC_RB_ENABLED;
4154 void ResetVCBFreeExtCache(struct hfsmount *hfsmp)
4162 lck_spin_lock(&hfsmp->vcbFreeExtLock);
4165 hfsmp->vcbFreeExtCnt = 0;
4169 freeExt = (void*)(hfsmp->vcbFreeExt);
4173 lck_spin_unlock(&hfsmp->vcbFreeExtLock);
4200 u_int32_t UpdateAllocLimit (struct hfsmount *hfsmp, u_int32_t new_end_block) {
4206 hfsmp->allocLimit = new_end_block;
4212 ResetVCBFreeExtCache(hfsmp);
4216 if ((new_end_block < hfsmp->offset_block_end) &&
4217 (hfsmp->extent_tree_flags & HFS_ALLOC_RB_ACTIVE)) {
4232 node = extent_tree_off_search_prev(&hfsmp->offset_tree, &search_sentinel);
4241 prev = extent_tree_off_prev (&hfsmp->offset_tree, node);
4287 extent_tree_remove_node (&hfsmp->offset_tree, remover);
4294 hfs_validate_rbtree (hfsmp, 0, new_end_block-1);
4303 hfsmp->offset_block_end = new_end_block;
4315 else if ((new_end_block > hfsmp->offset_block_end) &&
4316 (hfsmp->extent_tree_flags & HFS_ALLOC_RB_ACTIVE)) {
4322 hfs_validate_rbtree (hfsmp, 0, hfsmp->offset_block_end);
4326 retval = GenerateTree (hfsmp, new_end_block, &flags, 0);
4335 hfs_validate_rbtree (hfsmp, 0, new_end_block);
4338 hfsmp->offset_block_end = new_end_block;
4345 hfsmp->offset_block_end,hfsmp->allocLimit, new_end_block);
4368 static void remove_free_extent_list(struct hfsmount *hfsmp, int index)
4370 if (index < 0 || (uint32_t)index >= hfsmp->vcbFreeExtCnt) {
4372 panic("hfs: remove_free_extent_list: %p: index (%d) out of range (0, %u)", hfsmp, index, hfsmp->vcbFreeExtCnt);
4374 printf("hfs: remove_free_extent_list: %p: index (%d) out of range (0, %u)", hfsmp, index, hfsmp->vcbFreeExtCnt);
4377 int shift_count = hfsmp->vcbFreeExtCnt - index - 1;
4379 memmove(&hfsmp->vcbFreeExt[index], &hfsmp->vcbFreeExt[index+1], shift_count * sizeof(hfsmp->vcbFreeExt[0]));
4381 hfsmp->vcbFreeExtCnt--;
4404 static int add_free_extent_list(struct hfsmount *hfsmp, u_int32_t startBlock, u_int32_t blockCount)
4411 for (i = 0; i < hfsmp->vcbFreeExtCnt; ++i) {
4412 if (endBlock < hfsmp->vcbFreeExt[i].startBlock ||
4413 startBlock > (hfsmp->vcbFreeExt[i].startBlock + hfsmp->vcbFreeExt[i].blockCount)) {
4417 hfsmp, startBlock, blockCount, hfsmp->vcbFreeExt[i].startBlock, hfsmp->vcbFreeExt[i].blockCount, i);
4422 for (i = 0; i < hfsmp->vcbFreeExtCnt; ++i) {
4423 if (hfsmp->hfs_flags & HFS_HAS_SPARSE_DEVICE) {
4425 if (startBlock < hfsmp->vcbFreeExt[i].startBlock) {
4430 if (blockCount > hfsmp->vcbFreeExt[i].blockCount) {
4448 if (hfsmp->vcbFreeExtCnt < kMaxFreeExtents)
4449 hfsmp->vcbFreeExtCnt++;
4454 int shift_count = hfsmp->vcbFreeExtCnt - i - 1;
4456 memmove(&hfsmp->vcbFreeExt[i+1], &hfsmp->vcbFreeExt[i], shift_count * sizeof(hfsmp->vcbFreeExt[0]));
4460 hfsmp->vcbFreeExt[i].startBlock = startBlock;
4461 hfsmp->vcbFreeExt[i].blockCount = blockCount;
4476 * hfsmp - mount point structure
4480 static void remove_free_extent_cache(struct hfsmount *hfsmp, u_int32_t startBlock, u_int32_t blockCount)
4488 if (hfs_isrbtree_active(hfsmp) == true) {
4498 lck_spin_lock(&hfsmp->vcbFreeExtLock);
4504 for (i = 0; i < hfsmp->vcbFreeExtCnt; ++i) {
4505 currentStart = hfsmp->vcbFreeExt[i].startBlock;
4506 currentEnd = currentStart + hfsmp->vcbFreeExt[i].blockCount;
4521 remove_free_extent_list(hfsmp, i);
4543 remove_free_extent_list(hfsmp, i);
4544 add_free_extent_list(hfsmp, currentStart, startBlock - currentStart);
4545 add_free_extent_list(hfsmp, endBlock, currentEnd - endBlock);
4562 remove_free_extent_list(hfsmp, i);
4565 insertedIndex = add_free_extent_list(hfsmp, currentStart, startBlock - currentStart);
4568 insertedIndex = add_free_extent_list(hfsmp, endBlock, currentEnd - endBlock);
4575 lck_spin_unlock(&hfsmp->vcbFreeExtLock);
4577 sanity_check_free_ext(hfsmp, 0);
4597 * hfsmp - mount point structure
4607 static Boolean add_free_extent_cache(struct hfsmount *hfsmp, u_int32_t startBlock, u_int32_t blockCount)
4626 if (hfs_isrbtree_active(hfsmp) == true) {
4632 if (startBlock >= hfsmp->allocLimit) {
4637 if ((startBlock + blockCount) > hfsmp->allocLimit) {
4638 blockCount = hfsmp->allocLimit - startBlock;
4641 lck_spin_lock(&hfsmp->vcbFreeExtLock);
4649 for (i=0; i < hfsmp->vcbFreeExtCnt; ++i) {
4650 currentEnd = hfsmp->vcbFreeExt[i].startBlock + hfsmp->vcbFreeExt[i].blockCount;
4651 if (hfsmp->vcbFreeExt[i].startBlock > endBlock || currentEnd < startBlock) {
4656 if (hfsmp->vcbFreeExt[i].startBlock < startBlock)
4657 startBlock = hfsmp->vcbFreeExt[i].startBlock;
4661 remove_free_extent_list(hfsmp, i);
4672 add_free_extent_list(hfsmp, startBlock, endBlock - startBlock);
4674 lck_spin_unlock(&hfsmp->vcbFreeExtLock);
4677 sanity_check_free_ext(hfsmp, 0);
4686 static void sanity_check_free_ext(struct hfsmount *hfsmp, int check_allocated)
4691 if ((ALLOC_DEBUG == 0) || (hfs_isrbtree_active(hfsmp) == true)) {
4695 lck_spin_lock(&hfsmp->vcbFreeExtLock);
4697 if (hfsmp->vcbFreeExtCnt > kMaxFreeExtents)
4698 panic("hfs: %p: free extent count (%u) is too large", hfsmp, hfsmp->vcbFreeExtCnt);
4704 for(i=0; i < hfsmp->vcbFreeExtCnt; i++) {
4707 start = hfsmp->vcbFreeExt[i].startBlock;
4708 nblocks = hfsmp->vcbFreeExt[i].blockCount;
4710 //printf ("hfs: %p: slot:%d (%u,%u)\n", hfsmp, i, start, nblocks);
4724 lck_spin_unlock(&hfsmp->vcbFreeExtLock);
4725 if (hfs_isallocated(hfsmp, start, nblocks)) {
4727 hfsmp, i, start, nblocks);
4729 lck_spin_lock(&hfsmp->vcbFreeExtLock);
4733 if ((start > hfsmp->allocLimit) || ((start + nblocks) > hfsmp->allocLimit)) {
4735 hfsmp, i, start, nblocks, hfsmp->allocLimit);
4739 for(j=i+1; j < hfsmp->vcbFreeExtCnt; j++) {
4740 if (start == hfsmp->vcbFreeExt[j].startBlock) {
4742 hfsmp, i, start, nblocks, j, hfsmp->vcbFreeExt[j].startBlock,
4743 hfsmp->vcbFreeExt[j].blockCount);
4748 if ((i+1) != hfsmp->vcbFreeExtCnt) {
4749 if (hfsmp->hfs_flags & HFS_HAS_SPARSE_DEVICE) {
4751 if (hfsmp->vcbFreeExt[i].startBlock > hfsmp->vcbFreeExt[i+1].startBlock) {
4753 hfsmp, i, start, nblocks, i+1, hfsmp->vcbFreeExt[i+1].startBlock,
4754 hfsmp->vcbFreeExt[i+1].blockCount);
4758 if (hfsmp->vcbFreeExt[i].blockCount < hfsmp->vcbFreeExt[i+1].blockCount) {
4760 hfsmp, i, start, nblocks, i+1, hfsmp->vcbFreeExt[i+1].startBlock,
4761 hfsmp->vcbFreeExt[i+1].blockCount);
4766 lck_spin_unlock(&hfsmp->vcbFreeExtLock);