GFS2: Fold quota data into the reservations struct
[linux-block.git] / fs / gfs2 / quota.c
index 197cc2dade7f6a8a38573e16808be3f4b6acf70d..7d1ede7b66fc5258d22570178ff716ebff613c38 100644 (file)
@@ -494,11 +494,15 @@ static void qdsb_put(struct gfs2_quota_data *qd)
 int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
-       struct gfs2_qadata *qa = ip->i_qadata;
-       struct gfs2_quota_data **qd = qa->qa_qd;
+       struct gfs2_quota_data **qd;
        int error;
 
-       if (gfs2_assert_warn(sdp, !qa->qa_qd_num) ||
+       if (ip->i_res == NULL)
+               gfs2_rs_alloc(ip);
+
+       qd = ip->i_res->rs_qa_qd;
+
+       if (gfs2_assert_warn(sdp, !ip->i_res->rs_qa_qd_num) ||
            gfs2_assert_warn(sdp, !test_bit(GIF_QD_LOCKED, &ip->i_flags)))
                return -EIO;
 
@@ -508,20 +512,20 @@ int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
        error = qdsb_get(sdp, QUOTA_USER, ip->i_inode.i_uid, qd);
        if (error)
                goto out;
-       qa->qa_qd_num++;
+       ip->i_res->rs_qa_qd_num++;
        qd++;
 
        error = qdsb_get(sdp, QUOTA_GROUP, ip->i_inode.i_gid, qd);
        if (error)
                goto out;
-       qa->qa_qd_num++;
+       ip->i_res->rs_qa_qd_num++;
        qd++;
 
        if (uid != NO_QUOTA_CHANGE && uid != ip->i_inode.i_uid) {
                error = qdsb_get(sdp, QUOTA_USER, uid, qd);
                if (error)
                        goto out;
-               qa->qa_qd_num++;
+               ip->i_res->rs_qa_qd_num++;
                qd++;
        }
 
@@ -529,7 +533,7 @@ int gfs2_quota_hold(struct gfs2_inode *ip, u32 uid, u32 gid)
                error = qdsb_get(sdp, QUOTA_GROUP, gid, qd);
                if (error)
                        goto out;
-               qa->qa_qd_num++;
+               ip->i_res->rs_qa_qd_num++;
                qd++;
        }
 
@@ -542,16 +546,17 @@ out:
 void gfs2_quota_unhold(struct gfs2_inode *ip)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
-       struct gfs2_qadata *qa = ip->i_qadata;
        unsigned int x;
 
+       if (ip->i_res == NULL)
+               return;
        gfs2_assert_warn(sdp, !test_bit(GIF_QD_LOCKED, &ip->i_flags));
 
-       for (x = 0; x < qa->qa_qd_num; x++) {
-               qdsb_put(qa->qa_qd[x]);
-               qa->qa_qd[x] = NULL;
+       for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
+               qdsb_put(ip->i_res->rs_qa_qd[x]);
+               ip->i_res->rs_qa_qd[x] = NULL;
        }
-       qa->qa_qd_num = 0;
+       ip->i_res->rs_qa_qd_num = 0;
 }
 
 static int sort_qd(const void *a, const void *b)
@@ -919,7 +924,6 @@ fail:
 int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
-       struct gfs2_qadata *qa = ip->i_qadata;
        struct gfs2_quota_data *qd;
        unsigned int x;
        int error = 0;
@@ -932,15 +936,15 @@ int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
            sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
                return 0;
 
-       sort(qa->qa_qd, qa->qa_qd_num, sizeof(struct gfs2_quota_data *),
-            sort_qd, NULL);
+       sort(ip->i_res->rs_qa_qd, ip->i_res->rs_qa_qd_num,
+            sizeof(struct gfs2_quota_data *), sort_qd, NULL);
 
-       for (x = 0; x < qa->qa_qd_num; x++) {
+       for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
                int force = NO_FORCE;
-               qd = qa->qa_qd[x];
+               qd = ip->i_res->rs_qa_qd[x];
                if (test_and_clear_bit(QDF_REFRESH, &qd->qd_flags))
                        force = FORCE;
-               error = do_glock(qd, force, &qa->qa_qd_ghs[x]);
+               error = do_glock(qd, force, &ip->i_res->rs_qa_qd_ghs[x]);
                if (error)
                        break;
        }
@@ -949,7 +953,7 @@ int gfs2_quota_lock(struct gfs2_inode *ip, u32 uid, u32 gid)
                set_bit(GIF_QD_LOCKED, &ip->i_flags);
        else {
                while (x--)
-                       gfs2_glock_dq_uninit(&qa->qa_qd_ghs[x]);
+                       gfs2_glock_dq_uninit(&ip->i_res->rs_qa_qd_ghs[x]);
                gfs2_quota_unhold(ip);
        }
 
@@ -994,7 +998,6 @@ static int need_sync(struct gfs2_quota_data *qd)
 
 void gfs2_quota_unlock(struct gfs2_inode *ip)
 {
-       struct gfs2_qadata *qa = ip->i_qadata;
        struct gfs2_quota_data *qda[4];
        unsigned int count = 0;
        unsigned int x;
@@ -1002,14 +1005,14 @@ void gfs2_quota_unlock(struct gfs2_inode *ip)
        if (!test_and_clear_bit(GIF_QD_LOCKED, &ip->i_flags))
                goto out;
 
-       for (x = 0; x < qa->qa_qd_num; x++) {
+       for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
                struct gfs2_quota_data *qd;
                int sync;
 
-               qd = qa->qa_qd[x];
+               qd = ip->i_res->rs_qa_qd[x];
                sync = need_sync(qd);
 
-               gfs2_glock_dq_uninit(&qa->qa_qd_ghs[x]);
+               gfs2_glock_dq_uninit(&ip->i_res->rs_qa_qd_ghs[x]);
 
                if (sync && qd_trylock(qd))
                        qda[count++] = qd;
@@ -1042,7 +1045,6 @@ static int print_message(struct gfs2_quota_data *qd, char *type)
 int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
-       struct gfs2_qadata *qa = ip->i_qadata;
        struct gfs2_quota_data *qd;
        s64 value;
        unsigned int x;
@@ -1054,8 +1056,8 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
         if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
                 return 0;
 
-       for (x = 0; x < qa->qa_qd_num; x++) {
-               qd = qa->qa_qd[x];
+       for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
+               qd = ip->i_res->rs_qa_qd[x];
 
                if (!((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) ||
                      (qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags))))
@@ -1093,7 +1095,6 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
 void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
                       u32 uid, u32 gid)
 {
-       struct gfs2_qadata *qa = ip->i_qadata;
        struct gfs2_quota_data *qd;
        unsigned int x;
 
@@ -1102,8 +1103,8 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
        if (ip->i_diskflags & GFS2_DIF_SYSTEM)
                return;
 
-       for (x = 0; x < qa->qa_qd_num; x++) {
-               qd = qa->qa_qd[x];
+       for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
+               qd = ip->i_res->rs_qa_qd[x];
 
                if ((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) ||
                    (qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags))) {