Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=643df602c7d199c15ba279... Commit: 643df602c7d199c15ba27958e51e61b822a14755 Parent: 4002f5e206ae89db28eb60bdfb3685bd926fed57 Author: Alasdair G Kergon agk@redhat.com AuthorDate: Tue Dec 12 18:46:25 2017 +0000 Committer: Alasdair G Kergon agk@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;
lvm2-commits@lists.fedorahosted.org