+ freeblks = hfs_freeblks(hfsmp, 1);
+
+ if (freeblks < hfsmp->hfs_freespace_notify_dangerlimit) {
+ state = 2;
+ } else if (freeblks < hfsmp->hfs_freespace_notify_warninglimit) {
+ state = 1;
+ } else if (freeblks >= hfsmp->hfs_freespace_notify_desiredlevel) {
+ state = 0;
+ }
+
+ /* Free blocks are less than dangerlimit for the first time */
+ if (state == 2 && !(hfsmp->hfs_notification_conditions & VQ_VERYLOWDISK)) {
+ /* Dump some logging to track down intermittent issues */
+ printf("hfs: set VeryLowDisk: vol:%s, freeblks:%d, dangerlimit:%d\n", hfsmp->vcbVN, freeblks, hfsmp->hfs_freespace_notify_dangerlimit);
+
+#if HFS_SPARSE_DEV
+ // If we're a sparse device, dump some info about the backing store..
+ hfs_lock_mount(hfsmp);
+ vnode_t backing_vp = hfsmp->hfs_backingfs_rootvp;
+ if (backing_vp && vnode_get(backing_vp) != 0)
+ backing_vp = NULL;
+ hfs_unlock_mount(hfsmp);
+
+ if (backing_vp) {
+ struct mount *mp = vnode_mount(backing_vp);
+ printf("hfs: set VeryLowDisk: vol:%s, backingstore b_avail:%lld, tag:%d\n",
+ hfsmp->vcbVN, mp->mnt_vfsstat.f_bavail, backing_vp->v_tag);
+ vnode_put(backing_vp);
+ }
+#endif
+
+ hfsmp->hfs_notification_conditions |= (VQ_VERYLOWDISK|VQ_LOWDISK);
+ vfs_event_signal(&fsid, hfsmp->hfs_notification_conditions, (intptr_t)NULL);
+ } else if (state == 1) {
+ /* Free blocks are less than warning limit for the first time */
+ if (!(hfsmp->hfs_notification_conditions & VQ_LOWDISK)) {
+ printf("hfs: set LowDisk: vol:%s, freeblks:%d, warninglimit:%d\n", hfsmp->vcbVN, freeblks, hfsmp->hfs_freespace_notify_warninglimit);
+ hfsmp->hfs_notification_conditions |= VQ_LOWDISK;
+ vfs_event_signal(&fsid, hfsmp->hfs_notification_conditions, (intptr_t)NULL);
+ } else if (hfsmp->hfs_notification_conditions & VQ_VERYLOWDISK) {
+ /* Free blocks count has increased from danger limit to warning limit, so just clear VERYLOWDISK warning */
+ printf("hfs: clear VeryLowDisk: vol:%s, freeblks:%d, dangerlimit:%d\n", hfsmp->vcbVN, freeblks, hfsmp->hfs_freespace_notify_dangerlimit);
+ hfsmp->hfs_notification_conditions &= ~VQ_VERYLOWDISK;
+ vfs_event_signal(&fsid, hfsmp->hfs_notification_conditions, (intptr_t)NULL);