if (!ip->i_di.di_size) {
                ip->i_height = 0;
-               ip->i_di.di_goal_meta =
-                       ip->i_di.di_goal_data =
-                       ip->i_no_addr;
+               ip->i_goal = ip->i_no_addr;
                gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
        }
        ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
 
 struct gfs2_dinode_host {
        u64 di_size;            /* number of bytes in file */
        u64 di_blocks;          /* number of blocks in file */
-       u64 di_goal_meta;       /* rgrp to alloc from next */
-       u64 di_goal_data;       /* data block goal */
        u64 di_generation;      /* generation number for NFS */
        u32 di_flags;           /* GFS2_DIF_... */
        /* These only apply to directories  */
        struct gfs2_holder i_iopen_gh;
        struct gfs2_holder i_gh; /* for prepare/commit_write only */
        struct gfs2_alloc *i_alloc;
-       u64 i_last_rg_alloc;
-
+       u64 i_goal;     /* goal block for allocations */
        struct rw_semaphore i_rw_mutex;
        u8 i_height;
        u8 i_depth;
 
        ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
        ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
 
-       di->di_goal_meta = be64_to_cpu(str->di_goal_meta);
-       di->di_goal_data = be64_to_cpu(str->di_goal_data);
+       ip->i_goal = be64_to_cpu(str->di_goal_meta);
        di->di_generation = be64_to_cpu(str->di_generation);
 
        di->di_flags = be32_to_cpu(str->di_flags);
        str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
        str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec);
 
-       str->di_goal_meta = cpu_to_be64(di->di_goal_meta);
-       str->di_goal_data = cpu_to_be64(di->di_goal_data);
+       str->di_goal_meta = cpu_to_be64(ip->i_goal);
+       str->di_goal_data = cpu_to_be64(ip->i_goal);
        str->di_generation = cpu_to_be64(di->di_generation);
 
        str->di_flags = cpu_to_be32(di->di_flags);
        printk(KERN_INFO "  di_size = %llu\n", (unsigned long long)di->di_size);
        printk(KERN_INFO "  di_blocks = %llu\n",
               (unsigned long long)di->di_blocks);
-       printk(KERN_INFO "  di_goal_meta = %llu\n",
-              (unsigned long long)di->di_goal_meta);
-       printk(KERN_INFO "  di_goal_data = %llu\n",
-              (unsigned long long)di->di_goal_data);
+       printk(KERN_INFO "  i_goal = %llu\n",
+              (unsigned long long)ip->i_goal);
        printk(KERN_INFO "  di_flags = 0x%.8X\n", di->di_flags);
        printk(KERN_INFO "  i_height = %u\n", ip->i_height);
        printk(KERN_INFO "  i_depth = %u\n", ip->i_depth);
 
 static struct gfs2_rgrpd *recent_rgrp_first(struct gfs2_sbd *sdp,
                                            u64 rglast)
 {
-       struct gfs2_rgrpd *rgd = NULL;
+       struct gfs2_rgrpd *rgd;
 
        spin_lock(&sdp->sd_rindex_spin);
 
-       if (list_empty(&sdp->sd_rindex_recent_list))
-               goto out;
-
-       if (!rglast)
-               goto first;
-
-       list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
-               if (rgd->rd_addr == rglast)
-                       goto out;
+       if (rglast) {
+               list_for_each_entry(rgd, &sdp->sd_rindex_recent_list, rd_recent) {
+                       if (rgrp_contains_block(rgd, rglast))
+                               goto out;
+               }
        }
-
-first:
-       rgd = list_entry(sdp->sd_rindex_recent_list.next, struct gfs2_rgrpd,
-                        rd_recent);
+       rgd = NULL;
+       if (!list_empty(&sdp->sd_rindex_recent_list))
+               rgd = list_entry(sdp->sd_rindex_recent_list.next,
+                                struct gfs2_rgrpd, rd_recent);
 out:
        spin_unlock(&sdp->sd_rindex_spin);
        return rgd;
 
        /* Try recently successful rgrps */
 
-       rgd = recent_rgrp_first(sdp, ip->i_last_rg_alloc);
+       rgd = recent_rgrp_first(sdp, ip->i_goal);
 
        while (rgd) {
                rg_locked = 0;
        }
 
 out:
-       ip->i_last_rg_alloc = rgd->rd_addr;
-
        if (begin) {
                recent_rgrp_add(rgd);
                rgd = gfs2_rgrpd_get_next(rgd);
        u32 goal, blk;
        u64 block;
 
-       if (rgrp_contains_block(rgd, ip->i_di.di_goal_data))
-               goal = ip->i_di.di_goal_data - rgd->rd_data0;
+       if (rgrp_contains_block(rgd, ip->i_goal))
+               goal = ip->i_goal - rgd->rd_data0;
        else
                goal = rgd->rd_last_alloc_data;
 
        rgd->rd_last_alloc_data = blk;
 
        block = rgd->rd_data0 + blk;
-       ip->i_di.di_goal_data = block;
+       ip->i_goal = block;
 
        gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
        rgd->rd_rg.rg_free--;
        u32 goal, blk;
        u64 block;
 
-       if (rgrp_contains_block(rgd, ip->i_di.di_goal_meta))
-               goal = ip->i_di.di_goal_meta - rgd->rd_data0;
+       if (rgrp_contains_block(rgd, ip->i_goal))
+               goal = ip->i_goal - rgd->rd_data0;
        else
                goal = rgd->rd_last_alloc_meta;
 
        rgd->rd_last_alloc_meta = blk;
 
        block = rgd->rd_data0 + blk;
-       ip->i_di.di_goal_meta = block;
+       ip->i_goal = block;
 
        gfs2_assert_withdraw(sdp, rgd->rd_rg.rg_free);
        rgd->rd_rg.rg_free--;