]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/hfs/hfs_quota.c
xnu-1228.9.59.tar.gz
[apple/xnu.git] / bsd / hfs / hfs_quota.c
index b2945e081d3739ba7cc58698ff88eb6e40058036..56bc0e4dc87474230c99d28521e95b1878d7158d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002-2005 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -73,6 +73,7 @@
 #include <sys/proc.h>
 #include <sys/kauth.h>
 #include <sys/vnode.h>
+#include <sys/vnode_internal.h>
 #include <sys/quota.h>
 #include <sys/proc_internal.h>
 #include <kern/kalloc.h>
@@ -82,6 +83,7 @@
 #include <hfs/hfs_quota.h>
 #include <hfs/hfs_mount.h>
 
+
 /*
  * Quota name to error message mapping.
  */
@@ -357,7 +359,7 @@ hfs_chkiqchg(cp, change, cred, type)
        int type;
 {
        register struct dquot *dq = cp->c_dquot[type];
-       long ncurinodes;
+       unsigned long ncurinodes;
        struct vnode *vp = cp->c_vp ? cp->c_vp : cp->c_rsrc_vp;
 
        dqlock(dq);
@@ -481,6 +483,9 @@ hfs_quotaon(p, mp, type, fnamep)
        int error = 0;
        struct hfs_quotaon_cargs args;
 
+       /* Finish setting up quota structures. */
+       dqhashinit();
+
        qfp = &hfsmp->hfs_qfiles[type];
 
        if ( (qf_get(qfp, QTF_OPENING)) )
@@ -495,7 +500,10 @@ hfs_quotaon(p, mp, type, fnamep)
                error = EACCES;
                goto out;
        }
-       vfs_setflags(mp, (uint64_t)((unsigned int)MNT_QUOTA));
+       vfs_setflags(mp, (u_int64_t)((unsigned int)MNT_QUOTA));
+       HFS_MOUNT_LOCK(hfsmp, TRUE)
+       hfsmp->hfs_flags |= HFS_QUOTAS;
+       HFS_MOUNT_UNLOCK(hfsmp, TRUE);
        vnode_setnoflush(vp);
        /*
         * Save the credential of the process that turned on quotas.
@@ -579,6 +587,12 @@ hfs_quotaoff(__unused struct proc *p, struct mount *mp, register int type)
        int error;
        struct hfs_quotaoff_cargs args;
 
+       /*
+        * If quotas haven't been initialized, there's no work to be done.
+        */
+       if (!dqisinitialized())
+               return (0);
+
        qfp = &hfsmp->hfs_qfiles[type];
        
        if ( (qf_get(qfp, QTF_CLOSING)) )
@@ -617,8 +631,12 @@ hfs_quotaoff(__unused struct proc *p, struct mount *mp, register int type)
        for (type = 0; type < MAXQUOTAS; type++)
                if (hfsmp->hfs_qfiles[type].qf_vp != NULLVP)
                        break;
-       if (type == MAXQUOTAS)
-               vfs_clearflags(mp, (uint64_t)((unsigned int)MNT_QUOTA));
+       if (type == MAXQUOTAS) {
+               vfs_clearflags(mp, (u_int64_t)((unsigned int)MNT_QUOTA));
+               HFS_MOUNT_LOCK(hfsmp, TRUE)
+               hfsmp->hfs_flags &= ~HFS_QUOTAS;
+               HFS_MOUNT_UNLOCK(hfsmp, TRUE);
+       }
 
        qf_put(qfp, QTF_CLOSING);
 
@@ -790,6 +808,9 @@ hfs_qsync(mp)
        struct hfsmount *hfsmp = VFSTOHFS(mp);
        int i;
 
+       if (!dqisinitialized())
+               return (0);
+
        /*
         * Check if the mount point has any quotas.
         * If not, simply return.