[lvm-devel] master - format_text: Split out raw_read_mda_header processing

Alasdair Kergon agk at sourceware.org
Thu Jan 4 18:40:28 UTC 2018


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d61b1369d0764841522494ef3ba0ef4b5e89c723
Commit:        d61b1369d0764841522494ef3ba0ef4b5e89c723
Parent:        139209ef42f8ea986c22fb3c889dbf893da7160b
Author:        Alasdair G Kergon <agk at redhat.com>
AuthorDate:    Thu Jan 4 15:52:59 2018 +0000
Committer:     Alasdair G Kergon <agk at redhat.com>
CommitterDate: Thu Jan 4 15:52:59 2018 +0000

format_text: Split out raw_read_mda_header processing

---
 lib/format_text/format-text.c |   67 ++++++++++++++++++++++++++++------------
 1 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index c57ffd2..4404c04 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -226,6 +226,7 @@ static int _pv_analyze_mda_raw (const struct format_type * fmt,
 							prev_sector);
 		if (prev_sector > prev_sector2)
 			goto_out;
+
 		/*
 		 * FIXME: for some reason, the whole metadata region from
 		 * area->start to area->start+area->size is not used.
@@ -241,7 +242,7 @@ static int _pv_analyze_mda_raw (const struct format_type * fmt,
 			if (!(buf = dev_read_circular(area->dev, offset, size, offset2, size2, MDA_CONTENT_REASON(mda_is_primary(mda)))))
 				goto_out;
 		} else if (!(buf = dev_read(area->dev, offset, size, MDA_CONTENT_REASON(mda_is_primary(mda)))))
-				goto_out;
+			goto_out;
 
 		/*
 		 * FIXME: We could add more sophisticated metadata detection
@@ -325,19 +326,19 @@ static void _xlate_mdah(struct mda_header *mdah)
 	}
 }
 
-static int _raw_read_mda_header(struct mda_header *mdah, struct device_area *dev_area, int primary_mda)
-{
-	if (!dev_open_readonly(dev_area->dev))
-		return_0;
+struct process_raw_mda_header_params {
+	struct mda_header *mdah;
+	struct device_area dev_area;
+};
 
-	if (!dev_read_buf(dev_area->dev, dev_area->start, MDA_HEADER_SIZE, MDA_HEADER_REASON(primary_mda), mdah)) {
-		if (!dev_close(dev_area->dev))
-			stack;
-		return_0;
-	}
+static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp)
+{
+	struct mda_header *mdah = prmp->mdah;
+	struct device_area *dev_area = &prmp->dev_area;
+	int r = 0;
 
 	if (!dev_close(dev_area->dev))
-		return_0;
+		goto_out;
 
 	if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, (uint8_t *)mdah->magic,
 						  MDA_HEADER_SIZE -
@@ -345,7 +346,7 @@ static int _raw_read_mda_header(struct mda_header *mdah, struct device_area *dev
 		log_error("Incorrect metadata area header checksum on %s"
 			  " at offset " FMTu64, dev_name(dev_area->dev),
 			  dev_area->start);
-		return 0;
+		goto out;
 	}
 
 	_xlate_mdah(mdah);
@@ -354,43 +355,70 @@ static int _raw_read_mda_header(struct mda_header *mdah, struct device_area *dev
 		log_error("Wrong magic number in metadata area header on %s"
 			  " at offset " FMTu64, dev_name(dev_area->dev),
 			  dev_area->start);
-		return 0;
+		goto out;
 	}
 
 	if (mdah->version != FMTT_VERSION) {
 		log_error("Incompatible metadata area header version: %d on %s"
 			  " at offset " FMTu64, mdah->version,
 			  dev_name(dev_area->dev), dev_area->start);
-		return 0;
+		goto out;
 	}
 
 	if (mdah->start != dev_area->start) {
 		log_error("Incorrect start sector in metadata area header: "
 			  FMTu64 " on %s at offset " FMTu64, mdah->start,
 			  dev_name(dev_area->dev), dev_area->start);
-		return 0;
+		goto out;
 	}
 
-	return 1;
+	r = 1;
+
+out:
+	return r;
 }
 
-struct mda_header *raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda)
+static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda)
 {
 	struct mda_header *mdah;
+	struct process_raw_mda_header_params *prmp;
 
 	if (!(mdah = dm_pool_alloc(mem, MDA_HEADER_SIZE))) {
 		log_error("struct mda_header allocation failed");
 		return NULL;
 	}
 
-	if (!_raw_read_mda_header(mdah, dev_area, primary_mda)) {
+	if (!(prmp = dm_pool_zalloc(mem, sizeof (*prmp)))) {
+		log_error("struct process_raw_mda_header_params allocation failed");
 		dm_pool_free(mem, mdah);
 		return NULL;
 	}
 
+	if (!dev_open_readonly(dev_area->dev)) {
+		dm_pool_free(mem, mdah);
+		return_NULL;
+	}
+
+	prmp->mdah = mdah;
+	prmp->dev_area = *dev_area;
+
+	if (!dev_read_buf(dev_area->dev, dev_area->start, MDA_HEADER_SIZE, MDA_HEADER_REASON(primary_mda), mdah)) {
+		if (!dev_close(dev_area->dev))
+			stack;
+		return_NULL;
+	}
+
+	if (!_process_raw_mda_header(prmp))
+		return_NULL;
+
 	return mdah;
 }
 
+struct mda_header *raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda)
+{
+	return _raw_read_mda_header(mem, dev_area, primary_mda);
+}
+
 static int _raw_write_mda_header(const struct format_type *fmt,
 				 struct device *dev, int primary_mda,
 				 uint64_t start_byte, struct mda_header *mdah)
@@ -1899,9 +1927,8 @@ static int _mda_export_text_raw(struct metadata_area *mda,
 				struct dm_config_node *parent)
 {
 	struct mda_context *mdc = (struct mda_context *) mda->metadata_locn;
-	char mdah[MDA_HEADER_SIZE]; /* temporary */
 
-	if (!mdc || !_raw_read_mda_header((struct mda_header *)mdah, &mdc->area, mda_is_primary(mda)))
+	if (!mdc || !_raw_read_mda_header(cft->mem, &mdc->area, mda_is_primary(mda)))
 		return 1; /* pretend the MDA does not exist */
 
 	return config_make_nodes(cft, parent, NULL,




More information about the lvm-devel mailing list