gfs2-utils: master - libgfs2: Handle non-zero bitmaps in lgfs2_rgrp_write

Andrew Price andyp at fedoraproject.org
Fri Sep 5 13:39:47 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=4a01294cf5ad95619adf4ea7252d37a56c457bc1
Commit:        4a01294cf5ad95619adf4ea7252d37a56c457bc1
Parent:        4f674251e9fd93cd38dfbb37b0a6b83a8ec577f1
Author:        Andrew Price <anprice at redhat.com>
AuthorDate:    Mon Sep 1 16:49:46 2014 +0100
Committer:     Andrew Price <anprice at redhat.com>
CommitterDate: Mon Sep 1 17:17:26 2014 +0100

libgfs2: Handle non-zero bitmaps in lgfs2_rgrp_write

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 files 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)


More information about the cluster-commits mailing list