Lines Matching defs:hfsmp

96 	struct hfsmount *hfsmp;
162 hfs_recording_start(struct hfsmount *hfsmp)
171 if ((hfsmp->hfs_flags & HFS_READ_ONLY) ||
172 (hfsmp->jnl == NULL) ||
173 (hfsmp->hfs_flags & HFS_METADATA_ZONE) == 0) {
176 if (HFSTOVCB(hfsmp)->freeBlocks < (2 * (u_int32_t)hfsmp->hfs_hotfile_maxblks)) {
179 if (hfsmp->hfc_stage != HFC_IDLE) {
182 hfsmp->hfc_stage = HFC_BUSY;
187 if (hfsmp->hfc_recdata) {
190 tmp = hfsmp->hfc_recdata;
191 hfsmp->hfc_recdata = NULL;
200 if (hfsmp->hfc_timebase == 0 &&
201 hfc_btree_open(hfsmp, &hfsmp->hfc_filevp) == 0) {
204 if ((BTGetUserData(VTOF(hfsmp->hfc_filevp), &hotfileinfo,
209 hfsmp->hfc_maxfiles = SWAP_BE32 (hotfileinfo.maxfilecnt);
210 hfsmp->hfc_timeout = SWAP_BE32 (hotfileinfo.timeleft) + tv.tv_sec ;
211 hfsmp->hfc_timebase = SWAP_BE32 (hotfileinfo.timebase);
213 if (hfsmp->hfc_timebase < HFC_MIN_BASE_TIME) {
214 hfsmp->hfc_timebase = hfsmp->hfc_timeout - HFC_DEFAULT_DURATION;
218 hfsmp->vcbVN, SWAP_BE32 (hotfileinfo.timeleft));
221 hfsmp->hfc_maxfiles = HFC_DEFAULT_FILE_COUNT;
222 hfsmp->hfc_timebase = tv.tv_sec + 1;
223 hfsmp->hfc_timeout = hfsmp->hfc_timebase + HFC_DEFAULT_DURATION;
225 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
226 hfsmp->hfc_filevp = NULL;
234 cnid = GetFileInfo(HFSTOVCB(hfsmp), kRootDirID, HFC_FILENAME, &cattr, NULL);
237 (error = hfc_btree_create(hfsmp, HFSTOVCB(hfsmp)->blockSize, HFC_DEFAULT_FILE_COUNT))) {
238 hfsmp->hfc_stage = HFC_IDLE;
239 wakeup((caddr_t)&hfsmp->hfc_stage);
243 printf("hfs: begin recording hot files on %s\n", hfsmp->vcbVN);
245 hfsmp->hfc_maxfiles = HFC_DEFAULT_FILE_COUNT;
246 hfsmp->hfc_timeout = tv.tv_sec + HFC_DEFAULT_DURATION;
249 if (hfsmp->hfc_timebase == 0) {
250 hfsmp->hfc_timebase = tv.tv_sec + 1;
254 cumulativebase = hfsmp->hfc_timeout - (HFC_CUMULATIVE_CYCLES * HFC_DEFAULT_DURATION);
255 hfsmp->hfc_timebase = MAX(hfsmp->hfc_timebase, cumulativebase);
259 if ((hfsmp->hfc_maxfiles == 0) ||
260 (hfsmp->hfc_maxfiles > HFC_MAXIMUM_FILE_COUNT)) {
261 hfsmp->hfc_maxfiles = HFC_DEFAULT_FILE_COUNT;
263 maxentries = hfsmp->hfc_maxfiles;
268 hfsmp->hfc_recdata = NULL;
269 hfsmp->hfc_stage = HFC_IDLE;
270 wakeup((caddr_t)&hfsmp->hfc_stage);
284 hotdata->maxblocks = HFC_MAXIMUM_FILESIZE / HFSTOVCB(hfsmp)->blockSize;
285 hotdata->hfsmp = hfsmp;
287 hfsmp->hfc_recdata = hotdata;
288 hfsmp->hfc_stage = HFC_RECORDING;
289 wakeup((caddr_t)&hfsmp->hfc_stage);
299 hfs_recording_stop(struct hfsmount *hfsmp)
308 if (hfsmp->hfc_stage != HFC_RECORDING)
311 hfsmp->hfc_stage = HFC_BUSY;
313 hotfiles_collect(hfsmp);
322 printf("hfs: end of hot file recording on %s\n", hfsmp->vcbVN);
324 hotdata = (hotfile_data_t *)hfsmp->hfc_recdata;
327 hfsmp->hfc_recdata = NULL;
328 hfsmp->hfc_stage = HFC_EVALUATION;
329 wakeup((caddr_t)&hfsmp->hfc_stage);
343 if (hfsmp->hfc_filevp)
344 panic("hfs_recording_stop: hfc_filevp exists (vp = %p)", hfsmp->hfc_filevp);
346 error = hfc_btree_open(hfsmp, &hfsmp->hfc_filevp);
354 error = hotfiles_age(hfsmp);
356 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
357 hfsmp->hfc_filevp = NULL;
369 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
370 hfsmp->hfc_filevp = NULL;
378 listp->hfl_duration = tv.tv_sec - hfsmp->hfc_timebase;
379 hfsmp->hfc_recdata = listp;
384 error = hotfiles_refine(hfsmp);
386 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
387 hfsmp->hfc_filevp = NULL;
394 if (listp->hfl_totalblocks > hfsmp->hfs_hotfile_freeblks) {
396 MIN(listp->hfl_totalblocks, hfsmp->hfs_hotfile_maxblks) -
397 hfsmp->hfs_hotfile_freeblks;
410 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
411 hfsmp->hfc_filevp = NULL;
423 hfsmp->hfc_stage = newstage;
424 wakeup((caddr_t)&hfsmp->hfc_stage);
432 hfs_recording_suspend(struct hfsmount *hfsmp)
439 if (hfsmp->hfc_stage == HFC_DISABLED)
442 lck_mtx_lock(&hfsmp->hfc_mutex);
451 hotdata = (hotfile_data_t *)hfsmp->hfc_recdata;
452 if (hotdata == NULL || hfsmp->hfc_stage != HFC_RECORDING) {
456 hfsmp->hfc_stage = HFC_BUSY;
459 printf("hfs: suspend hot file recording on %s\n", hfsmp->vcbVN);
461 error = hfc_btree_open(hfsmp, &hfsmp->hfc_filevp);
467 if (hfs_start_transaction(hfsmp) != 0) {
471 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
480 hotfileinfo.timebase = SWAP_BE32 (hfsmp->hfc_timebase);
481 hotfileinfo.timeleft = SWAP_BE32 (hfsmp->hfc_timeout - tv.tv_sec);
486 (void) BTSetUserData(VTOF(hfsmp->hfc_filevp), &hotfileinfo, sizeof(hotfileinfo));
488 hfs_unlock(VTOC(hfsmp->hfc_filevp));
491 hfs_end_transaction(hfsmp);
494 if (hfsmp->hfc_filevp) {
495 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
496 hfsmp->hfc_filevp = NULL;
500 hfsmp->hfc_recdata = NULL;
502 hfsmp->hfc_stage = HFC_DISABLED;
503 wakeup((caddr_t)&hfsmp->hfc_stage);
505 lck_mtx_unlock(&hfsmp->hfc_mutex);
514 hfs_recording_init(struct hfsmount *hfsmp)
536 if ((vfs_flags(HFSTOVFS(hfsmp)) & MNT_ROOTFS) == 0) {
537 hfsmp->hfc_stage = HFC_DISABLED;
546 if (vfs_flags(HFSTOVFS(hfsmp)) & MNT_NOATIME) {
547 hfsmp->hfc_stage = HFC_DISABLED;
554 cnid = GetFileInfo(HFSTOVCB(hfsmp), kRootDirID, HFC_FILENAME, &cattr, NULL);
556 if (hfsmp->hfc_stage == HFC_DISABLED)
557 hfsmp->hfc_stage = HFC_IDLE;
561 if (hfs_start_transaction(hfsmp) != 0) {
565 error = hfc_btree_create(hfsmp, HFSTOVCB(hfsmp)->blockSize, HFC_DEFAULT_FILE_COUNT);
568 printf("hfs: Error %d creating hot file b-tree on %s \n", error, hfsmp->vcbVN);
575 if (hfsmp->hfc_filevp)
576 panic("hfs_recording_init: hfc_filevp exists (vp = %p)", hfsmp->hfc_filevp);
577 error = hfc_btree_open(hfsmp, &hfsmp->hfc_filevp);
580 printf("hfs: Error %d opening hot file b-tree on %s \n", error, hfsmp->vcbVN);
587 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
588 hfsmp->hfc_filevp = NULL;
599 printf("hfs: Evaluating space for \"%s\" metadata zone...\n", HFSTOVCB(hfsmp)->vcbVN);
604 error = BTScanInitialize(VTOF(HFSTOVCB(hfsmp)->catalogRefNum), 0, 0, 0,
614 if (hfs_start_transaction(hfsmp) != 0) {
618 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
622 filefork = VTOF(hfsmp->hfc_filevp);
651 if (!hotextents(hfsmp, &filep->dataFork.extents[0])) {
657 if (cnid == hfsmp->hfs_jnlfileid || cnid == hfsmp->hfs_jnlinfoblkid) {
692 hfs_unlock(VTOC(hfsmp->hfc_filevp));
695 hfs_end_transaction(hfsmp);
703 hfs_end_transaction(hfsmp);
706 if (hfsmp->hfc_filevp) {
707 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
708 hfsmp->hfc_filevp = NULL;
711 hfsmp->hfc_stage = HFC_IDLE;
720 hfs_hotfilesync(struct hfsmount *hfsmp, vfs_context_t ctx)
722 if (hfsmp->hfc_stage) {
725 lck_mtx_lock(&hfsmp->hfc_mutex);
727 switch (hfsmp->hfc_stage) {
729 (void) hfs_recording_start(hfsmp);
734 if (tv.tv_sec > hfsmp->hfc_timeout)
735 (void) hfs_recording_stop(hfsmp);
739 (void) hotfiles_evict(hfsmp, ctx);
743 (void) hotfiles_adopt(hfsmp);
749 lck_mtx_unlock(&hfsmp->hfc_mutex);
768 hfsmount_t *hfsmp;
771 hfsmp = VTOHFS(vp);
772 if (hfsmp->hfc_stage != HFC_RECORDING)
775 lck_mtx_lock(&hfsmp->hfc_mutex);
777 lck_mtx_unlock(&hfsmp->hfc_mutex);
786 hfsmount_t *hfsmp;
791 hfsmp = VTOHFS(vp);
792 if (hfsmp->hfc_stage != HFC_RECORDING)
802 if ((hotdata = (hotfile_data_t *)hfsmp->hfc_recdata) == NULL) {
814 (cp->c_atime < hfsmp->hfc_timebase)) {
827 if ((hotdata->activefiles < hfsmp->hfc_maxfiles) ||
856 hfsmount_t *hfsmp;
861 hfsmp = VTOHFS(vp);
862 if (hfsmp->hfc_stage != HFC_RECORDING)
873 (ffp->ff_size == 0) || (cp->c_atime < hfsmp->hfc_timebase)) {
877 lck_mtx_lock(&hfsmp->hfc_mutex);
878 if (hfsmp->hfc_stage != HFC_RECORDING)
880 if ((hotdata = (hotfile_data_t *)hfsmp->hfc_recdata) == NULL)
893 lck_mtx_unlock(&hfsmp->hfc_mutex);
917 hotfiles_collect(struct hfsmount *hfsmp)
919 struct mount *mp = HFSTOVFS(hfsmp);
954 hotfiles_refine(struct hfsmount *hfsmp)
967 if ((listp = (hotfilelist_t *)hfsmp->hfc_recdata) == NULL)
970 mp = HFSTOVFS(hfsmp);
984 if (hfs_start_transaction(hfsmp) != 0) {
988 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
992 filefork = VTOF(hfsmp->hfc_filevp);
1054 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1057 hfs_end_transaction(hfsmp);
1070 hotfiles_adopt(struct hfsmount *hfsmp)
1087 if ((listp = (hotfilelist_t *)hfsmp->hfc_recdata) == NULL)
1090 if (hfsmp->hfc_stage != HFC_ADOPTION) {
1093 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
1099 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1103 stage = hfsmp->hfc_stage;
1104 hfsmp->hfc_stage = HFC_BUSY;
1119 filefork = VTOF(hfsmp->hfc_filevp);
1132 error = hfs_vget(hfsmp, listp->hfl_hotfile[i].hf_fileid, &vp, 0, 0);
1149 if (hotextents(hfsmp, &VTOF(vp)->ff_extents[0])) {
1158 if (fileblocks > hfsmp->hfs_hotfile_freeblks) {
1177 error = hfs_relocate(vp, hfsmp->hfs_hotfile_start, kauth_cred_get(), current_proc());
1186 hfsmp->hfs_hotfile_freeblks -= fileblocks;
1196 if (hfs_start_transaction(hfsmp) != 0) {
1227 hfs_end_transaction(hfsmp);
1236 if (hfsmp->hfs_hotfile_freeblks <= 0) {
1238 printf("hfs: hotfiles_adopt: free space exhausted (%d)\n", hfsmp->hfs_hotfile_freeblks);
1250 hfs_end_transaction(hfsmp);
1253 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1255 if ((listp->hfl_next >= listp->hfl_count) || (hfsmp->hfs_hotfile_freeblks <= 0)) {
1258 printf("hfs: hotfiles_adopt: %d blocks free in hot file band\n", hfsmp->hfs_hotfile_freeblks);
1264 if (stage != HFC_ADOPTION && hfsmp->hfc_filevp) {
1265 (void) hfc_btree_close(hfsmp, hfsmp->hfc_filevp);
1266 hfsmp->hfc_filevp = NULL;
1268 hfsmp->hfc_stage = stage;
1269 wakeup((caddr_t)&hfsmp->hfc_stage);
1279 hotfiles_evict(struct hfsmount *hfsmp, vfs_context_t ctx)
1295 if (hfsmp->hfc_stage != HFC_EVICTION) {
1299 if ((listp = (hotfilelist_t *)hfsmp->hfc_recdata) == NULL)
1302 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
1308 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1312 stage = hfsmp->hfc_stage;
1313 hfsmp->hfc_stage = HFC_BUSY;
1321 filefork = VTOF(hfsmp->hfc_filevp);
1354 error = hfs_vget(hfsmp, key->fileID, &vp, 0, 0);
1380 if (!hotextents(hfsmp, &VTOF(vp)->ff_extents[0])) {
1392 error = hfs_relocate(vp, HFSTOVCB(hfsmp)->nextAllocation, vfs_context_ucred(ctx), vfs_context_proc(ctx));
1411 hfsmp->hfs_hotfile_freeblks += fileblocks;
1419 if (hfs_start_transaction(hfsmp) != 0) {
1443 hfs_end_transaction(hfsmp);
1455 hfs_end_transaction(hfsmp);
1458 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1466 printf("hfs: hotfiles_evict: %d blocks free in hot file band\n", hfsmp->hfs_hotfile_freeblks);
1470 hfsmp->hfc_stage = stage;
1471 wakeup((caddr_t)&hfsmp->hfc_stage);
1479 hotfiles_age(struct hfsmount *hfsmp)
1520 if (hfs_start_transaction(hfsmp) != 0) {
1524 if (hfs_lock(VTOC(hfsmp->hfc_filevp), HFS_EXCLUSIVE_LOCK) != 0) {
1528 filefork = VTOF(hfsmp->hfc_filevp);
1628 hfs_unlock(VTOC(hfsmp->hfc_filevp));
1630 hfs_end_transaction(hfsmp);
1642 hotextents(struct hfsmount *hfsmp, HFSPlusExtentDescriptor * extents)
1653 if ((b1 >= hfsmp->hfs_hotfile_start &&
1654 b2 <= hfsmp->hfs_hotfile_end) ||
1655 (b1 < hfsmp->hfs_hotfile_end &&
1656 b2 > hfsmp->hfs_hotfile_end)) {
1677 hfc_btree_open(struct hfsmount *hfsmp, struct vnode **vpp)
1698 lockflags = hfs_systemfile_lock(hfsmp, SFL_CATALOG, HFS_SHARED_LOCK);
1700 error = cat_lookup(hfsmp, &cdesc, 0, &cdesc, &cattr, &cfork, NULL);
1702 hfs_systemfile_unlock(hfsmp, lockflags);
1710 error = hfs_getnewvnode(hfsmp, NULL, NULL, &cdesc, 0, &cattr,
1756 hfc_btree_close(struct hfsmount *hfsmp, struct vnode *vp)
1762 if (hfsmp->jnl) {
1763 hfs_journal_flush(hfsmp, FALSE);
1786 hfc_btree_create(struct hfsmount *hfsmp, unsigned int nodesize, unsigned int entries)
1797 if (hfsmp->hfc_filevp)
1798 panic("hfs: hfc_btree_create: hfc_filevp exists (vp = %p)", hfsmp->hfc_filevp);
1800 error = VFS_ROOT(HFSTOVFS(hfsmp), &dvp, ctx);
1820 if (hfs_start_transaction(hfsmp) != 0) {
1828 printf("hfs: error %d creating HFBT on %s\n", error, HFSTOVCB(hfsmp)->vcbVN);
1846 printf("hfs: created HFBT on %s\n", HFSTOVCB(hfsmp)->vcbVN);
1905 hotfileinfo->maxfileblks = SWAP_BE32 (HFC_MAXIMUM_FILESIZE / HFSTOVCB(hfsmp)->blockSize);
1921 printf("hfs: error %d growing HFBT on %s\n", error, HFSTOVCB(hfsmp)->vcbVN);
1945 printf("hfs: error %d writing HFBT on %s\n", error, HFSTOVCB(hfsmp)->vcbVN);
1952 hfs_end_transaction(hfsmp);