]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/hfs/hfs_vfsops.c
xnu-792.6.22.tar.gz
[apple/xnu.git] / bsd / hfs / hfs_vfsops.c
index f6569bf7191c3ee993257477efff010d27024dd8..7ebe8aff727050771fff87363d7dc9037f378960 100644 (file)
@@ -860,6 +860,7 @@ hfs_mountfs(struct vnode *devvp, struct mount *mp, struct hfs_mount_args *args,
        lck_mtx_init(&hfsmp->hfs_mutex, hfs_mutex_group, hfs_lock_attr);
        lck_mtx_init(&hfsmp->hfc_mutex, hfs_mutex_group, hfs_lock_attr);
        lck_rw_init(&hfsmp->hfs_global_lock, hfs_rwlock_group, hfs_lock_attr);
        lck_mtx_init(&hfsmp->hfs_mutex, hfs_mutex_group, hfs_lock_attr);
        lck_mtx_init(&hfsmp->hfc_mutex, hfs_mutex_group, hfs_lock_attr);
        lck_rw_init(&hfsmp->hfs_global_lock, hfs_rwlock_group, hfs_lock_attr);
+       lck_rw_init(&hfsmp->hfs_insync, hfs_rwlock_group, hfs_lock_attr);
 
        vfs_setfsprivate(mp, hfsmp);
        hfsmp->hfs_mp = mp;                     /* Make VFSTOHFS work */
 
        vfs_setfsprivate(mp, hfsmp);
        hfsmp->hfs_mp = mp;                     /* Make VFSTOHFS work */
@@ -1655,6 +1656,10 @@ hfs_sync(struct mount *mp, int waitfor, vfs_context_t context)
        if (hfsmp->hfs_flags & HFS_READ_ONLY)
                return (EROFS);
 
        if (hfsmp->hfs_flags & HFS_READ_ONLY)
                return (EROFS);
 
+       /* skip over frozen volumes */
+       if (!lck_rw_try_lock_shared(&hfsmp->hfs_insync))
+               return 0;
+
        args.cred = vfs_context_proc(context);
        args.waitfor = waitfor;
        args.p = p;
        args.cred = vfs_context_proc(context);
        args.waitfor = waitfor;
        args.p = p;
@@ -1734,7 +1739,8 @@ hfs_sync(struct mount *mp, int waitfor, vfs_context_t context)
        if (hfsmp->jnl) {
            journal_flush(hfsmp->jnl);
        }
        if (hfsmp->jnl) {
            journal_flush(hfsmp->jnl);
        }
-       
+
+       lck_rw_unlock_shared(&hfsmp->hfs_insync);       
        return (allerror);
 }
 
        return (allerror);
 }