[lvm-devel] master - format_text: More refactoring of metadata offset calcs

Alasdair Kergon agk at sourceware.org
Tue Dec 12 21:24:47 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=643df602c7d199c15ba27958e51e61b822a14755
Commit:        643df602c7d199c15ba27958e51e61b822a14755
Parent:        4002f5e206ae89db28eb60bdfb3685bd926fed57
Author:        Alasdair G Kergon <agk at redhat.com>
AuthorDate:    Tue Dec 12 18:46:25 2017 +0000
Committer:     Alasdair G Kergon <agk at redhat.com>
CommitterDate: Tue Dec 12 18:51:32 2017 +0000

format_text: More refactoring of metadata offset calcs

---
 lib/format_text/format-text.c |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 174a579..0c5dd1b 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -482,15 +482,24 @@ static struct raw_locn *_find_vg_rlocn(struct device_area *dev_area,
  */
 static uint64_t _next_rlocn_offset(struct raw_locn *rlocn, struct mda_header *mdah, uint64_t mdac_area_start, uint64_t alignment)
 {
-	uint64_t new_start_offset;
+	uint64_t old_end, new_start_offset;
+	int old_wrapped = 0;	/* Does the old metadata wrap around? */
 
 	if (!rlocn)
 		/* Find an empty slot */
 		/* FIXME Assumes only one VG per mdah for now */
 		return alignment;
 
+	/* First find the end of the old metadata */
+	old_end = rlocn->offset + rlocn->size;
+
+	if (old_end > mdah->size) {
+		old_wrapped = 1;
+		old_end -= (mdah->size - MDA_HEADER_SIZE);
+	}
+
 	/* Calculate new start position relative to start of buffer rounded up to absolute alignment */
-	new_start_offset = ALIGN_ABSOLUTE(rlocn->offset + rlocn->size, mdac_area_start, alignment);
+	new_start_offset = ALIGN_ABSOLUTE(old_end, mdac_area_start, alignment);
 
 	/* If new location is beyond the end of the buffer, wrap around back to start of circular buffer */
 	if (new_start_offset >= mdah->size)
@@ -626,16 +635,23 @@ static int _metadata_fits_into_buffer(struct mda_context *mdac, struct mda_heade
 				      struct raw_locn *rlocn, uint64_t new_wrap)
 {
 	uint64_t old_wrap = 0;	/* Amount of wrap around in existing metadata */
-	uint64_t new_end;	/* The end location of the new metadata */
+	uint64_t old_end = 0;	/* The (byte after the) end of the existing metadata */
+	uint64_t new_end;	/* The (byte after the) end of the new metadata */
+	uint64_t old_start = 0;	/* The start of the existing metadata */
+	uint64_t new_start = mdac->rlocn.offset;	/* The proposed start of the new metadata */
 
 	/* Does the total amount of metadata, old and new, fit inside the buffer? */
 	if (MDA_HEADER_SIZE + (rlocn ? rlocn->size : 0) + mdac->rlocn.size >= mdah->size)
 		return_0;
 
-	/* Does the existing metadata wrap around the end of the buffer? */
+	/* If there's existing metadata, set old_start, old_end and old_wrap. */
 	if (rlocn) {
-		if (rlocn->offset + rlocn->size > mdah->size)
-			old_wrap = (rlocn->offset + rlocn->size) - mdah->size;
+		old_start = rlocn->offset;
+		old_end = old_start + rlocn->size;
+
+		/* Does the existing metadata wrap around the end of the buffer? */
+		if (old_end > mdah->size)
+			old_wrap = old_end - mdah->size;
 	}
 
 	new_end = new_wrap ? new_wrap + MDA_HEADER_SIZE : (mdac->rlocn.offset + mdac->rlocn.size);
@@ -649,7 +665,7 @@ static int _metadata_fits_into_buffer(struct mda_context *mdac, struct mda_heade
 		return 1;
 
 	/* If either wraps around, there's overlap if the new end falls beyond the old start */
-	if ((new_wrap || old_wrap) && (new_end > rlocn->offset))
+	if ((new_wrap || old_wrap) && (new_end > old_start))
 		return_0;
 
 	return 1;




More information about the lvm-devel mailing list