Lines Matching defs:hfsmp

68 static int  hfs_late_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, void *_args);
93 OSErr hfs_MountHFSVolume(struct hfsmount *hfsmp, HFSMasterDirectoryBlock *mdb,
96 ExtendedVCB *vcb = HFSTOVCB(hfsmp);
110 if (((hfsmp->hfs_flags & HFS_READ_ONLY) == 0) &&
114 hfsmp->hfs_flags |= HFS_STANDARD;
141 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
158 hfsmp->hfs_logBlockSize = BestBlockSizeFit(vcb->blockSize, MAXBSIZE, hfsmp->hfs_logical_block_size);
161 hfsmp->hfs_alt_id_sector = HFS_ALT_SECTOR(hfsmp->hfs_logical_block_size,
162 hfsmp->hfs_logical_block_count);
190 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
191 &hfsmp->hfs_extents_vp, &newvnode_flags);
198 error = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_extents_vp),
204 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
207 hfsmp->hfs_extents_cp = VTOC(hfsmp->hfs_extents_vp);
227 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
228 &hfsmp->hfs_catalog_vp, &newvnode_flags);
233 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
236 error = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
242 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
243 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
246 hfsmp->hfs_catalog_cp = VTOC(hfsmp->hfs_catalog_vp);
257 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &fork,
258 &hfsmp->hfs_allocation_vp, &newvnode_flags);
263 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
264 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
267 hfsmp->hfs_allocation_cp = VTOC(hfsmp->hfs_allocation_vp);
273 error = cat_idlookup(hfsmp, kHFSRootFolderID, 0, 0, NULL, NULL, NULL);
289 hfs_unlock(VTOC(hfsmp->hfs_allocation_vp));
290 hfs_unlock(VTOC(hfsmp->hfs_catalog_vp));
291 hfs_unlock(VTOC(hfsmp->hfs_extents_vp));
300 hfsUnmount(hfsmp, NULL);
311 OSErr hfs_MountHFSPlusVolume(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp,
345 hfsmp->hfs_flags |= HFS_X;
366 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0 && hfsmp->jnl == NULL &&
375 if ((disksize & (hfsmp->hfs_logical_block_size - 1)) ||
376 (embeddedOffset & (hfsmp->hfs_logical_block_size - 1)) ||
377 (blockSize < hfsmp->hfs_logical_block_size)) {
380 blockSize, hfsmp->hfs_logical_block_size);
393 if (blockSize < hfsmp->hfs_physical_block_size) {
394 hfsmp->hfs_physical_block_size = hfsmp->hfs_logical_block_size;
395 hfsmp->hfs_log_per_phys = 1;
402 vcb = HFSTOVCB(hfsmp);
419 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
441 hfsmp->hfs_logBlockSize = BestBlockSizeFit(vcb->blockSize, MAXBSIZE, hfsmp->hfs_logical_block_size);
447 spare_sectors = hfsmp->hfs_logical_block_count -
449 hfsmp->hfs_logical_block_size);
451 if (spare_sectors > (daddr64_t)(blockSize / hfsmp->hfs_logical_block_size)) {
452 hfsmp->hfs_alt_id_sector = 0; /* partition has grown! */
454 hfsmp->hfs_alt_id_sector = (hfsmp->hfsPlusIOPosOffset / hfsmp->hfs_logical_block_size) +
455 HFS_ALT_SECTOR(hfsmp->hfs_logical_block_size,
456 hfsmp->hfs_logical_block_count);
485 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
486 &hfsmp->hfs_extents_vp, &newvnode_flags);
494 hfsmp->hfs_extents_cp = VTOC(hfsmp->hfs_extents_vp);
495 hfs_unlock(hfsmp->hfs_extents_cp);
497 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_extents_vp),
524 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
525 &hfsmp->hfs_catalog_vp, &newvnode_flags);
532 hfsmp->hfs_catalog_cp = VTOC(hfsmp->hfs_catalog_vp);
533 hfs_unlock(hfsmp->hfs_catalog_cp);
535 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
543 if ((hfsmp->hfs_flags & HFS_X) &&
544 BTGetInformation(VTOF(hfsmp->hfs_catalog_vp), 0, &btinfo) == 0) {
546 hfsmp->hfs_flags |= HFS_CASE_SENSITIVE;
548 (void) BTOpenPath(VTOF(hfsmp->hfs_catalog_vp),
571 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
572 &hfsmp->hfs_allocation_vp, &newvnode_flags);
579 hfsmp->hfs_allocation_cp = VTOC(hfsmp->hfs_allocation_vp);
580 hfs_unlock(hfsmp->hfs_allocation_cp);
601 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
602 &hfsmp->hfs_attribute_vp, &newvnode_flags);
609 hfsmp->hfs_attribute_cp = VTOC(hfsmp->hfs_attribute_vp);
610 hfs_unlock(hfsmp->hfs_attribute_cp);
611 retval = MacToVFSError(BTOpenPath(VTOF(hfsmp->hfs_attribute_vp),
625 retval = init_attrdata_vnode(hfsmp);
653 retval = hfs_getnewvnode(hfsmp, NULL, NULL, &cndesc, 0, &cnattr, &cfork,
654 &hfsmp->hfs_startup_vp, &newvnode_flags);
661 hfsmp->hfs_startup_cp = VTOC(hfsmp->hfs_startup_vp);
662 hfs_unlock(hfsmp->hfs_startup_cp);
666 retval = cat_idlookup(hfsmp, kHFSRootFolderID, 0, 0, &cndesc, &cnattr, NULL);
685 (void) VNOP_IOCTL (hfsmp->hfs_devvp, DKIOCCSSETLVNAME, converted_volname, 0, vfs_context_current());
693 if (hfsmp->jnl && (hfsmp->hfs_flags & HFS_READ_ONLY) == 0) {
694 hfs_flushvolumeheader(hfsmp, TRUE, 0);
698 if ((hfsmp->hfs_flags & HFS_X) != 0) {
699 hfsmp->hfs_flags |= HFS_FOLDERCOUNT;
710 && (hfsmp->jnl == NULL)) {
712 retval = hfs_late_journal_init(hfsmp, vhp, args);
725 hfsmp->jnl = NULL;
730 if (!(hfsmp->hfs_flags & HFS_READ_ONLY)) {
735 hfsmp->hfs_flags |= HFS_NEED_JNL_RESET;
740 retval = (int)buf_meta_bread(hfsmp->hfs_devvp,
741 HFS_PHYSBLK_ROUNDDOWN(mdb_offset, hfsmp->hfs_log_per_phys),
742 hfsmp->hfs_physical_block_size, cred, &bp);
744 jvhp = (HFSPlusVolumeHeader *)(buf_dataptr(bp) + HFS_PRI_OFFSET(hfsmp->hfs_physical_block_size));
766 } else if (hfsmp->jnl) {
767 vfs_setflags(hfsmp->hfs_mp, (u_int64_t)((unsigned int)MNT_JOURNALED));
769 } else if (hfsmp->jnl || ((vcb->vcbAtrb & kHFSVolumeJournaledMask) && (hfsmp->hfs_flags & HFS_READ_ONLY))) {
772 if (hfsmp->hfs_flags & HFS_READ_ONLY) {
778 hfsmp->hfs_jnlinfoblkid = GetFileInfo(vcb, kRootDirID, ".journal_info_block", &jinfo_attr, NULL);
779 hfsmp->hfs_jnlfileid = GetFileInfo(vcb, kRootDirID, ".journal", &jnl_attr, NULL);
780 if (hfsmp->hfs_jnlinfoblkid == 0 || hfsmp->hfs_jnlfileid == 0) {
782 printf("hfs: jnlfileid %d, jnlinfoblkid %d\n", hfsmp->hfs_jnlfileid, hfsmp->hfs_jnlinfoblkid);
785 if (hfsmp->hfs_flags & HFS_READ_ONLY) {
789 if (hfsmp->jnl == NULL) {
790 vfs_clearflags(hfsmp->hfs_mp, (u_int64_t)((unsigned int)MNT_JOURNALED));
797 hfs_metadatazone_init(hfsmp, false);
802 if (hfsmp->hfs_flags & HFS_METADATA_ZONE) {
804 if (vcb->nextAllocation >= hfsmp->hfs_metazone_start &&
805 vcb->nextAllocation <= hfsmp->hfs_metazone_end) {
806 HFS_UPDATE_NEXT_ALLOCATION(hfsmp, hfsmp->hfs_metazone_end + 1);
810 vcb->nextAllocation = hfsmp->hfs_min_alloc_start;
813 vcb->sparseAllocation = hfsmp->hfs_min_alloc_start;
816 hfs_privatedir_init(hfsmp, FILE_HARDLINKS);
817 hfs_privatedir_init(hfsmp, DIR_HARDLINKS);
819 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
820 hfs_remove_orphans(hfsmp);
823 if ((hfsmp->hfs_flags & HFS_READ_ONLY) == 0)
825 retval = hfs_erase_unused_nodes(hfsmp);
828 printf("hfs_mounthfsplus: hfs_erase_unused_nodes returned (%d) for %s \n", retval, hfsmp->vcbVN);
843 if ((hfsmp->hfs_flags & HFS_METADATA_ZONE) &&
844 ((hfsmp->hfs_flags & (HFS_READ_ONLY | HFS_SSD)) == 0)) {
845 (void) hfs_recording_init(hfsmp);
849 vfs_setextendedsecurity(HFSTOVFS(hfsmp));
852 hfsmp->hfs_flags |= HFS_XATTR_EXTENTS;
856 vfs_setflags (hfsmp->hfs_mp, MNT_CPROTECT);
866 hfsUnmount(hfsmp, NULL);
906 hfsUnmount( register struct hfsmount *hfsmp, __unused struct proc *p)
912 if (hfsmp->hfs_attrdata_vp) {
913 ReleaseMetaFileVNode(hfsmp->hfs_attrdata_vp);
914 hfsmp->hfs_attrdata_vp = NULLVP;
917 if (hfsmp->hfs_startup_vp) {
918 ReleaseMetaFileVNode(hfsmp->hfs_startup_vp);
919 hfsmp->hfs_startup_cp = NULL;
920 hfsmp->hfs_startup_vp = NULL;
923 if (hfsmp->hfs_attribute_vp) {
924 ReleaseMetaFileVNode(hfsmp->hfs_attribute_vp);
925 hfsmp->hfs_attribute_cp = NULL;
926 hfsmp->hfs_attribute_vp = NULL;
929 if (hfsmp->hfs_catalog_vp) {
930 ReleaseMetaFileVNode(hfsmp->hfs_catalog_vp);
931 hfsmp->hfs_catalog_cp = NULL;
932 hfsmp->hfs_catalog_vp = NULL;
935 if (hfsmp->hfs_extents_vp) {
936 ReleaseMetaFileVNode(hfsmp->hfs_extents_vp);
937 hfsmp->hfs_extents_cp = NULL;
938 hfsmp->hfs_extents_vp = NULL;
941 if (hfsmp->hfs_allocation_vp) {
942 ReleaseMetaFileVNode(hfsmp->hfs_allocation_vp);
943 hfsmp->hfs_allocation_cp = NULL;
944 hfsmp->hfs_allocation_vp = NULL;
995 hfs_lock_global (struct hfsmount *hfsmp, enum hfslocktype locktype) {
999 if (hfsmp->hfs_global_lockowner == thread) {
1005 lck_rw_lock_shared (&hfsmp->hfs_global_lock);
1006 hfsmp->hfs_global_lockowner = HFS_SHARED_OWNER;
1010 lck_rw_lock_exclusive (&hfsmp->hfs_global_lock);
1011 hfsmp->hfs_global_lockowner = thread;
1022 hfs_unlock_global (struct hfsmount *hfsmp) {
1027 if (hfsmp->hfs_global_lockowner == thread) {
1028 hfsmp->hfs_global_lockowner = NULL;
1029 lck_rw_unlock_exclusive (&hfsmp->hfs_global_lock);
1033 lck_rw_unlock_shared (&hfsmp->hfs_global_lock);
1042 hfs_systemfile_lock(struct hfsmount *hfsmp, int flags, enum hfslocktype locktype)
1050 if (hfsmp->hfs_attribute_cp && hfsmp->hfs_attribute_cp->c_lockowner == current_thread()) {
1053 if (hfsmp->hfs_startup_cp && hfsmp->hfs_startup_cp->c_lockowner == current_thread()) {
1056 if (hfsmp-> hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1061 if (hfsmp->hfs_catalog_cp) {
1062 (void) hfs_lock(hfsmp->hfs_catalog_cp, locktype);
1073 overflow_extents(VTOF(hfsmp->hfs_catalog_vp))) {
1080 if (hfsmp->hfs_startup_cp && hfsmp->hfs_startup_cp->c_lockowner == current_thread()) {
1083 if (hfsmp->hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1088 if (hfsmp->hfs_attribute_cp) {
1089 (void) hfs_lock(hfsmp->hfs_attribute_cp, locktype);
1096 overflow_extents(VTOF(hfsmp->hfs_attribute_vp))) {
1105 if (hfsmp-> hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == current_thread()) {
1110 if (hfsmp->hfs_startup_cp) {
1111 (void) hfs_lock(hfsmp->hfs_startup_cp, locktype);
1122 overflow_extents(VTOF(hfsmp->hfs_startup_vp))) {
1134 if (hfsmp->hfs_allocation_cp == NULL) {
1137 (void) hfs_lock(hfsmp->hfs_allocation_cp, HFS_EXCLUSIVE_LOCK);
1151 if (hfsmp->hfs_extents_cp) {
1152 (void) hfs_lock(hfsmp->hfs_extents_cp, HFS_EXCLUSIVE_LOCK);
1164 hfs_systemfile_unlock(struct hfsmount *hfsmp, int flags)
1170 if (hfsmp->jnl == NULL) {
1174 if (flags & SFL_STARTUP && hfsmp->hfs_startup_cp) {
1175 hfs_unlock(hfsmp->hfs_startup_cp);
1177 if (flags & SFL_ATTRIBUTE && hfsmp->hfs_attribute_cp) {
1178 if (hfsmp->jnl == NULL) {
1179 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_attribute_vp), &lastfsync);
1184 hfs_btsync(hfsmp->hfs_attribute_vp, HFS_SYNCTRANS);
1187 hfs_unlock(hfsmp->hfs_attribute_cp);
1189 if (flags & SFL_CATALOG && hfsmp->hfs_catalog_cp) {
1190 if (hfsmp->jnl == NULL) {
1191 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_catalog_vp), &lastfsync);
1196 hfs_btsync(hfsmp->hfs_catalog_vp, HFS_SYNCTRANS);
1199 hfs_unlock(hfsmp->hfs_catalog_cp);
1201 if (flags & SFL_BITMAP && hfsmp->hfs_allocation_cp) {
1202 hfs_unlock(hfsmp->hfs_allocation_cp);
1204 if (flags & SFL_EXTENTS && hfsmp->hfs_extents_cp) {
1205 if (hfsmp->jnl == NULL) {
1206 BTGetLastSync((FCB*)VTOF(hfsmp->hfs_extents_vp), &lastfsync);
1211 hfs_btsync(hfsmp->hfs_extents_vp, HFS_SYNCTRANS);
1214 hfs_unlock(hfsmp->hfs_extents_cp);
1275 hfs_owner_rights(struct hfsmount *hfsmp, uid_t cnode_uid, kauth_cred_t cred,
1280 ((((unsigned int)vfs_flags(HFSTOVFS(hfsmp))) & MNT_UNKNOWNPERMISSIONS) && /* [2] */
1281 ((kauth_cred_getuid(cred) == hfsmp->hfs_uid) || /* [2a] */
1282 (hfsmp->hfs_uid == UNKNOWNUID))) || /* [2b] */
1338 struct hfsmount * hfsmp;
1346 hfsmp = VCBTOHFS(vcb);
1353 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_SHARED_LOCK);
1354 error = cat_lookup(hfsmp, &jdesc, 0, NULL, fattr, forkinfo, NULL);
1355 hfs_systemfile_unlock(hfsmp, lockflags);
1359 } else if (hfsmp->hfs_flags & HFS_READ_ONLY) {
1374 hfs_remove_orphans(struct hfsmount * hfsmp)
1397 if (hfsmp->hfs_flags & HFS_CLEANED_ORPHANS)
1400 vcb = HFSTOVCB(hfsmp);
1401 fcb = VTOF(hfsmp->hfs_catalog_vp);
1412 keyp->parentID = hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid;
1423 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
1425 hfs_systemfile_unlock(hfsmp, lockflags);
1429 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
1431 hfs_systemfile_unlock(hfsmp, lockflags);
1434 if (keyp->parentID != hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid)
1459 (void) hfs_removeallattr(hfsmp, filerec.fileID);
1461 if (hfs_start_transaction(hfsmp) != 0) {
1470 if (cat_preflight(hfsmp, CAT_DELETE, &cookie, p) != 0) {
1476 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG | SFL_ATTRIBUTE | SFL_EXTENTS | SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
1480 cat_convertattr(hfsmp, (CatalogRecord *)&filerec, &cnode.c_attr,
1482 cnode.c_desc.cd_parentcnid = hfsmp->hfs_private_desc[FILE_HARDLINKS].cd_cnid;
1501 fsize = (u_int64_t)dfork.ff_blocks * (u_int64_t)HFSTOVCB(hfsmp)->blockSize;
1525 hfs_systemfile_unlock(hfsmp, lockflags);
1527 hfs_end_transaction(hfsmp);
1529 if (hfs_start_transaction(hfsmp) != 0) {
1533 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG | SFL_ATTRIBUTE | SFL_EXTENTS | SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
1550 if (cat_delete(hfsmp, &cnode.c_desc, &cnode.c_attr) != 0) {
1552 hfs_systemfile_unlock(hfsmp, lockflags);
1554 hfs_volupdate(hfsmp, VOL_UPDATE, 0);
1568 hfsmp->hfs_private_attr[FILE_HARDLINKS].ca_entries--;
1570 DEC_FOLDERCOUNT(hfsmp, hfsmp->hfs_private_attr[FILE_HARDLINKS]);
1573 (void)cat_update(hfsmp, &hfsmp->hfs_private_desc[FILE_HARDLINKS],
1574 &hfsmp->hfs_private_attr[FILE_HARDLINKS], NULL, NULL);
1577 hfs_systemfile_unlock(hfsmp, lockflags);
1578 cat_postflight(hfsmp, &cookie, p);
1586 hfs_volupdate(hfsmp, VOL_RMDIR, 0);
1589 hfs_volupdate(hfsmp, VOL_RMFILE, 0);
1593 hfs_end_transaction(hfsmp);
1603 hfs_systemfile_unlock(hfsmp, lockflags);
1606 cat_postflight(hfsmp, &cookie, p);
1609 hfs_end_transaction(hfsmp);
1613 hfsmp->hfs_flags |= HFS_CLEANED_ORPHANS;
1659 hfs_freeblks(struct hfsmount * hfsmp, int wantreserve)
1671 freeblks = hfsmp->freeBlocks;
1672 rsrvblks = hfsmp->reserveBlocks;
1673 loanblks = hfsmp->loanedBlocks;
1690 if ((hfsmp->hfs_flags & HFS_HAS_SPARSE_DEVICE) && hfsmp->hfs_backingfs_rootvp) {
1697 backingfs_mp = vnode_mount(hfsmp->hfs_backingfs_rootvp);
1700 if ((now.tv_sec - hfsmp->hfs_last_backingstatfs) >= 1) {
1702 hfsmp->hfs_last_backingstatfs = now.tv_sec;
1706 HFS_MOUNT_LOCK(hfsmp, TRUE);
1709 if (vfsp->f_bsize != hfsmp->blockSize) {
1710 vfreeblks = ((u_int64_t)vfreeblks * (u_int64_t)(vfsp->f_bsize)) / hfsmp->blockSize;
1712 if (vfreeblks > (unsigned int)hfsmp->hfs_sparsebandblks)
1713 vfreeblks -= hfsmp->hfs_sparsebandblks;
1718 loanedblks = 2 * hfsmp->loanedBlocks;
1724 if (hfsmp->hfs_backingfs_maxblocks) {
1725 vfreeblks = MIN(vfreeblks, hfsmp->hfs_backingfs_maxblocks);
1728 HFS_MOUNT_UNLOCK(hfsmp, TRUE);
2108 hfs_early_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp,
2116 uint32_t blksize = hfsmp->hfs_logical_block_size;
2124 devvp = hfsmp->hfs_devvp;
2141 hfsmp->hfs_physical_block_size, cred, &jinfo_bp);
2154 hfsmp->jvp = hfsmp->hfs_devvp;
2166 hfsmp->jvp = open_journal_dev(dev_name,
2171 hfsmp->hfs_logical_block_size,
2173 if (hfsmp->jvp == NULL) {
2190 hfsmp->jnl_start = jib_offset / SWAP_BE32(vhp->blockSize);
2191 hfsmp->jnl_size = jib_size;
2193 if ((hfsmp->hfs_flags & HFS_READ_ONLY) && (vfs_flags(hfsmp->hfs_mp) & MNT_ROOTFS) == 0) {
2197 retval = journal_is_clean(hfsmp->jvp,
2201 hfsmp->hfs_logical_block_size);
2203 hfsmp->jnl = NULL;
2221 hfsmp->jnl = journal_create(hfsmp->jvp,
2228 hfs_sync_metadata, hfsmp->hfs_mp);
2229 if (hfsmp->jnl)
2230 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2244 hfsmp->jnl = journal_open(hfsmp->jvp,
2251 hfs_sync_metadata, hfsmp->hfs_mp);
2252 if (hfsmp->jnl)
2253 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2263 if (hfsmp->jnl && mdbp) {
2271 HFS_PHYSBLK_ROUNDDOWN(mdb_offset, hfsmp->hfs_log_per_phys),
2272 hfsmp->hfs_physical_block_size, cred, &bp);
2281 bcopy((char *)buf_dataptr(bp) + HFS_PRI_OFFSET(hfsmp->hfs_physical_block_size), mdbp, 512);
2288 //printf("journal @ 0x%x\n", hfsmp->jnl);
2292 if (hfsmp->jnl == NULL) {
2316 hfs_late_journal_init(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, void *_args)
2332 devvp = hfsmp->hfs_devvp;
2333 vcb = HFSTOVCB(hfsmp);
2351 hfsmp->hfs_jnlinfoblkid = fid;
2364 sectors_per_fsblock = SWAP_BE32(vhp->blockSize) / hfsmp->hfs_logical_block_size;
2367 (vcb->hfsPlusIOPosOffset / hfsmp->hfs_logical_block_size +
2369 hfsmp->hfs_physical_block_size, NOCRED, &jinfo_bp);
2392 hfsmp->hfs_jnlfileid = fid;
2415 hfsmp->jvp = hfsmp->hfs_devvp;
2430 hfsmp->jvp = open_journal_dev(dev_name,
2435 hfsmp->hfs_logical_block_size,
2437 if (hfsmp->jvp == NULL) {
2454 hfsmp->jnl_start = jib_offset / SWAP_BE32(vhp->blockSize);
2455 hfsmp->jnl_size = jib_size;
2457 if ((hfsmp->hfs_flags & HFS_READ_ONLY) && (vfs_flags(hfsmp->hfs_mp) & MNT_ROOTFS) == 0) {
2461 retval = journal_is_clean(hfsmp->jvp,
2465 hfsmp->hfs_logical_block_size);
2467 hfsmp->jnl = NULL;
2485 hfsmp->jnl = journal_create(hfsmp->jvp,
2489 hfsmp->hfs_logical_block_size,
2492 hfs_sync_metadata, hfsmp->hfs_mp);
2493 if (hfsmp->jnl)
2494 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2516 hfsmp->jnl = journal_open(hfsmp->jvp,
2520 hfsmp->hfs_logical_block_size,
2523 hfs_sync_metadata, hfsmp->hfs_mp);
2524 if (hfsmp->jnl)
2525 journal_trim_set_callback(hfsmp->jnl, hfs_trim_callback, hfsmp);
2541 //printf("hfs: journal @ 0x%x\n", hfsmp->jnl);
2545 if (hfsmp->jnl == NULL) {
2590 hfs_metadatazone_init(struct hfsmount *hfsmp, int disable)
2600 vcb = HFSTOVCB(hfsmp);
2613 if (hfsmp->jnl == NULL) {
2629 zonesize = roundup(1536, hfsmp->blockSize);
2634 zonesize += hfsmp->hfs_allocation_cp->c_datafork->ff_blocks * hfsmp->blockSize;
2640 if (hfsmp->jnl && hfsmp->jvp == hfsmp->hfs_devvp) {
2641 zonesize += hfsmp->blockSize + hfsmp->jnl_size;
2648 zonesize += hfsmp->hfs_extents_cp->c_datafork->ff_blocks * hfsmp->blockSize;
2657 if (hfsmp->hfs_attribute_cp) {
2658 zonesize += 11 * hfsmp->hfs_attribute_cp->c_datafork->ff_clumpsize;
2668 zonesize += 11 * hfsmp->hfs_catalog_cp->c_datafork->ff_clumpsize;
2683 if (hfsmp->hfs_flags & HFS_QUOTAS) {
2725 hfsmp->hfs_min_alloc_start = zonesize / vcb->blockSize;
2733 if (hfsmp->hfs_min_alloc_start >= hfsmp->allocLimit) {
2734 hfsmp->hfs_min_alloc_start = 0;
2742 if (hfsmp->hfs_flags & HFS_METADATA_ZONE) {
2744 hfsmp->hfs_flags &= ~HFS_METADATA_ZONE;
2747 hfsmp->hfs_catalog_maxblks = 0;
2748 hfsmp->hfs_hotfile_maxblks = 0;
2749 hfsmp->hfs_hotfile_start = 0;
2750 hfsmp->hfs_hotfile_end = 0;
2751 hfsmp->hfs_hotfile_freeblks = 0;
2752 hfsmp->hfs_metazone_start = 0;
2753 hfsmp->hfs_metazone_end = 0;
2761 hfsmp->hfs_catalog_maxblks += (temp - (temp / 3)) / vcb->blockSize;
2763 hfsmp->hfs_hotfile_maxblks = filesize / vcb->blockSize;
2769 hfsmp->hfs_metazone_start = 1;
2770 hfsmp->hfs_metazone_end = blk - 1;
2773 hfsmp->hfs_hotfile_start = blk - (filesize / vcb->blockSize);
2774 hfsmp->hfs_hotfile_end = hfsmp->hfs_metazone_end;
2775 hfsmp->hfs_hotfile_freeblks = hfs_hotfile_freeblocks(hfsmp);
2777 printf("hfs: metadata zone is %d to %d\n", hfsmp->hfs_metazone_start, hfsmp->hfs_metazone_end);
2778 printf("hfs: hot file band is %d to %d\n", hfsmp->hfs_hotfile_start, hfsmp->hfs_hotfile_end);
2779 printf("hfs: hot file band free blocks = %d\n", hfsmp->hfs_hotfile_freeblks);
2781 hfsmp->hfs_flags |= HFS_METADATA_ZONE;
2786 hfs_hotfile_freeblocks(struct hfsmount *hfsmp)
2788 ExtendedVCB *vcb = HFSTOVCB(hfsmp);
2792 lockflags = hfs_systemfile_lock(hfsmp, SFL_BITMAP, HFS_EXCLUSIVE_LOCK);
2794 hfs_systemfile_unlock(hfsmp, lockflags);
2798 hfsmp->hfs_overflow_maxblks - VTOF(hfsmp->hfs_extents_vp)->ff_blocks;
2801 hfsmp->hfs_catalog_maxblks - VTOF(hfsmp->hfs_catalog_vp)->ff_blocks;
2805 return MIN(freeblocks, hfsmp->hfs_hotfile_maxblks);
2842 hfs_sync_ejectable(struct hfsmount *hfsmp)
2844 if (hfsmp->hfs_syncer) {
2852 if (hfsmp->hfs_sync_incomplete && hfsmp->hfs_mp->mnt_pending_write_size >= hfsmp->hfs_max_pending_io) {
2859 if (hfsmp->hfs_sync_scheduled == 0) {
2862 hfsmp->hfs_last_sync_request_time = now;
2873 OSIncrementAtomic((volatile SInt32 *)&hfsmp->hfs_sync_scheduled);
2874 if (thread_call_enter_delayed(hfsmp->hfs_syncer, deadline))
2875 OSDecrementAtomic((volatile SInt32 *)&hfsmp->hfs_sync_scheduled);
2877 OSIncrementAtomic((volatile SInt32 *)&hfsmp->hfs_sync_incomplete);
2884 hfs_start_transaction(struct hfsmount *hfsmp)
2894 if (hfsmp->jnl && journal_owner(hfsmp->jnl) != thread) {
2895 if (hfsmp->hfs_catalog_cp && hfsmp->hfs_catalog_cp->c_lockowner == thread) {
2898 if (hfsmp->hfs_attribute_cp && hfsmp->hfs_attribute_cp->c_lockowner == thread) {
2901 if (hfsmp->hfs_extents_cp && hfsmp->hfs_extents_cp->c_lockowner == thread) {
2907 if (hfsmp->jnl == NULL || journal_owner(hfsmp->jnl) != thread) {
2908 hfs_lock_global (hfsmp, HFS_SHARED_LOCK);
2909 OSAddAtomic(1, (SInt32 *)&hfsmp->hfs_active_threads);
2917 if ((hfsmp->hfs_flags & HFS_RDONLY_DOWNGRADE) &&
2918 (hfsmp->hfs_downgrading_proc != thread)) {
2923 if (hfsmp->jnl) {
2924 ret = journal_start_transaction(hfsmp->jnl);
2926 OSAddAtomic(1, &hfsmp->hfs_global_lock_nesting);
2934 hfs_unlock_global (hfsmp);
2935 OSAddAtomic(-1, (SInt32 *)&hfsmp->hfs_active_threads);
2942 hfs_end_transaction(struct hfsmount *hfsmp)
2946 if ((hfsmp->jnl == NULL) || ( journal_owner(hfsmp->jnl) == current_thread()
2947 && (OSAddAtomic(-1, &hfsmp->hfs_global_lock_nesting) == 1)) ) {
2951 if (hfsmp->jnl) {
2952 ret = journal_end_transaction(hfsmp->jnl);
2958 OSAddAtomic(-1, (SInt32 *)&hfsmp->hfs_active_threads);
2959 hfs_unlock_global (hfsmp);
2960 hfs_sync_ejectable(hfsmp);
2994 hfs_journal_flush(struct hfsmount *hfsmp, boolean_t wait_for_IO)
2998 /* Only peek at hfsmp->jnl while holding the global lock */
2999 hfs_lock_global (hfsmp, HFS_SHARED_LOCK);
3000 if (hfsmp->jnl) {
3001 ret = journal_flush(hfsmp->jnl, wait_for_IO);
3005 hfs_unlock_global (hfsmp);
3030 int hfs_erase_unused_nodes(struct hfsmount *hfsmp)
3036 if (hfsmp->vcbAtrb & kHFSUnusedNodeFixMask)
3042 if ((hfsmp->localCreateDate < kHFSUnusedNodesFixDate))
3045 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3049 catalog = hfsmp->hfs_catalog_cp->c_datafork;
3053 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3066 printf("hfs_erase_unused_nodes: updating volume %s.\n", hfsmp->vcbVN);
3067 result = hfs_start_transaction(hfsmp);
3070 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_EXCLUSIVE_LOCK);
3072 vnode_waitforwrites(hfsmp->hfs_catalog_vp, 0, 0, 0, "hfs_erase_unused_nodes");
3073 hfs_systemfile_unlock(hfsmp, lockflags);
3074 hfs_end_transaction(hfsmp);
3076 hfsmp->vcbAtrb |= kHFSUnusedNodeFixMask;
3077 printf("hfs_erase_unused_nodes: done updating volume %s.\n", hfsmp->vcbVN);