Skip to contentSkip to conversation

GFS2: Use gfs2_rbm_incr in rgblk_free

PATCH New Bob Peterson 2 participants 2 messages Oct 3, 2014 1 message not in the archive GFS2 file system

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/1 GFS2: Use gfs2_rbm_incr in rgblk_free

Hi,

This patch speeds up GFS2 unlink operations by using function gfs2_rbm_incr rather than continuously calculating the rbm.

Regards,

Bob Peterson
Red Hat File Systems

---

fs/gfs2/rgrp.c +13 -9
index 55ef72d..7474c41 100644
@@ -2097,7 +2097,7 @@ static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart,
 				     u32 blen, unsigned char new_state)
 {
 	struct gfs2_rbm rbm;
-	struct gfs2_bitmap *bi;
+	struct gfs2_bitmap *bi, *bi_prev = NULL;
 
 	rbm.rgd = gfs2_blk2rgrpd(sdp, bstart, 1);
 	if (!rbm.rgd) {
@@ -2106,18 +2106,22 @@ static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart,
 		return NULL;
 	}
 
+	gfs2_rbm_from_block(&rbm, bstart);
 	while (blen--) {
-		gfs2_rbm_from_block(&rbm, bstart);
 		bi = rbm_bi(&rbm);
-		bstart++;
-		if (!bi->bi_clone) {
-			bi->bi_clone = kmalloc(bi->bi_bh->b_size,
-					       GFP_NOFS | __GFP_NOFAIL);
-			memcpy(bi->bi_clone + bi->bi_offset,
-			       bi->bi_bh->b_data + bi->bi_offset, bi->bi_len);
+		if (bi != bi_prev) {
+			if (!bi->bi_clone) {
+				bi->bi_clone = kmalloc(bi->bi_bh->b_size,
+						      GFP_NOFS | __GFP_NOFAIL);
+				memcpy(bi->bi_clone + bi->bi_offset,
+				       bi->bi_bh->b_data + bi->bi_offset,
+				       bi->bi_len);
+			}
+			gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
+			bi_prev = bi;
 		}
-		gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
 		gfs2_setbit(&rbm, false, new_state);
+		gfs2_rbm_incr(&rbm);
 	}
 
 	return rbm.rgd;
#2 lore raw

PATCH 1/1 GFS2: Use gfs2_rbm_incr in rgblk_free

Hi,

Looks like a really nice optimisation. Now in the -nmw tree. Thanks,

Steve.

Quoted 56 lines · Bob Peterson

Hi,

This patch speeds up GFS2 unlink operations by using function gfs2_rbm_incr rather than continuously calculating the rbm.

Regards,

Bob Peterson
Red Hat File Systems

---

fs/gfs2/rgrp.c +13 -9
index 55ef72d..7474c41 100644
@@ -2097,7 +2097,7 @@ static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart,
  				     u32 blen, unsigned char new_state)
  {
  	struct gfs2_rbm rbm;
-	struct gfs2_bitmap *bi;
+	struct gfs2_bitmap *bi, *bi_prev = NULL;
 
  	rbm.rgd = gfs2_blk2rgrpd(sdp, bstart, 1);
  	if (!rbm.rgd) {
@@ -2106,18 +2106,22 @@ static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart,
  		return NULL;
  	}
 
+	gfs2_rbm_from_block(&rbm, bstart);
  	while (blen--) {
-		gfs2_rbm_from_block(&rbm, bstart);
  		bi = rbm_bi(&rbm);
-		bstart++;
-		if (!bi->bi_clone) {
-			bi->bi_clone = kmalloc(bi->bi_bh->b_size,
-					       GFP_NOFS | __GFP_NOFAIL);
-			memcpy(bi->bi_clone + bi->bi_offset,
-			       bi->bi_bh->b_data + bi->bi_offset, bi->bi_len);
+		if (bi != bi_prev) {
+			if (!bi->bi_clone) {
+				bi->bi_clone = kmalloc(bi->bi_bh->b_size,
+						      GFP_NOFS | __GFP_NOFAIL);
+				memcpy(bi->bi_clone + bi->bi_offset,
+				       bi->bi_bh->b_data + bi->bi_offset,
+				       bi->bi_len);
+			}
+			gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
+			bi_prev = bi;
  		}
-		gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
  		gfs2_setbit(&rbm, false, new_state);
+		gfs2_rbm_incr(&rbm);
  	}
 
  	return rbm.rgd;