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;
 
                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);
                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:
 {
        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;
                        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);
        }
                       (unsigned long long)block);
                return;
        }
-       ip->i_rgd = rgd;
 
        for (x = 0; x < rlist->rl_rgrps; x++) {
                if (rlist->rl_rgd[x] == rgd) {
 
  * 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,