When reading a resource group from disk or when receiving the resource group
statistics from a Lock Value Block (LVB), set/clear the GBF_FULL flags of the
bitmaps in that resource group according to whether the resource group is full
or not.

Signed-off-by: Andreas Gruenbacher <[email protected]>
---
 fs/gfs2/rgrp.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index fcca1cd58ab3..d96e76e91769 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1165,6 +1165,23 @@ static u32 count_unlinked(struct gfs2_rgrpd *rgd)
        return count;
 }
 
+static void rgrp_set_bitmap_flags(struct gfs2_rgrpd *rgd)
+{
+       struct gfs2_bitmap *bi;
+       int x;
+
+       if (rgd->rd_free) {
+               for (x = 0; x < rgd->rd_length; x++) {
+                       bi = rgd->rd_bits + x;
+                       clear_bit(GBF_FULL, &bi->bi_flags);
+               }
+       } else {
+               for (x = 0; x < rgd->rd_length; x++) {
+                       bi = rgd->rd_bits + x;
+                       set_bit(GBF_FULL, &bi->bi_flags);
+               }
+       }
+}
 
 /**
  * gfs2_rgrp_bh_get - Read in a RG's header and bitmaps
@@ -1208,9 +1225,8 @@ static int gfs2_rgrp_bh_get(struct gfs2_rgrpd *rgd)
        }
 
        if (!(rgd->rd_flags & GFS2_RDF_UPTODATE)) {
-               for (x = 0; x < length; x++)
-                       clear_bit(GBF_FULL, &rgd->rd_bits[x].bi_flags);
                gfs2_rgrp_in(rgd, (rgd->rd_bits[0].bi_bh)->b_data);
+               rgrp_set_bitmap_flags(rgd);
                rgd->rd_flags |= (GFS2_RDF_UPTODATE | GFS2_RDF_CHECK);
                rgd->rd_free_clone = rgd->rd_free;
                /* max out the rgrp allocation failure point */
@@ -1260,6 +1276,7 @@ static int update_rgrp_lvb(struct gfs2_rgrpd *rgd)
        if (rgd->rd_rgl->rl_unlinked == 0)
                rgd->rd_flags &= ~GFS2_RDF_CHECK;
        rgd->rd_free = be32_to_cpu(rgd->rd_rgl->rl_free);
+       rgrp_set_bitmap_flags(rgd);
        rgd->rd_free_clone = rgd->rd_free;
        rgd->rd_dinodes = be32_to_cpu(rgd->rd_rgl->rl_dinodes);
        rgd->rd_igeneration = be64_to_cpu(rgd->rd_rgl->rl_igeneration);
-- 
2.26.2

Reply via email to