gfs2: Eliminate redundant ip->i_rgd
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 21 Jun 2018 12:42:37 +0000 (07:42 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Thu, 5 Jul 2018 15:47:16 +0000 (17:47 +0200)
GFS2 remembers the last rgrp used for allocations in ip->i_rgd.
However, block allocations are made by way of a reservations structure,
ip->i_res, which keeps the last rgrp in ip->i_res.rs_rgd, and ip->i_res
is kept in sync with ip->i_res.rs_rgd, so it's redundant.  Get rid of
ip->i_rgd and just use ip->i_res.rs_rgd in its place.

Based on patches by Robert Peterson.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/incore.h
fs/gfs2/rgrp.c
fs/gfs2/super.c
fs/gfs2/trans.h

index e9cd2cc..b509082 100644 (file)
@@ -397,7 +397,6 @@ struct gfs2_inode {
        struct gfs2_holder i_gh; /* for prepare/commit_write only */
        struct gfs2_qadata *i_qadata; /* quota allocation data */
        struct gfs2_blkreserv i_res; /* rgrp multi-block reservation */
-       struct gfs2_rgrpd *i_rgd;
        u64 i_goal;     /* goal block for allocations */
        struct rw_semaphore i_rw_mutex;
        struct list_head i_ordered;
index ecdc4cb..60c8653 100644 (file)
@@ -1992,8 +1992,9 @@ int gfs2_inplace_reserve(struct gfs2_inode *ip, struct gfs2_alloc_parms *ap)
                return -EINVAL;
        if (gfs2_rs_active(rs)) {
                begin = rs->rs_rbm.rgd;
-       } else if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal)) {
-               rs->rs_rbm.rgd = begin = ip->i_rgd;
+       } else if (rs->rs_rbm.rgd &&
+                  rgrp_contains_block(rs->rs_rbm.rgd, ip->i_goal)) {
+               begin = rs->rs_rbm.rgd;
        } else {
                check_and_update_goal(ip);
                rs->rs_rbm.rgd = begin = gfs2_blk2rgrpd(sdp, ip->i_goal, 1);
@@ -2057,8 +2058,7 @@ int gfs2_inplace_reserve(struct gfs2_inode *ip, struct gfs2_alloc_parms *ap)
                if (rs->rs_rbm.rgd->rd_free_clone >= ap->target ||
                    (loops == 2 && ap->min_target &&
                     rs->rs_rbm.rgd->rd_free_clone >= ap->min_target)) {
-                       ip->i_rgd = rs->rs_rbm.rgd;
-                       ap->allowed = ip->i_rgd->rd_free_clone;
+                       ap->allowed = rs->rs_rbm.rgd->rd_free_clone;
                        return 0;
                }
 check_rgrp:
@@ -2336,7 +2336,7 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
        struct buffer_head *dibh;
-       struct gfs2_rbm rbm = { .rgd = ip->i_rgd, };
+       struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rbm.rgd, };
        unsigned int ndata;
        u64 block; /* block, within the file system scope */
        int error;
@@ -2569,7 +2569,7 @@ void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist,
                        return;
                rgd = gfs2_blk2rgrpd(sdp, block, 1);
        } else {
-               rgd = ip->i_rgd;
+               rgd = ip->i_res.rs_rbm.rgd;
                if (!rgd || !rgrp_contains_block(rgd, block))
                        rgd = gfs2_blk2rgrpd(sdp, block, 1);
        }
@@ -2579,7 +2579,6 @@ void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist,
                       (unsigned long long)block);
                return;
        }
-       ip->i_rgd = rgd;
 
        for (x = 0; x < rlist->rl_rgrps; x++) {
                if (rlist->rl_rgd[x] == rgd) {
index cf5c7f3..685dc6f 100644 (file)
@@ -1729,7 +1729,6 @@ static struct inode *gfs2_alloc_inode(struct super_block *sb)
        if (ip) {
                ip->i_flags = 0;
                ip->i_gl = NULL;
-               ip->i_rgd = NULL;
                memset(&ip->i_res, 0, sizeof(ip->i_res));
                RB_CLEAR_NODE(&ip->i_res.rs_node);
                ip->i_rahead = 0;
index 1e6e7da..ad70087 100644 (file)
@@ -30,9 +30,11 @@ struct gfs2_glock;
  * block, or all of the blocks in the rg, whichever is smaller */
 static inline unsigned int gfs2_rg_blocks(const struct gfs2_inode *ip, unsigned requested)
 {
-       if (requested < ip->i_rgd->rd_length)
+       struct gfs2_rgrpd *rgd = ip->i_res.rs_rbm.rgd;
+
+       if (requested < rgd->rd_length)
                return requested + 1;
-       return ip->i_rgd->rd_length;
+       return rgd->rd_length;
 }
 
 extern int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,