GFS2: Make rgrp reservations part of the gfs2_inode structure
[linux-drm-fsl-dcu.git] / fs / gfs2 / rgrp.c
index cb30748e7b19a37444e13ecdd3c4ed1c3c383eed..b879925ce134978c23baf08c2b9106ba3eec6d2e 100644 (file)
@@ -602,28 +602,7 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd)
  */
 int gfs2_rsqa_alloc(struct gfs2_inode *ip)
 {
-       int error = 0;
-
-       down_write(&ip->i_rw_mutex);
-       if (ip->i_res)
-               goto out;
-
-       ip->i_res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);
-       if (!ip->i_res) {
-               error = -ENOMEM;
-               goto out;
-       }
-
-       RB_CLEAR_NODE(&ip->i_res->rs_node);
-       error = gfs2_qa_alloc(ip);
-       if (error) {
-               kmem_cache_free(gfs2_rsrv_cachep, ip->i_res);
-               ip->i_res = NULL;
-       }
-
-out:
-       up_write(&ip->i_rw_mutex);
-       return error;
+       return gfs2_qa_alloc(ip);
 }
 
 static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs)
@@ -693,15 +672,12 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs)
 void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount)
 {
        down_write(&ip->i_rw_mutex);
-       if (ip->i_res && ((wcount == NULL) || (atomic_read(wcount) <= 1))) {
-               gfs2_rs_deltree(ip->i_res);
-               BUG_ON(ip->i_res->rs_free);
-               kmem_cache_free(gfs2_rsrv_cachep, ip->i_res);
-               ip->i_res = NULL;
-
-               gfs2_qa_delete(ip);
+       if ((wcount == NULL) || (atomic_read(wcount) <= 1)) {
+               gfs2_rs_deltree(&ip->i_res);
+               BUG_ON(ip->i_res.rs_free);
        }
        up_write(&ip->i_rw_mutex);
+       gfs2_qa_delete(ip, wcount);
 }
 
 /**
@@ -1465,7 +1441,7 @@ static void rs_insert(struct gfs2_inode *ip)
 {
        struct rb_node **newn, *parent = NULL;
        int rc;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        struct gfs2_rgrpd *rgd = rs->rs_rbm.rgd;
        u64 fsblock = gfs2_rbm_to_block(&rs->rs_rbm);
 
@@ -1512,7 +1488,7 @@ static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip,
 {
        struct gfs2_rbm rbm = { .rgd = rgd, };
        u64 goal;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        u32 extlen;
        u32 free_blocks = rgd->rd_free_clone - rgd->rd_reserved;
        int ret;
@@ -1583,7 +1559,7 @@ static u64 gfs2_next_unreserved_block(struct gfs2_rgrpd *rgd, u64 block,
        }
 
        if (n) {
-               while ((rs_cmp(block, length, rs) == 0) && (ip->i_res != rs)) {
+               while ((rs_cmp(block, length, rs) == 0) && (&ip->i_res != rs)) {
                        block = gfs2_rbm_to_block(&rs->rs_rbm) + rs->rs_free;
                        n = n->rb_right;
                        if (n == NULL)
@@ -1993,7 +1969,7 @@ int gfs2_inplace_reserve(struct gfs2_inode *ip, struct gfs2_alloc_parms *ap)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
        struct gfs2_rgrpd *begin = NULL;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        int error = 0, rg_locked, flags = 0;
        u64 last_unlinked = NO_BLOCK;
        int loops = 0;
@@ -2122,7 +2098,7 @@ next_rgrp:
 
 void gfs2_inplace_release(struct gfs2_inode *ip)
 {
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
 
        if (rs->rs_rgd_gh.gh_gl)
                gfs2_glock_dq_uninit(&rs->rs_rgd_gh);
@@ -2276,7 +2252,7 @@ static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd)
 static void gfs2_adjust_reservation(struct gfs2_inode *ip,
                                    const struct gfs2_rbm *rbm, unsigned len)
 {
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        struct gfs2_rgrpd *rgd = rbm->rgd;
        unsigned rlen;
        u64 block;
@@ -2319,8 +2295,8 @@ static void gfs2_set_alloc_start(struct gfs2_rbm *rbm,
 {
        u64 goal;
 
-       if (gfs2_rs_active(ip->i_res)) {
-               *rbm = ip->i_res->rs_rbm;
+       if (gfs2_rs_active(&ip->i_res)) {
+               *rbm = ip->i_res.rs_rbm;
                return;
        }
 
@@ -2374,7 +2350,7 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
        gfs2_alloc_extent(&rbm, dinode, nblocks);
        block = gfs2_rbm_to_block(&rbm);
        rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0;
-       if (gfs2_rs_active(ip->i_res))
+       if (gfs2_rs_active(&ip->i_res))
                gfs2_adjust_reservation(ip, &rbm, *nblocks);
        ndata = *nblocks;
        if (dinode)