Lines Matching defs:hfsmp

75 static int  hfs_late_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, void *_args);
100 OSErr hfs_MountHFSVolume(struct hfsmount *hfsmp, HFSMasterDirectoryBlock *mdb,
103 ExtendedVCB *vcb = HFSTOVCB(hfsmp);
117 if (((hfsmp->hfs_flags & HFS_READ_ONLY) == 0) &&
121 hfsmp->hfs_flags |= HFS_STANDARD;
148 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
165 hfsmp->hfs_logBlockSize = BestBlockSizeFit(vcb->blockSize, MAXBSIZE, hfsmp->hfs_logical_block_size);
168 hfsmp->hfs_alt_id_sector = HFS_ALT_SECTOR(hfsmp->hfs_logical_block_size,
169 hfsmp->hfs_logical_block_count);
197 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
198 &hfsmp->hfs_extents_vp, &newvnode_flags);
205 error = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_extents_vp),
211 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
214 hfsmp->hfs_extents_cp = VTOC(hfsmp->hfs_extents_vp);
234 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
235 &hfsmp->hfs_catalog_vp, &newvnode_flags);
240 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
243 error = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
249 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
250 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
253 hfsmp->hfs_catalog_cp = VTOC(hfsmp->hfs_catalog_vp);
264 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
265 &hfsmp->hfs_allocation_vp, &newvnode_flags);
270 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
271 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
274 hfsmp->hfs_allocation_cp = VTOC(hfsmp->hfs_allocation_vp);
280 error = cat_idlookup(hfsmp, kHFSRootFolderID, 0, 0, NULL, NULL, NULL);
296 hfs_unlock(VTOC(hfsmp->hfs_allocation_vp));
297 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
298 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
307 hfsUnmount(hfsmp, NULL);
320 OSErr hfs_MountHFSPlusVolume(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp,
354 hfsmp->hfs_flags |= HFS_X;
375 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0 && hfsmp->jnl == NULL &&
384 if ((disksize & (hfsmp->hfs_logical_block_size - 1)) ||
385 (embeddedOffset & (hfsmp->hfs_logical_block_size - 1)) ||
386 (blockSize < hfsmp->hfs_logical_block_size)) {
389 blockSize, hfsmp->hfs_logical_block_size);
402 if (blockSize < hfsmp->hfs_physical_block_size) {
403 hfsmp->hfs_physical_block_size = hfsmp->hfs_logical_block_size;
404 hfsmp->hfs_log_per_phys = 1;
411 vcb = HFSTOVCB(hfsmp);
428 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
450 hfsmp->hfs_logBlockSize = BestBlockSizeFit(vcb->blockSize, MAXBSIZE, hfsmp->hfs_logical_block_size);
456 spare_sectors = hfsmp->hfs_logical_block_count -
458 hfsmp->hfs_logical_block_size);
460 if (spare_sectors > (daddr64_t)(blockSize / hfsmp->hfs_logical_block_size)) {
461 hfsmp->hfs_alt_id_sector = 0; /* partition has grown! */
463 hfsmp->hfs_alt_id_sector = (hfsmp->hfsPlusIOPosOffset / hfsmp->hfs_logical_block_size) +
464 HFS_ALT_SECTOR(hfsmp->hfs_logical_block_size,
465 hfsmp->hfs_logical_block_count);
494 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
495 &hfsmp->hfs_extents_vp, &newvnode_flags);
503 hfsmp->hfs_extents_cp = VTOC(hfsmp->hfs_extents_vp);
504 hfs_unlock(hfsmp->hfs_extents_cp);
506 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_extents_vp),
533 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
534 &hfsmp->hfs_catalog_vp, &newvnode_flags);
541 hfsmp->hfs_catalog_cp = VTOC(hfsmp->hfs_catalog_vp);
542 hfs_unlock(hfsmp->hfs_catalog_cp);
544 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
552 if ((hfsmp->hfs_flags & HFS_X) &&
553 BTGetInformation(VTOF(hfsmp->hfs_catalog_vp), 0, &btinfo) == 0) {
555 hfsmp->hfs_flags |= HFS_CASE_SENSITIVE;
557 (void) BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
580 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
581 &hfsmp->hfs_allocation_vp, &newvnode_flags);
588 hfsmp->hfs_allocation_cp = VTOC(hfsmp->hfs_allocation_vp);
589 hfs_unlock(hfsmp->hfs_allocation_cp);
610 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
611 &hfsmp->hfs_attribute_vp, &newvnode_flags);
618 hfsmp->hfs_attribute_cp = VTOC(hfsmp->hfs_attribute_vp);
619 hfs_unlock(hfsmp->hfs_attribute_cp);
620 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_attribute_vp),
634 retval = init_attrdata_vnode(hfsmp);
662 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
663 &hfsmp->hfs_startup_vp, &newvnode_flags);
670 hfsmp->hfs_startup_cp = VTOC(hfsmp->hfs_startup_vp);
671 hfs_unlock(hfsmp->hfs_startup_cp);
680 retval = cat_idlookup(hfsmp, kHFSRootFolderID, 0, 0, &cndesc, &cnattr, NULL);
699 (void) VNOP_IOCTL (hfsmp->hfs_devvp, DKIOCCSSETLVNAME, converted_volname, 0, vfs_context_current());
713 hfsmp->scan_var = 0;
716 hfs_lock_mount (hfsmp);
718 kernel_thread_start ((thread_continue_t) hfs_scan_blocks, hfsmp, &allocator_scanner);
720 while ((hfsmp->scan_var & HFS_ALLOCATOR_SCAN_INFLIGHT) == 0) {
721 (void) msleep (&hfsmp->scan_var, &hfsmp->hfs_mutex, (PDROP | PINOD), "hfs_scan_blocks", 0);
722 if (hfsmp->scan_var & HFS_ALLOCATOR_SCAN_INFLIGHT) {
726 hfs_lock_mount (hfsmp);
734 if (hfsmp->jnl && (hfsmp->hfs_flags & HFS_READ_ONLY) == 0) {
735 hfs_flushvolumeheader(hfsmp, TRUE, 0);
739 if ((hfsmp->hfs_flags & HFS_X) != 0) {
740 hfsmp->hfs_flags |= HFS_FOLDERCOUNT;
751 && (hfsmp->jnl == NULL)) {
753 retval = hfs_late_journal_init(hfsmp, vhp, args);
766 hfsmp->jnl = NULL;
771 if (!(hfsmp->hfs_flags & HFS_READ_ONLY)) {
776 hfsmp->hfs_flags |= HFS_NEED_JNL_RESET;
781 retval = (int)buf_meta_bread(hfsmp->hfs_devvp,
782 HFS_PHYSBLK_ROUNDDOWN(mdb_offset, hfsmp->hfs_log_per_phys),
783 hfsmp->hfs_physical_block_size, cred, &bp);
785 jvhp = (HFSPlusVolumeHeader *)(buf_dataptr(bp) + HFS_PRI_OFFSET(hfsmp->hfs_physical_block_size));
807 } else if (hfsmp->jnl) {
808 vfs_setflags(hfsmp->hfs_mp, (u_int64_t)((unsigned int)MNT_JOURNALED));
810 } else if (hfsmp->jnl || ((vcb->vcbAtrb & kHFSVolumeJournaledMask) && (hfsmp->hfs_flags & HFS_READ_ONLY))) {
813 if (hfsmp->hfs_flags & HFS_READ_ONLY) {
819 hfsmp->hfs_jnlinfoblkid = GetFileInfo(vcb, kRootDirID, ".journal_info_block", &jinfo_attr, NULL);
820 hfsmp->hfs_jnlfileid = GetFileInfo(vcb, kRootDirID, ".journal", &jnl_attr, NULL);
821 if (hfsmp->hfs_jnlinfoblkid == 0 || hfsmp->hfs_jnlfileid == 0) {
823 printf("hfs: jnlfileid %d, jnlinfoblkid %d\n", hfsmp->hfs_jnlfileid, hfsmp->hfs_jnlinfoblkid);
826 if (hfsmp->hfs_flags & HFS_READ_ONLY) {
830 if (hfsmp->jnl == NULL) {
831 vfs_clearflags(hfsmp->hfs_mp, (u_int64_t)((unsigned int)MNT_JOURNALED));
846 if (vfs_flags(hfsmp->hfs_mp) & MNT_CPROTECT) {
858 vfs_setflags (hfsmp->hfs_mp, MNT_CPROTECT);
863 if (vfs_flags(hfsmp->hfs_mp) & MNT_CPROTECT) {
880 cperr = cp_getrootxattr (hfsmp, xattr);
899 cperr = cp_setrootxattr (hfsmp, xattr);
910 hfsmp->hfs_running_cp_major_vers = majorversion;
918 PE_parse_boot_argn("aks_default_class", &hfsmp->default_cp_class, sizeof(hfsmp->default_cp_class));
919 if (cp_is_valid_class(0, hfsmp->default_cp_class) == 0) {
920 hfsmp->default_cp_class = PROTECTION_CLASS_D;
929 vfs_clearflags(hfsmp->hfs_mp, MNT_CPROTECT);
936 hfs_metadatazone_init(hfsmp, false);
941 if (hfsmp->hfs_flags & HFS_METADATA_ZONE) {
943 if (vcb->nextAllocation >= hfsmp->hfs_metazone_start &&
944 vcb->nextAllocation <= hfsmp->hfs_metazone_end) {
945 HFS_UPDATE_NEXT_ALLOCATION(hfsmp, hfsmp->hfs_metazone_end + 1);
949 vcb->nextAllocation = hfsmp->hfs_min_alloc_start;
952 vcb->sparseAllocation = hfsmp->hfs_min_alloc_start;
955 hfs_privatedir_init(hfsmp, FILE_HARDLINKS);
956 hfs_privatedir_init(hfsmp, DIR_HARDLINKS);
958 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
959 hfs_remove_orphans(hfsmp);
962 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
964 retval = hfs_erase_unused_nodes(hfsmp);
967 printf("hfs_mounthfsplus: hfs_erase_unused_nodes returned (%d) for %s \n", retval, hfsmp->vcbVN);
977 if ((hfsmp->hfs_flags & HFS_METADATA_ZONE) &&
978 ((hfsmp->hfs_flags & (HFS_READ_ONLY | HFS_SSD)) == 0)) {
979 (void) hfs_recording_init(hfsmp);
983 vfs_setextendedsecurity(HFSTOVFS(hfsmp));
986 hfsmp->hfs_flags |= HFS_XATTR_EXTENTS;
995 hfsUnmount(hfsmp, NULL);
1035 hfsUnmount( register struct hfsmount *hfsmp, __unused struct proc *p)
1041 if (hfsmp->hfs_attrdata_vp) {
1042 ReleaseMetaFileVNode(hfsmp->hfs_attrdata_vp);
1043 hfsmp->hfs_attrdata_vp = NULLVP;
1046 if (hfsmp->hfs_startup_vp) {
1047 ReleaseMetaFileVNode(hfsmp->hfs_startup_vp);
1048 hfsmp->hfs_startup_cp = NULL;
1049 hfsmp->hfs_startup_vp = NULL;
1052 if (hfsmp->hfs_attribute_vp) {
1053 ReleaseMetaFileVNode(hfsmp->hfs_attribute_vp);
1054 hfsmp->hfs_attribute_cp = NULL;
1055 hfsmp->hfs_attribute_vp = NULL;
1058 if (hfsmp->hfs_catalog_vp) {
1059 ReleaseMetaFileVNode(hfsmp->hfs_catalog_vp);
1060 hfsmp->hfs_catalog_cp = NULL;
1061 hfsmp->hfs_catalog_vp = NULL;
1064 if (hfsmp->hfs_extents_vp) {
1065 ReleaseMetaFileVNode(hfsmp->hfs_extents_vp);
1066 hfsmp->hfs_extents_cp = NULL;
1067 hfsmp->hfs_extents_vp = NULL;
1070 if (hfsmp->hfs_allocation_vp) {
1071 ReleaseMetaFileVNode(hfsmp->hfs_allocation_vp);
1072 hfsmp->hfs_allocation_cp = NULL;
1073 hfsmp->hfs_allocation_vp = NULL;
1128 hfs_lock_global (struct hfsmount *hfsmp, enum hfs_locktype locktype)
1132 if (hfsmp->hfs_global_lockowner == thread) {
1138 lck_rw_lock_shared (&hfsmp->hfs_global_lock);
1139 hfsmp->hfs_global_lockowner = HFS_SHARED_OWNER;
1143 lck_rw_lock_exclusive (&hfsmp->hfs_global_lock);
1144 hfsmp->hfs_global_lockowner = thread;
1155 hfs_unlock_global (struct hfsmount *hfsmp)
1161 if (hfsmp->hfs_global_lockowner == thread) {
1162 hfsmp->hfs_global_lockowner = NULL;
1163 lck_rw_unlock_exclusive (&hfsmp->hfs_global_lock);
1167 lck_rw_unlock_shared (&hfsmp->hfs_global_lock);
1177 void hfs_lock_mount (struct hfsmount *hfsmp) {
1178 lck_mtx_lock (&(hfsmp->hfs_mutex));
1187 void hfs_unlock_mount (struct hfsmount *hfsmp) {
1188 lck_mtx_unlock (&(hfsmp->hfs_mutex));
1195 hfs_systemfile_lock(struct hfsmount *hfsmp, int flags, enum hfs_locktype locktype)
1202 if (hfsmp->hfs_attribute_cp && hfsmp->hfs_attribute_cp->c_lockowner == current_thread()) {
1205 if (hfsmp->hfs_startup_cp && hfsmp->hfs_startup_cp->c_lockowner == current_thread()) {
1208 if (hfsmp-> hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1213 if (hfsmp->hfs_catalog_cp) {
1214 (void) hfs_lock(hfsmp->hfs_catalog_cp, locktype, HFS_LOCK_DEFAULT);
1221 (hfsmp->hfs_catalog_vp != NULL) &&
1222 (overflow_extents(VTOF(hfsmp->hfs_catalog_vp)))) {
1232 if (hfsmp->hfs_startup_cp && hfsmp->hfs_startup_cp->c_lockowner == current_thread()) {
1235 if (hfsmp->hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1240 if (hfsmp->hfs_attribute_cp) {
1241 (void) hfs_lock(hfsmp->hfs_attribute_cp, locktype, HFS_LOCK_DEFAULT);
1248 (hfsmp->hfs_attribute_vp != NULL) &&
1249 (overflow_extents(VTOF(hfsmp->hfs_attribute_vp)))) {
1259 if (hfsmp-> hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1264 if (hfsmp->hfs_startup_cp) {
1265 (void) hfs_lock(hfsmp->hfs_startup_cp, locktype, HFS_LOCK_DEFAULT);
1272 (hfsmp->hfs_startup_vp != NULL) &&
1273 (overflow_extents(VTOF(hfsmp->hfs_startup_vp)))) {
1286 if (hfsmp->hfs_allocation_cp) {
1287 (void) hfs_lock(hfsmp->hfs_allocation_cp, HFS_EXCLUSIVE_LOCK, HFS_LOCK_DEFAULT);
1304 if (hfsmp->hfs_extents_cp) {
1305 (void) hfs_lock(hfsmp->hfs_extents_cp, HFS_EXCLUSIVE_LOCK, HFS_LOCK_DEFAULT);
1318 hfs_systemfile_unlock(struct hfsmount *hfsmp, int flags)
1324 if (hfsmp->jnl == NULL) {
1328 if (flags & SFL_STARTUP && hfsmp->hfs_startup_cp) {
1329 hfs_unlock(hfsmp->hfs_startup_cp);
1331 if (flags & SFL_ATTRIBUTE && hfsmp->hfs_attribute_cp) {
1332 if (hfsmp->jnl == NULL) {
1333 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_attribute_vp), &lastfsync);
1338 hfs_btsync(hfsmp->hfs_attribute_vp, HFS_SYNCTRANS);
1341 hfs_unlock(hfsmp->hfs_attribute_cp);
1343 if (flags & SFL_CATALOG && hfsmp->hfs_catalog_cp) {
1344 if (hfsmp->jnl == NULL) {
1345 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_catalog_vp), &lastfsync);
1350 hfs_btsync(hfsmp->hfs_catalog_vp, HFS_SYNCTRANS);
1353 hfs_unlock(hfsmp->hfs_catalog_cp);
1355 if (flags & SFL_BITMAP && hfsmp->hfs_allocation_cp) {
1356 hfs_unlock(hfsmp->hfs_allocation_cp);
1358 if (flags & SFL_EXTENTS && hfsmp->hfs_extents_cp) {
1359 if (hfsmp->jnl == NULL) {
1360 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_extents_vp), &lastfsync);
1365 hfs_btsync(hfsmp->hfs_extents_vp, HFS_SYNCTRANS);
1368 hfs_unlock(hfsmp->hfs_extents_cp);
1429 hfs_owner_rights(struct hfsmount *hfsmp, uid_t cnode_uid, kauth_cred_t cred,
1434 ((((unsigned int)vfs_flags(HFSTOVFS(hfsmp))) & MNT_UNKNOWNPERMISSIONS) && /* [2] */
1435 ((kauth_cred_getuid(cred) == hfsmp->hfs_uid) || /* [2a] */
1436 (hfsmp->hfs_uid == UNKNOWNUID))) || /* [2b] */
1492 struct hfsmount * hfsmp;
1500 hfsmp = VCBTOHFS(vcb);
1507 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_SHARED_LOCK);
1508 error = cat_lookup(hfsmp, &jdesc, 0, 0, NULL, fattr, forkinfo, NULL);
1509 hfs_systemfile_unlock(hfsmp, lockflags);
1513 } else if (hfsmp->hfs_flags & HFS_READ_ONLY) {
1528 hfs_remove_orphans(struct hfsmount * hfsmp)
1551 if (hfsmp->hfs_flags & HFS_CLEANED_ORPHANS)
1554 vcb = HFSTOVCB(hfsmp);
1555 fcb = VTOF(hfsmp->hfs_catalog_vp);
1566 keyp->parentID = hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid;
1577 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
1579 hfs_systemfile_unlock(hfsmp, lockflags);
1583 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
1585 hfs_systemfile_unlock(hfsmp, lockflags);
1588 if (keyp->parentID != hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid)
1613 (void) hfs_removeallattr(hfsmp, filerec.fileID);
1615 if (hfs_start_transaction(hfsmp) != 0) {
1624 if (cat_preflight(hfsmp, CAT_DELETE, &cookie, p) != 0) {
1630 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG | SFL_ATTRIBUTE | SFL_EXTENTS | SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
1634 cat_convertattr(hfsmp, (CatalogRecord *)&filerec, &cnode.c_attr,
1636 cnode.c_desc.cd_parentcnid = hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid;
1655 fsize = (u_int64_t)dfork.ff_blocks * (u_int64_t)HFSTOVCB(hfsmp)->blockSize;
1678 hfs_systemfile_unlock(hfsmp, lockflags);
1680 hfs_end_transaction(hfsmp);
1682 if (hfs_start_transaction(hfsmp) != 0) {
1686 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG | SFL_ATTRIBUTE | SFL_EXTENTS | SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
1703 if (cat_delete(hfsmp, &cnode.c_desc, &cnode.c_attr) != 0) {
1705 hfs_systemfile_unlock(hfsmp, lockflags);
1707 hfs_volupdate(hfsmp, VOL_UPDATE, 0);
1721 hfsmp->hfs_private_attr[FILE_HARDLINKS].ca_entries--;
1723 DEC_FOLDERCOUNT(hfsmp, hfsmp->hfs_private_attr[FILE_HARDLINKS]);
1726 (void)cat_update(hfsmp, &hfsmp->hfs_private_desc[FILE_HARDLINKS],
1727 &hfsmp->hfs_private_attr[FILE_HARDLINKS], NULL, NULL);
1730 hfs_systemfile_unlock(hfsmp, lockflags);
1731 cat_postflight(hfsmp, &cookie, p);
1739 hfs_volupdate(hfsmp, VOL_RMDIR, 0);
1742 hfs_volupdate(hfsmp, VOL_RMFILE, 0);
1746 hfs_end_transaction(hfsmp);
1756 hfs_systemfile_unlock(hfsmp, lockflags);
1759 cat_postflight(hfsmp, &cookie, p);
1762 hfs_end_transaction(hfsmp);
1766 hfsmp->hfs_flags |= HFS_CLEANED_ORPHANS;
1812 hfs_freeblks(struct hfsmount * hfsmp, int wantreserve)
1824 freeblks = hfsmp->freeBlocks;
1825 rsrvblks = hfsmp->reserveBlocks;
1826 loanblks = hfsmp->loanedBlocks;
1843 if ((hfsmp->hfs_flags & HFS_HAS_SPARSE_DEVICE) && hfsmp->hfs_backingfs_rootvp) {
1850 backingfs_mp = vnode_mount(hfsmp->hfs_backingfs_rootvp);
1853 if ((now.tv_sec - hfsmp->hfs_last_backingstatfs) >= 1) {
1855 hfsmp->hfs_last_backingstatfs = now.tv_sec;
1859 hfs_lock_mount (hfsmp);
1862 if (vfsp->f_bsize != hfsmp->blockSize) {
1863 vfreeblks = ((u_int64_t)vfreeblks * (u_int64_t)(vfsp->f_bsize)) / hfsmp->blockSize;
1865 if (vfreeblks > (unsigned int)hfsmp->hfs_sparsebandblks)
1866 vfreeblks -= hfsmp->hfs_sparsebandblks;
1871 loanedblks = 2 * hfsmp->loanedBlocks;
1877 if (hfsmp->hfs_backingfs_maxblocks) {
1878 vfreeblks = MIN(vfreeblks, hfsmp->hfs_backingfs_maxblocks);
1881 hfs_unlock_mount (hfsmp);
1885 if (hfsmp->hfs_flags & HFS_CS) {
1888 if (VNOP_IOCTL(hfsmp->hfs_devvp, _DKIOCCSGETFREEBYTES,
1890 cs_free_blks = cs_free_bytes / hfsmp->blockSize;
2278 hfs_early_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp,
2286 uint32_t blksize = hfsmp->hfs_logical_block_size;
2294 devvp = hfsmp->hfs_devvp;
2308 hfsmp->hfs_physical_block_size, cred, &jinfo_bp);
2321 hfsmp->jvp = hfsmp->hfs_devvp;
2333 hfsmp->jvp = open_journal_dev(dev_name,
2338 hfsmp->hfs_logical_block_size,
2340 if (hfsmp->jvp == NULL) {
2358 hfsmp->jnl_start = jib_offset / SWAP_BE32(vhp->blockSize);
2359 hfsmp->jnl_size = jib_size;
2361 if ((hfsmp->hfs_flags & HFS_READ_ONLY) && (vfs_flags(hfsmp->hfs_mp) & MNT_ROOTFS) == 0) {
2365 retval = journal_is_clean(hfsmp->jvp,
2369 hfsmp->hfs_logical_block_size);
2371 hfsmp->jnl = NULL;
2388 hfsmp->jnl = journal_create(hfsmp->jvp,
2395 hfs_sync_metadata, hfsmp->hfs_mp,
2396 hfsmp->hfs_mp);
2397 if (hfsmp->jnl)
2398 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2412 hfsmp->jnl = journal_open(hfsmp->jvp,
2419 hfs_sync_metadata, hfsmp->hfs_mp,
2420 hfsmp->hfs_mp);
2421 if (hfsmp->jnl)
2422 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2432 if (hfsmp->jnl && mdbp) {
2440 HFS_PHYSBLK_ROUNDDOWN(mdb_offset, hfsmp->hfs_log_per_phys),
2441 hfsmp->hfs_physical_block_size, cred, &bp);
2450 bcopy((char *)buf_dataptr(bp) + HFS_PRI_OFFSET(hfsmp->hfs_physical_block_size), mdbp, 512);
2458 if (hfsmp->jnl == NULL) {
2487 hfs_late_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, void *_args)
2503 devvp = hfsmp->hfs_devvp;
2504 vcb = HFSTOVCB(hfsmp);
2522 hfsmp->hfs_jnlinfoblkid = fid;
2535 sectors_per_fsblock = SWAP_BE32(vhp->blockSize) / hfsmp->hfs_logical_block_size;
2538 (vcb->hfsPlusIOPosOffset / hfsmp->hfs_logical_block_size +
2540 hfsmp->hfs_physical_block_size, NOCRED, &jinfo_bp);
2563 hfsmp->hfs_jnlfileid = fid;
2586 hfsmp->jvp = hfsmp->hfs_devvp;
2598 hfsmp->jvp = open_journal_dev(dev_name,
2603 hfsmp->hfs_logical_block_size,
2605 if (hfsmp->jvp == NULL) {
2624 hfsmp->jnl_start = jib_offset / SWAP_BE32(vhp->blockSize);
2625 hfsmp->jnl_size = jib_size;
2627 if ((hfsmp->hfs_flags & HFS_READ_ONLY) && (vfs_flags(hfsmp->hfs_mp) & MNT_ROOTFS) == 0) {
2631 retval = journal_is_clean(hfsmp->jvp,
2635 hfsmp->hfs_logical_block_size);
2637 hfsmp->jnl = NULL;
2654 hfsmp->jnl = journal_create(hfsmp->jvp,
2658 hfsmp->hfs_logical_block_size,
2661 hfs_sync_metadata, hfsmp->hfs_mp,
2662 hfsmp->hfs_mp);
2663 if (hfsmp->jnl)
2664 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2686 hfsmp->jnl = journal_open(hfsmp->jvp,
2690 hfsmp->hfs_logical_block_size,
2693 hfs_sync_metadata, hfsmp->hfs_mp,
2694 hfsmp->hfs_mp);
2695 if (hfsmp->jnl)
2696 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2714 if (hfsmp->jnl == NULL) {
2759 hfs_metadatazone_init(struct hfsmount *hfsmp, int disable)
2769 vcb = HFSTOVCB(hfsmp);
2782 if (hfsmp->jnl == NULL) {
2798 zonesize = roundup(1536, hfsmp->blockSize);
2803 zonesize += hfsmp->hfs_allocation_cp->c_datafork->ff_blocks * hfsmp->blockSize;
2809 if (hfsmp->jnl && hfsmp->jvp == hfsmp->hfs_devvp) {
2810 zonesize += hfsmp->blockSize + hfsmp->jnl_size;
2817 zonesize += hfsmp->hfs_extents_cp->c_datafork->ff_blocks * hfsmp->blockSize;
2826 if (hfsmp->hfs_attribute_cp) {
2827 zonesize += 11 * hfsmp->hfs_attribute_cp->c_datafork->ff_clumpsize;
2837 zonesize += 11 * hfsmp->hfs_catalog_cp->c_datafork->ff_clumpsize;
2852 if (hfsmp->hfs_flags & HFS_QUOTAS) {
2894 hfsmp->hfs_min_alloc_start = zonesize / vcb->blockSize;
2902 if (hfsmp->hfs_min_alloc_start >= hfsmp->allocLimit) {
2903 hfsmp->hfs_min_alloc_start = 0;
2911 if (hfsmp->hfs_flags & HFS_METADATA_ZONE) {
2913 hfsmp->hfs_flags &= ~HFS_METADATA_ZONE;
2916 hfsmp->hfs_catalog_maxblks = 0;
2917 hfsmp->hfs_hotfile_maxblks = 0;
2918 hfsmp->hfs_hotfile_start = 0;
2919 hfsmp->hfs_hotfile_end = 0;
2920 hfsmp->hfs_hotfile_freeblks = 0;
2921 hfsmp->hfs_metazone_start = 0;
2922 hfsmp->hfs_metazone_end = 0;
2930 hfsmp->hfs_catalog_maxblks += (temp - (temp / 3)) / vcb->blockSize;
2932 hfsmp->hfs_hotfile_maxblks = filesize / vcb->blockSize;
2938 hfsmp->hfs_metazone_start = 1;
2939 hfsmp->hfs_metazone_end = blk - 1;
2942 if (vfs_flags(HFSTOVFS(hfsmp)) & MNT_ROOTFS) {
2943 hfsmp->hfs_hotfile_start = blk - (filesize / vcb->blockSize);
2944 hfsmp->hfs_hotfile_end = hfsmp->hfs_metazone_end;
2945 hfsmp->hfs_hotfile_freeblks = hfs_hotfile_freeblocks(hfsmp);
2948 hfsmp->hfs_hotfile_start = 0;
2949 hfsmp->hfs_hotfile_end = 0;
2950 hfsmp->hfs_hotfile_freeblks = 0;
2953 printf("hfs: metadata zone is %d to %d\n", hfsmp->hfs_metazone_start, hfsmp->hfs_metazone_end);
2954 printf("hfs: hot file band is %d to %d\n", hfsmp->hfs_hotfile_start, hfsmp->hfs_hotfile_end);
2955 printf("hfs: hot file band free blocks = %d\n", hfsmp->hfs_hotfile_freeblks);
2957 hfsmp->hfs_flags |= HFS_METADATA_ZONE;
2962 hfs_hotfile_freeblocks(struct hfsmount *hfsmp)
2964 ExtendedVCB *vcb = HFSTOVCB(hfsmp);
2968 lockflags = hfs_systemfile_lock(hfsmp, SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
2970 hfs_systemfile_unlock(hfsmp, lockflags);
2974 hfsmp->hfs_overflow_maxblks - VTOF(hfsmp->hfs_extents_vp)->ff_blocks;
2977 hfsmp->hfs_catalog_maxblks - VTOF(hfsmp->hfs_catalog_vp)->ff_blocks;
2981 return MIN(freeblocks, hfsmp->hfs_hotfile_maxblks);
3012 void hfs_syncer_lock(struct hfsmount *hfsmp)
3014 hfs_lock_mount(hfsmp);
3018 void hfs_syncer_unlock(struct hfsmount *hfsmp)
3020 hfs_unlock_mount(hfsmp);
3024 void hfs_syncer_wait(struct hfsmount *hfsmp)
3026 msleep(&hfsmp->hfs_sync_incomplete, &hfsmp->hfs_mutex, PWAIT,
3031 void hfs_syncer_wakeup(struct hfsmount *hfsmp)
3033 wakeup(&hfsmp->hfs_sync_incomplete);
3062 hfs_sync_ejectable(struct hfsmount *hfsmp)
3065 if (!hfsmp->hfs_syncer || current_thread() == hfsmp->hfs_syncer_thread)
3068 hfs_syncer_lock(hfsmp);
3070 if (!timerisset(&hfsmp->hfs_sync_req_oldest))
3071 microuptime(&hfsmp->hfs_sync_req_oldest);
3075 if (!hfsmp->hfs_syncer || hfsmp->hfs_sync_incomplete) {
3076 hfs_syncer_unlock(hfsmp);
3080 hfsmp->hfs_sync_incomplete = TRUE;
3082 thread_call_t syncer = hfsmp->hfs_syncer;
3084 hfs_syncer_unlock(hfsmp);
3090 hfs_start_transaction(struct hfsmount *hfsmp)
3100 if (hfsmp->jnl && journal_owner(hfsmp->jnl) != thread) {
3101 if (hfsmp->hfs_catalog_cp && hfsmp->hfs_catalog_cp->c_lockowner == thread) {
3104 if (hfsmp->hfs_attribute_cp && hfsmp->hfs_attribute_cp->c_lockowner == thread) {
3107 if (hfsmp->hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == thread) {
3113 if (hfsmp->jnl == NULL || journal_owner(hfsmp->jnl) != thread) {
3114 hfs_lock_global (hfsmp, HFS_SHARED_LOCK);
3115 OSAddAtomic(1, (SInt32 *)&hfsmp->hfs_active_threads);
3123 if ((hfsmp->hfs_flags & HFS_RDONLY_DOWNGRADE) &&
3124 (hfsmp->hfs_downgrading_proc != thread)) {
3129 if (hfsmp->jnl) {
3130 ret = journal_start_transaction(hfsmp->jnl);
3132 OSAddAtomic(1, &hfsmp->hfs_global_lock_nesting);
3140 hfs_unlock_global (hfsmp);
3141 OSAddAtomic(-1, (SInt32 *)&hfsmp->hfs_active_threads);
3148 hfs_end_transaction(struct hfsmount *hfsmp)
3152 if ((hfsmp->jnl == NULL) || ( journal_owner(hfsmp->jnl) == current_thread()
3153 && (OSAddAtomic(-1, &hfsmp->hfs_global_lock_nesting) == 1)) ) {
3157 if (hfsmp->jnl) {
3158 ret = journal_end_transaction(hfsmp->jnl);
3164 OSAddAtomic(-1, (SInt32 *)&hfsmp->hfs_active_threads);
3165 hfs_unlock_global (hfsmp);
3166 hfs_sync_ejectable(hfsmp);
3200 hfs_journal_flush(struct hfsmount *hfsmp, boolean_t wait_for_IO)
3204 /* Only peek at hfsmp->jnl while holding the global lock */
3205 hfs_lock_global (hfsmp, HFS_SHARED_LOCK);
3206 if (hfsmp->jnl) {
3207 ret = journal_flush(hfsmp->jnl, wait_for_IO);
3211 hfs_unlock_global (hfsmp);
3236 int hfs_erase_unused_nodes(struct hfsmount *hfsmp)
3242 if (hfsmp->vcbAtrb & kHFSUnusedNodeFixMask)
3248 if ((hfsmp->localCreateDate < kHFSUnusedNodesFixDate))
3251 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3255 catalog = hfsmp->hfs_catalog_cp->c_datafork;
3259 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3272 printf("hfs_erase_unused_nodes: updating volume %s.\n", hfsmp->vcbVN);
3273 result = hfs_start_transaction(hfsmp);
3276 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
3278 vnode_waitforwrites(hfsmp->hfs_catalog_vp, 0, 0, 0, "hfs_erase_unused_nodes");
3279 hfs_systemfile_unlock(hfsmp, lockflags);
3280 hfs_end_transaction(hfsmp);
3282 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3283 printf("hfs_erase_unused_nodes: done updating volume %s.\n", hfsmp->vcbVN);
3399 hfs_generate_document_id(struct hfsmount *hfsmp, uint32_t *docid)
3405 error = VFS_ROOT(HFSTOVFS(hfsmp), &rvp, vfs_context_kernel());
3417 if (hfs_start_transaction(hfsmp) != 0) {
3420 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
3431 (void) cat_update(hfsmp, &cp->c_desc, &cp->c_attr, NULL, NULL);
3433 hfs_systemfile_unlock (hfsmp, lockflags);
3434 (void) hfs_end_transaction(hfsmp);