OSDN Git Service

gfs2: Stop messing with ip->i_rgd in the rlist code
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 21 Jun 2018 12:22:12 +0000 (07:22 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Wed, 4 Jul 2018 20:38:42 +0000 (21:38 +0100)
In the resource group list code, keep the last resource group added in
the last position in the array.  Check against that instead of messing
with ip->i_rgd.

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

index 7a001f6..ecdc4cb 100644 (file)
@@ -2559,19 +2559,35 @@ void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist,
        if (gfs2_assert_warn(sdp, !rlist->rl_ghs))
                return;
 
-       if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, block))
-               rgd = ip->i_rgd;
-       else
+       /*
+        * The resource group last accessed is kept in the last position.
+        */
+
+       if (rlist->rl_rgrps) {
+               rgd = rlist->rl_rgd[rlist->rl_rgrps - 1];
+               if (rgrp_contains_block(rgd, block))
+                       return;
                rgd = gfs2_blk2rgrpd(sdp, block, 1);
+       } else {
+               rgd = ip->i_rgd;
+               if (!rgd || !rgrp_contains_block(rgd, block))
+                       rgd = gfs2_blk2rgrpd(sdp, block, 1);
+       }
+
        if (!rgd) {
-               fs_err(sdp, "rlist_add: no rgrp for block %llu\n", (unsigned long long)block);
+               fs_err(sdp, "rlist_add: no rgrp for block %llu\n",
+                      (unsigned long long)block);
                return;
        }
        ip->i_rgd = rgd;
 
-       for (x = 0; x < rlist->rl_rgrps; x++)
-               if (rlist->rl_rgd[x] == rgd)
+       for (x = 0; x < rlist->rl_rgrps; x++) {
+               if (rlist->rl_rgd[x] == rgd) {
+                       swap(rlist->rl_rgd[x],
+                            rlist->rl_rgd[rlist->rl_rgrps - 1]);
                        return;
+               }
+       }
 
        if (rlist->rl_rgrps == rlist->rl_space) {
                new_space = rlist->rl_space + 10;