]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/xfs/xfs_qm.c
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / fs / xfs / xfs_qm.c
index ecd8ce152ab1f0040330f1bbe4f62511f4dd9253..0b0909657bad905830fbad700e01c852c05ec2cb 100644 (file)
@@ -22,6 +22,7 @@
 #include "xfs_qm.h"
 #include "xfs_trace.h"
 #include "xfs_icache.h"
+#include "xfs_error.h"
 
 /*
  * The global quota manager. There is only one of these for the entire
  * quota functionality, including maintaining the freelist and hash
  * tables of dquots.
  */
-STATIC int     xfs_qm_init_quotainos(xfs_mount_t *);
-STATIC int     xfs_qm_init_quotainfo(xfs_mount_t *);
+STATIC int     xfs_qm_init_quotainos(struct xfs_mount *mp);
+STATIC int     xfs_qm_init_quotainfo(struct xfs_mount *mp);
 
-STATIC void    xfs_qm_destroy_quotainos(xfs_quotainfo_t *qi);
+STATIC void    xfs_qm_destroy_quotainos(struct xfs_quotainfo *qi);
 STATIC void    xfs_qm_dqfree_one(struct xfs_dquot *dqp);
 /*
  * We use the batch lookup interface to iterate over the dquots as it
@@ -243,14 +244,14 @@ xfs_qm_unmount_quotas(
 
 STATIC int
 xfs_qm_dqattach_one(
-       xfs_inode_t     *ip,
-       xfs_dqid_t      id,
-       uint            type,
-       bool            doalloc,
-       xfs_dquot_t     **IO_idqpp)
+       struct xfs_inode        *ip,
+       xfs_dqid_t              id,
+       uint                    type,
+       bool                    doalloc,
+       struct xfs_dquot        **IO_idqpp)
 {
-       xfs_dquot_t     *dqp;
-       int             error;
+       struct xfs_dquot        *dqp;
+       int                     error;
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
        error = 0;
@@ -341,7 +342,7 @@ xfs_qm_dqattach_locked(
        }
 
        if (XFS_IS_PQUOTA_ON(mp) && !ip->i_pdquot) {
-               error = xfs_qm_dqattach_one(ip, xfs_get_projid(ip), XFS_DQ_PROJ,
+               error = xfs_qm_dqattach_one(ip, ip->i_d.di_projid, XFS_DQ_PROJ,
                                doalloc, &ip->i_pdquot);
                if (error)
                        goto done;
@@ -539,12 +540,12 @@ xfs_qm_shrink_count(
 
 STATIC void
 xfs_qm_set_defquota(
-       xfs_mount_t     *mp,
-       uint            type,
-       xfs_quotainfo_t *qinf)
+       struct xfs_mount        *mp,
+       uint                    type,
+       struct xfs_quotainfo    *qinf)
 {
-       xfs_dquot_t             *dqp;
-       struct xfs_def_quota    *defq;
+       struct xfs_dquot        *dqp;
+       struct xfs_def_quota    *defq;
        struct xfs_disk_dquot   *ddqp;
        int                     error;
 
@@ -642,7 +643,7 @@ xfs_qm_init_quotainfo(
 
        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
-       qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), 0);
+       qinf = mp->m_quotainfo = kmem_zalloc(sizeof(struct xfs_quotainfo), 0);
 
        error = list_lru_init(&qinf->qi_lru);
        if (error)
@@ -709,9 +710,9 @@ xfs_qm_init_quotainfo(
  */
 void
 xfs_qm_destroy_quotainfo(
-       xfs_mount_t     *mp)
+       struct xfs_mount        *mp)
 {
-       xfs_quotainfo_t *qi;
+       struct xfs_quotainfo    *qi;
 
        qi = mp->m_quotainfo;
        ASSERT(qi != NULL);
@@ -754,11 +755,15 @@ xfs_qm_qino_alloc(
                if ((flags & XFS_QMOPT_PQUOTA) &&
                             (mp->m_sb.sb_gquotino != NULLFSINO)) {
                        ino = mp->m_sb.sb_gquotino;
-                       ASSERT(mp->m_sb.sb_pquotino == NULLFSINO);
+                       if (XFS_IS_CORRUPT(mp,
+                                          mp->m_sb.sb_pquotino != NULLFSINO))
+                               return -EFSCORRUPTED;
                } else if ((flags & XFS_QMOPT_GQUOTA) &&
                             (mp->m_sb.sb_pquotino != NULLFSINO)) {
                        ino = mp->m_sb.sb_pquotino;
-                       ASSERT(mp->m_sb.sb_gquotino == NULLFSINO);
+                       if (XFS_IS_CORRUPT(mp,
+                                          mp->m_sb.sb_gquotino != NULLFSINO))
+                               return -EFSCORRUPTED;
                }
                if (ino != NULLFSINO) {
                        error = xfs_iget(mp, NULL, ino, 0, 0, ip);
@@ -1559,7 +1564,7 @@ xfs_qm_init_quotainos(
 
 STATIC void
 xfs_qm_destroy_quotainos(
-       xfs_quotainfo_t *qi)
+       struct xfs_quotainfo    *qi)
 {
        if (qi->qi_uquotaip) {
                xfs_irele(qi->qi_uquotaip);
@@ -1693,7 +1698,7 @@ xfs_qm_vop_dqalloc(
                }
        }
        if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
-               if (xfs_get_projid(ip) != prid) {
+               if (ip->i_d.di_projid != prid) {
                        xfs_iunlock(ip, lockflags);
                        error = xfs_qm_dqget(mp, (xfs_dqid_t)prid, XFS_DQ_PROJ,
                                        true, &pq);
@@ -1737,14 +1742,14 @@ xfs_qm_vop_dqalloc(
  * Actually transfer ownership, and do dquot modifications.
  * These were already reserved.
  */
-xfs_dquot_t *
+struct xfs_dquot *
 xfs_qm_vop_chown(
-       xfs_trans_t     *tp,
-       xfs_inode_t     *ip,
-       xfs_dquot_t     **IO_olddq,
-       xfs_dquot_t     *newdq)
+       struct xfs_trans        *tp,
+       struct xfs_inode        *ip,
+       struct xfs_dquot        **IO_olddq,
+       struct xfs_dquot        *newdq)
 {
-       xfs_dquot_t     *prevdq;
+       struct xfs_dquot        *prevdq;
        uint            bfield = XFS_IS_REALTIME_INODE(ip) ?
                                 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
 
@@ -1827,7 +1832,7 @@ xfs_qm_vop_chown_reserve(
        }
 
        if (XFS_IS_PQUOTA_ON(ip->i_mount) && pdqp &&
-           xfs_get_projid(ip) != be32_to_cpu(pdqp->q_core.d_id)) {
+           ip->i_d.di_projid != be32_to_cpu(pdqp->q_core.d_id)) {
                prjflags = XFS_QMOPT_ENOSPC;
                pdq_delblks = pdqp;
                if (delblks) {
@@ -1928,7 +1933,7 @@ xfs_qm_vop_create_dqattach(
        }
        if (pdqp && XFS_IS_PQUOTA_ON(mp)) {
                ASSERT(ip->i_pdquot == NULL);
-               ASSERT(xfs_get_projid(ip) == be32_to_cpu(pdqp->q_core.d_id));
+               ASSERT(ip->i_d.di_projid == be32_to_cpu(pdqp->q_core.d_id));
 
                ip->i_pdquot = xfs_qm_dqhold(pdqp);
                xfs_trans_mod_dquot(tp, pdqp, XFS_TRANS_DQ_ICOUNT, 1);