[Cluster-devel] [PATCH 16/19] libgfs2: Handle non-zero bitmaps in lgfs2_rgrp_write

Andrew Price anprice at redhat.com
Tue Sep 2 12:07:33 UTC 2014


Previously, lgfs2_rgrp_write had been used only for writing new resource
groups where the bitmaps were all zero. Fix it to write the bitmap
buffers already present in the resource group structure directly.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/libgfs2/rgrp.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c
index 8f96c9f..f57ae3a 100644
--- a/gfs2/libgfs2/rgrp.c
+++ b/gfs2/libgfs2/rgrp.c
@@ -587,31 +587,33 @@ lgfs2_rgrp_t lgfs2_rgrps_append(lgfs2_rgrps_t rgs, struct gfs2_rindex *entry)
  */
 int lgfs2_rgrp_write(int fd, const lgfs2_rgrp_t rg)
 {
-	ssize_t ret = 0;
-	lgfs2_rgrps_t rgs = rg->rgrps;
-	size_t len = rg->ri.ri_length * rgs->sdp->bsize;
+	int ret = 0;
 	unsigned int i;
 	const struct gfs2_meta_header bmh = {
 		.mh_magic = GFS2_MAGIC,
 		.mh_type = GFS2_METATYPE_RB,
 		.mh_format = GFS2_FORMAT_RB,
 	};
-	char *buff = calloc(len, 1);
-	if (buff == NULL)
-		return -1;
+	int freebufs = 0;
 
-	gfs2_rgrp_out(&rg->rg, buff);
-	for (i = 1; i < rg->ri.ri_length; i++)
-		gfs2_meta_header_out(&bmh, buff + (i * rgs->sdp->bsize));
+	if (rg->bits[0].bi_bh == NULL) {
+		freebufs = 1;
+		if (lgfs2_rgrp_bitbuf_alloc(rg) != 0)
+			return -1;
+	}
 
-	ret = pwrite(fd, buff, len, rg->ri.ri_addr * rgs->sdp->bsize);
-	if (ret != len) {
-		free(buff);
-		return -1;
+	gfs2_rgrp_out(&rg->rg, rg->bits[0].bi_bh->b_data);
+	ret = bwrite(rg->bits[0].bi_bh);
+
+	for (i = 1; ret == 0 && i < rg->ri.ri_length; i++) {
+		gfs2_meta_header_out(&bmh, rg->bits[i].bi_bh->b_data);
+		ret = bwrite(rg->bits[i].bi_bh);
 	}
 
-	free(buff);
-	return 0;
+	if (freebufs)
+		lgfs2_rgrp_bitbuf_free(rg);
+
+	return ret;
 }
 
 lgfs2_rgrp_t lgfs2_rgrp_first(lgfs2_rgrps_t rgs)
-- 
1.9.3




More information about the Cluster-devel mailing list