Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
List overview
Download
lvm2-commits
January 2018
----- 2025 -----
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
lvm2-commits@lists.fedorahosted.org
5 participants
66 discussions
Start a n
N
ew thread
master - device: Introduce dev_read_callback
by Alasdair Kergon
05 Jan '18
05 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5e7d3ad749d3de735ba21…
Commit: 5e7d3ad749d3de735ba213ad64637182afec2586 Parent: 946f07af3e8f97b0e48752ce1cd8de87d3456540 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Sat Jan 6 00:33:09 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Sat Jan 6 02:40:12 2018 +0000 device: Introduce dev_read_callback If it obtains the data, it passes it into the supplied callback function and returns 1. Otherwise the callback receives failed = 1. Updated config_file_read_fd to use this and similarly return the data via a callback fn of its own. --- WHATS_NEW | 1 + lib/config/config.c | 72 ++++++++++++++++++++++++++-------------------- lib/config/config.h | 4 ++- lib/device/dev-io.c | 27 +++++++++++++++++ lib/device/device.h | 8 ++++- lib/format_text/import.c | 39 +++++++++++++----------- 6 files changed, 100 insertions(+), 51 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index fa79068..345c472 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.178 - ===================================== + Refactor metadata reading code to use callback functions. Move memory allocation for the key dev_reads into the device layer. Version 2.02.177 - 18th December 2017 diff --git a/lib/config/config.c b/lib/config/config.c index bffee06..7217cd9 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -500,16 +500,21 @@ struct process_config_file_params { uint32_t checksum; int checksum_only; int no_dup_node_check; + int use_mmap; + lvm_callback_fn_t config_file_read_fd_callback; + void *config_file_read_fd_context; int ret; }; static void _process_config_file_buffer(int failed, void *context, void *data) { struct process_config_file_params *pcfp = context; - char *buffer = data; - char *fb, *fe; + char *fb = data, *fe; - fb = buffer; + if (failed) { + pcfp->ret = 0; + goto_out; + } if (pcfp->checksum_fn && pcfp->checksum != (pcfp->checksum_fn(pcfp->checksum_fn(INITIAL_CRC, (const uint8_t *)fb, pcfp->size), @@ -529,7 +534,11 @@ static void _process_config_file_buffer(int failed, void *context, void *data) } out: - ; + if (!failed && !pcfp->use_mmap) + dm_free(data); + + if (pcfp->config_file_read_fd_callback) + pcfp->config_file_read_fd_callback(!pcfp->ret, pcfp->config_file_read_fd_context, NULL); } /* @@ -540,11 +549,11 @@ out: int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct device *dev, dev_io_reason_t reason, off_t offset, size_t size, off_t offset2, size_t size2, checksum_fn_t checksum_fn, uint32_t checksum, - int checksum_only, int no_dup_node_check) + int checksum_only, int no_dup_node_check, + lvm_callback_fn_t config_file_read_fd_callback, void *config_file_read_fd_context) { char *fb; int r = 0; - int use_mmap = 1; off_t mmap_offset = 0; char *buf = NULL; unsigned circular = size2 ? 1 : 0; /* Wrapped around end of disk metadata buffer? */ @@ -555,12 +564,12 @@ int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct log_error(INTERNAL_ERROR "config_file_read_fd: expected file, special file " "or profile config source, found %s config source.", _config_source_names[cs->type]); - return 0; + goto bad; } if (!(pcfp = dm_pool_zalloc(mem, sizeof(*pcfp)))) { log_debug("config_file_read_fd: process_config_file_params struct allocation failed"); - return 0; + goto bad; } pcfp->cft = cft; @@ -573,48 +582,49 @@ int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct pcfp->checksum = checksum; pcfp->checksum_only = checksum_only; pcfp->no_dup_node_check = no_dup_node_check; + pcfp->config_file_read_fd_callback = config_file_read_fd_callback; + pcfp->config_file_read_fd_context = config_file_read_fd_context; + pcfp->use_mmap = 1; pcfp->ret = 1; /* Only use mmap with regular files */ if (!(dev->flags & DEV_REGULAR) || circular) - use_mmap = 0; + pcfp->use_mmap = 0; - if (use_mmap) { + if (pcfp->use_mmap) { mmap_offset = offset % lvm_getpagesize(); /* memory map the file */ fb = mmap((caddr_t) 0, size + mmap_offset, PROT_READ, MAP_PRIVATE, dev_fd(dev), offset - mmap_offset); if (fb == (caddr_t) (-1)) { log_sys_error("mmap", dev_name(dev)); - goto out; + goto bad; + } + _process_config_file_buffer(0, pcfp, fb + mmap_offset); + r = pcfp->ret; + /* unmap the file */ + if (munmap(fb, size + mmap_offset)) { + log_sys_error("munmap", dev_name(dev)); + r = 0; } - fb = fb + mmap_offset; } else { if (circular) { if (!(buf = dev_read_circular(dev, (uint64_t) offset, size, (uint64_t) offset2, size2, reason))) goto_out; - } else { - if (!(buf = dev_read(dev, (uint64_t) offset, size, reason))) - goto_out; - } - fb = buf; + _process_config_file_buffer(0, pcfp, buf); + } else if (!dev_read_callback(dev, (uint64_t) offset, size, reason, _process_config_file_buffer, pcfp)) + goto_out; + r = pcfp->ret; } - _process_config_file_buffer(0, pcfp, fb); - r = pcfp->ret; +out: + return r; - out: - if (!use_mmap) - dm_free(buf); - else { - /* unmap the file */ - if (munmap(fb - mmap_offset, size + mmap_offset)) { - log_sys_error("munmap", dev_name(dev)); - r = 0; - } - } +bad: + if (config_file_read_fd_callback) + config_file_read_fd_callback(1, config_file_read_fd_context, NULL); - return r; + return 0; } int config_file_read(struct dm_pool *mem, struct dm_config_tree *cft) @@ -646,7 +656,7 @@ int config_file_read(struct dm_pool *mem, struct dm_config_tree *cft) } r = config_file_read_fd(mem, cft, cf->dev, DEV_IO_MDA_CONTENT, 0, (size_t) info.st_size, 0, 0, - (checksum_fn_t) NULL, 0, 0, 0); + (checksum_fn_t) NULL, 0, 0, 0, NULL, NULL); if (!cf->keep_open) { if (!dev_close(cf->dev)) diff --git a/lib/config/config.h b/lib/config/config.h index 5c8844a..9901003 100644 --- a/lib/config/config.h +++ b/lib/config/config.h @@ -242,7 +242,9 @@ struct dm_config_tree *config_open(config_source_t source, const char *filename, int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct device *dev, dev_io_reason_t reason, off_t offset, size_t size, off_t offset2, size_t size2, checksum_fn_t checksum_fn, uint32_t checksum, - int skip_parse, int no_dup_node_check); + int skip_parse, int no_dup_node_check, + lvm_callback_fn_t config_file_read_fd_callback, void *config_file_read_fd_context); + int config_file_read(struct dm_pool *mem, struct dm_config_tree *cft); struct dm_config_tree *config_file_open_and_read(const char *config_file, config_source_t source, struct cmd_context *cmd); diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index 72d6768..22a0d4c 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -763,6 +763,33 @@ char *dev_read(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t return buf; } +/* Callback fn is responsible for dm_free */ +int dev_read_callback(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, + lvm_callback_fn_t dev_read_callback_fn, void *callback_context) +{ + char *buf; + int r = 0; + + if (!(buf = dm_malloc(len))) { + log_error("Buffer allocation failed for device read."); + goto out; + } + + if (!_dev_read(dev, offset, len, reason, buf)) { + log_error("Read from %s failed", dev_name(dev)); + dm_free(buf); + goto out; + } + + r = 1; + +out: + if (dev_read_callback_fn) + dev_read_callback_fn(!r, callback_context, buf); + + return r; +} + /* Read into supplied retbuf */ int dev_read_buf(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, void *retbuf) { diff --git a/lib/device/device.h b/lib/device/device.h index 04117d2..4349222 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -33,7 +33,9 @@ #define DEV_NOT_O_NOATIME 0x00000400 /* Don't use O_NOATIME */ /* - * Standard format for callback functions + * Standard format for callback functions. + * When provided, callback functions are called exactly once. + * If failed is set, data cannot be accessed. */ typedef void (*lvm_callback_fn_t)(int failed, void *context, void *data); @@ -155,6 +157,10 @@ char *dev_read(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t char *dev_read_circular(struct device *dev, uint64_t offset, size_t len, uint64_t offset2, size_t len2, dev_io_reason_t reason); +/* Passes the data to dev_read_callback_fn */ +int dev_read_callback(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, + lvm_callback_fn_t dev_read_callback_fn, void *callback_context); + /* Read data and copy it into a supplied private buffer. */ /* Only use for tiny reads or on unimportant code paths. */ int dev_read_buf(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, void *retbuf); diff --git a/lib/format_text/import.c b/lib/format_text/import.c index 64ef2be..a295b78 100644 --- a/lib/format_text/import.c +++ b/lib/format_text/import.c @@ -46,6 +46,11 @@ static void _import_vgsummary(int failed, void *context, void *data) struct import_vgsummary_params *ivsp = context; struct text_vg_version_ops **vsn; + if (failed) { + ivsp->ret = 0; + goto_out; + } + if (ivsp->checksum_only) /* Checksum matches already-cached content - no need to reparse. */ goto out; @@ -100,23 +105,20 @@ int text_vgsummary_import(const struct format_type *fmt, ivsp->vgsummary = vgsummary; ivsp->ret = 1; - if (!dev && !config_file_read(fmt->cmd->mem, ivsp->cft)) { - log_error("Couldn't read volume group metadata."); - config_destroy(ivsp->cft); - return 0; - } - - if (dev && !config_file_read_fd(fmt->cmd->mem, ivsp->cft, dev, reason, offset, size, + if (!dev) { + if (!config_file_read(fmt->cmd->mem, ivsp->cft)) { + log_error("Couldn't read volume group metadata."); + ivsp->ret = 0; + } + _import_vgsummary(!ivsp->ret, ivsp, NULL); + } else if (!config_file_read_fd(fmt->cmd->mem, ivsp->cft, dev, reason, offset, size, offset2, size2, checksum_fn, vgsummary->mda_checksum, - checksum_only, 1)) { + checksum_only, 1, &_import_vgsummary, ivsp)) { log_error("Couldn't read volume group metadata."); - config_destroy(ivsp->cft); return 0; } - _import_vgsummary(0, ivsp, NULL); - return ivsp->ret; } @@ -229,14 +231,15 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid, return_NULL; } - if (dev && !config_file_read_fd(fid->mem, ivp->cft, dev, MDA_CONTENT_REASON(primary_mda), offset, size, + if (dev) { + if (!config_file_read_fd(fid->mem, ivp->cft, dev, MDA_CONTENT_REASON(primary_mda), offset, size, offset2, size2, checksum_fn, checksum, - ivp->skip_parse, 1)) { - config_destroy(ivp->cft); - return_NULL; - } - - _import_vg(0, ivp, NULL); + ivp->skip_parse, 1, &_import_vg, ivp)) { + config_destroy(ivp->cft); + return_NULL; + } + } else + _import_vg(0, ivp, NULL); return ivp->vg; }
1
0
0
0
master - metadata: Use a consistent format for callback fn parameters
by Alasdair Kergon
05 Jan '18
05 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=946f07af3e8f97b0e4875…
Commit: 946f07af3e8f97b0e48752ce1cd8de87d3456540 Parent: a0ddfad94b92da4c5d21459f17c5f1fb9fe003b3 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Fri Jan 5 14:24:10 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Fri Jan 5 14:24:56 2018 +0000 metadata: Use a consistent format for callback fn parameters --- lib/config/config.c | 6 ++++-- lib/device/device.h | 5 +++++ lib/format_text/format-text.c | 16 ++++++++++------ lib/format_text/import.c | 10 ++++++---- lib/format_text/text_label.c | 13 +++++++++---- lib/label/label.c | 8 ++++---- lib/metadata/metadata.h | 1 - 7 files changed, 38 insertions(+), 21 deletions(-) diff --git a/lib/config/config.c b/lib/config/config.c index 5dc2356..bffee06 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -503,8 +503,10 @@ struct process_config_file_params { int ret; }; -static void _process_config_file_buffer(struct process_config_file_params *pcfp, char *buffer) +static void _process_config_file_buffer(int failed, void *context, void *data) { + struct process_config_file_params *pcfp = context; + char *buffer = data; char *fb, *fe; fb = buffer; @@ -598,7 +600,7 @@ int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct fb = buf; } - _process_config_file_buffer(pcfp, fb); + _process_config_file_buffer(0, pcfp, fb); r = pcfp->ret; out: diff --git a/lib/device/device.h b/lib/device/device.h index dac638c..04117d2 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -33,6 +33,11 @@ #define DEV_NOT_O_NOATIME 0x00000400 /* Don't use O_NOATIME */ /* + * Standard format for callback functions + */ +typedef void (*lvm_callback_fn_t)(int failed, void *context, void *data); + +/* * Support for external device info. * Any new external device info source needs to be * registered using EXT_REGISTER macro in dev-ext.c. diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index fb87ae2..a0aff4d 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -332,8 +332,9 @@ struct process_raw_mda_header_params { int ret; }; -static void _process_raw_mda_header(struct process_raw_mda_header_params *prmp) +static void _process_raw_mda_header(int failed, void *context, void *data) { + struct process_raw_mda_header_params *prmp = context; struct mda_header *mdah = prmp->mdah; struct device_area *dev_area = &prmp->dev_area; @@ -413,7 +414,7 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic return_NULL; } - _process_raw_mda_header(prmp); + _process_raw_mda_header(0, prmp, NULL); if (!prmp->ret) return_NULL; @@ -1347,8 +1348,9 @@ struct vgname_from_mda_params{ int ret; }; -static void _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) +static void _vgname_from_mda_process(int failed, void *context, void *data) { + struct vgname_from_mda_params *vfmp = context; struct mda_header *mdah = vfmp->mdah; struct device_area *dev_area = vfmp->dev_area; struct lvmcache_vgsummary *vgsummary = vfmp->vgsummary; @@ -1386,8 +1388,10 @@ out: ; } -static void _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char *buffer) +static void _vgname_from_mda_validate(int failed, void *context, void *data) { + struct vgname_from_mda_params *vfmp = context; + char *buffer = data; const struct format_type *fmt = vfmp->fmt; struct mda_header *mdah = vfmp->mdah; struct device_area *dev_area = vfmp->dev_area; @@ -1439,7 +1443,7 @@ static void _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char goto_out; } - _vgname_from_mda_process(vfmp); + _vgname_from_mda_process(0, vfmp, NULL); out: ; @@ -1492,7 +1496,7 @@ int vgname_from_mda(const struct format_type *fmt, NAME_LEN, MDA_CONTENT_REASON(primary_mda), buf)) return_0; - _vgname_from_mda_validate(vfmp, buf); + _vgname_from_mda_validate(0, vfmp, buf); return vfmp->ret; } diff --git a/lib/format_text/import.c b/lib/format_text/import.c index 580c1f3..64ef2be 100644 --- a/lib/format_text/import.c +++ b/lib/format_text/import.c @@ -41,8 +41,9 @@ struct import_vgsummary_params { int ret; }; -static void _import_vgsummary(struct import_vgsummary_params *ivsp) +static void _import_vgsummary(int failed, void *context, void *data) { + struct import_vgsummary_params *ivsp = context; struct text_vg_version_ops **vsn; if (ivsp->checksum_only) @@ -114,7 +115,7 @@ int text_vgsummary_import(const struct format_type *fmt, return 0; } - _import_vgsummary(ivsp); + _import_vgsummary(0, ivsp, NULL); return ivsp->ret; } @@ -138,8 +139,9 @@ struct import_vg_params { char **desc; }; -static void _import_vg(struct import_vg_params *ivp) +static void _import_vg(int failed, void *context, void *data) { + struct import_vg_params *ivp = context; struct text_vg_version_ops **vsn; ivp->vg = NULL; @@ -234,7 +236,7 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid, return_NULL; } - _import_vg(ivp); + _import_vg(0, ivp, NULL); return ivp->vg; } diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index c4ea166..05e1626 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -333,8 +333,11 @@ struct process_mda_header_params { int ret; }; -static void _process_vgsummary(struct process_mda_header_params *pmp, struct lvmcache_vgsummary *vgsummary) +static void _process_vgsummary(int failed, void *context, void *data) { + struct process_mda_header_params *pmp = context; + struct lvmcache_vgsummary *vgsummary = data; + if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) { pmp->umb->ret = 0; pmp->ret = 0; @@ -346,8 +349,10 @@ out: stack; } -static void _process_mda_header(struct process_mda_header_params *pmp, struct mda_header *mdah) +static void _process_mda_header(int failed, void *context, void *data) { + struct process_mda_header_params *pmp = context; + struct mda_header *mdah = data; struct update_mda_baton *umb = pmp->umb; const struct format_type *fmt = umb->label->labeller->fmt; struct metadata_area *mda = pmp->mda; @@ -373,7 +378,7 @@ static void _process_mda_header(struct process_mda_header_params *pmp, struct md return; } - _process_vgsummary(pmp, &pmp->vgsummary); + _process_vgsummary(0, pmp, &pmp->vgsummary); } static int _update_mda(struct metadata_area *mda, void *baton) @@ -416,7 +421,7 @@ static int _update_mda(struct metadata_area *mda, void *baton) return 1; } - _process_mda_header(pmp, mdah); + _process_mda_header(0, pmp, mdah); return pmp->ret; } diff --git a/lib/label/label.c b/lib/label/label.c index 5d5bcc5..a187bad 100644 --- a/lib/label/label.c +++ b/lib/label/label.c @@ -146,8 +146,10 @@ out: stack; } -static void _find_labeller(struct find_labeller_params *flp, char *readbuf) +static void _find_labeller(int failed, void *context, void *data) { + struct find_labeller_params *flp = context; + char *readbuf = data; struct device *dev = flp->dev; uint64_t scan_sector = flp->scan_sector; struct label **result = flp->result; @@ -158,8 +160,6 @@ static void _find_labeller(struct find_labeller_params *flp, char *readbuf) struct lvmcache_info *info; uint64_t sector; -int r = 0; - /* Scan a few sectors for a valid label */ for (sector = 0; sector < LABEL_SCAN_SECTORS; sector += LABEL_SIZE >> SECTOR_SHIFT) { @@ -343,7 +343,7 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label ** return 0; } - _find_labeller(flp, readbuf); + _find_labeller(0, flp, readbuf); return flp->ret; } diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h index 3a4abc3..f15080a 100644 --- a/lib/metadata/metadata.h +++ b/lib/metadata/metadata.h @@ -48,7 +48,6 @@ */ #define dm_round_up(n, sz) (dm_div_up((n), (sz)) * (sz)) - /* Various flags */ /* See metadata-exported.h for the complete list. */ /* Note that the bits no longer necessarily correspond to LVM1 disk format */
1
0
0
0
master - metadata: Change the new data processing fns to void.
by Alasdair Kergon
04 Jan '18
04 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=a0ddfad94b92da4c5d214…
Commit: a0ddfad94b92da4c5d21459f17c5f1fb9fe003b3 Parent: c70c9f65659df846dbc590053569a80935e09d2f Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Fri Jan 5 02:31:28 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Fri Jan 5 03:12:22 2018 +0000 metadata: Change the new data processing fns to void. Move the existing fn return codes into the new structs. --- lib/config/config.c | 22 ++++++++-------- lib/format_text/format-text.c | 55 ++++++++++++++++++++++++++--------------- lib/format_text/import.c | 26 +++++++++++-------- lib/format_text/text_label.c | 25 +++++++++--------- lib/label/label.c | 20 +++++++++------ 5 files changed, 85 insertions(+), 63 deletions(-) diff --git a/lib/config/config.c b/lib/config/config.c index bb1d80e..5dc2356 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2018 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -500,12 +500,12 @@ struct process_config_file_params { uint32_t checksum; int checksum_only; int no_dup_node_check; + int ret; }; -static int _process_config_file_buffer(struct process_config_file_params *pcfp, char *buffer) +static void _process_config_file_buffer(struct process_config_file_params *pcfp, char *buffer) { char *fb, *fe; - int r = 0; fb = buffer; @@ -513,6 +513,7 @@ static int _process_config_file_buffer(struct process_config_file_params *pcfp, (pcfp->checksum_fn(pcfp->checksum_fn(INITIAL_CRC, (const uint8_t *)fb, pcfp->size), (const uint8_t *)(fb + pcfp->size), pcfp->size2))) { log_error("%s: Checksum error at offset %" PRIu64, dev_name(pcfp->dev), (uint64_t) pcfp->offset); + pcfp->ret = 0; goto out; } @@ -520,16 +521,13 @@ static int _process_config_file_buffer(struct process_config_file_params *pcfp, fe = fb + pcfp->size + pcfp->size2; if (pcfp->no_dup_node_check) { if (!dm_config_parse_without_dup_node_check(pcfp->cft, fb, fe)) - goto_out; - } else { - if (!dm_config_parse(pcfp->cft, fb, fe)) - goto_out; - } + pcfp->ret = 0; + } else if (!dm_config_parse(pcfp->cft, fb, fe)) + pcfp->ret = 0; } - r = 1; out: - return r; + ; } /* @@ -573,6 +571,7 @@ int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct pcfp->checksum = checksum; pcfp->checksum_only = checksum_only; pcfp->no_dup_node_check = no_dup_node_check; + pcfp->ret = 1; /* Only use mmap with regular files */ if (!(dev->flags & DEV_REGULAR) || circular) @@ -599,7 +598,8 @@ int config_file_read_fd(struct dm_pool *mem, struct dm_config_tree *cft, struct fb = buf; } - r = _process_config_file_buffer(pcfp, fb); + _process_config_file_buffer(pcfp, fb); + r = pcfp->ret; out: if (!use_mmap) diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 798fd66..fb87ae2 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2018 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -329,16 +329,18 @@ static void _xlate_mdah(struct mda_header *mdah) struct process_raw_mda_header_params { struct mda_header *mdah; struct device_area dev_area; + int ret; }; -static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp) +static void _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)) + if (!dev_close(dev_area->dev)) { + prmp->ret = 0; goto_out; + } if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, (uint8_t *)mdah->magic, MDA_HEADER_SIZE - @@ -346,6 +348,7 @@ static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp) log_error("Incorrect metadata area header checksum on %s" " at offset " FMTu64, dev_name(dev_area->dev), dev_area->start); + prmp->ret = 0; goto out; } @@ -355,6 +358,7 @@ static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp) log_error("Wrong magic number in metadata area header on %s" " at offset " FMTu64, dev_name(dev_area->dev), dev_area->start); + prmp->ret = 0; goto out; } @@ -362,6 +366,7 @@ static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp) log_error("Incompatible metadata area header version: %d on %s" " at offset " FMTu64, mdah->version, dev_name(dev_area->dev), dev_area->start); + prmp->ret = 0; goto out; } @@ -369,13 +374,12 @@ static int _process_raw_mda_header(struct process_raw_mda_header_params *prmp) 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); + prmp->ret = 0; goto out; } - r = 1; - out: - return r; + ; } static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda) @@ -401,6 +405,7 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic prmp->mdah = mdah; prmp->dev_area = *dev_area; + prmp->ret = 1; 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)) @@ -408,7 +413,9 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic return_NULL; } - if (!_process_raw_mda_header(prmp)) + _process_raw_mda_header(prmp); + + if (!prmp->ret) return_NULL; return mdah; @@ -1337,9 +1344,10 @@ struct vgname_from_mda_params{ uint64_t *mda_free_sectors; uint32_t wrap; unsigned used_cached_metadata; + int ret; }; -static int _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) +static void _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) { struct mda_header *mdah = vfmp->mdah; struct device_area *dev_area = vfmp->dev_area; @@ -1347,11 +1355,12 @@ static int _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) uint64_t *mda_free_sectors = vfmp->mda_free_sectors; struct raw_locn *rlocn = mdah->raw_locns; uint64_t buffer_size, current_usage; - int r = 0; /* Ignore this entry if the characters aren't permissible */ - if (!validate_name(vgsummary->vgname)) + if (!validate_name(vgsummary->vgname)) { + vfmp->ret = 0; goto_out; + } log_debug_metadata("%s: %s metadata at " FMTu64 " size " FMTu64 " with wrap " FMTu32 " (in area at " FMTu64 " size " FMTu64 @@ -1373,13 +1382,11 @@ static int _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) *mda_free_sectors = ((buffer_size - 2 * current_usage) / 2) >> SECTOR_SHIFT; } - r = 1; - out: - return r; + ; } -static int _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char *buffer) +static void _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char *buffer) { const struct format_type *fmt = vfmp->fmt; struct mda_header *mdah = vfmp->mdah; @@ -1398,8 +1405,10 @@ static int _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char * buf[len] = '\0'; /* Ignore this entry if the characters aren't permissible */ - if (!validate_name(buf)) + if (!validate_name(buf)) { + vfmp->ret = 0; goto_out; + } /* We found a VG - now check the metadata */ if (rlocn->offset + rlocn->size > mdah->size) @@ -1408,6 +1417,7 @@ static int _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char * if (vfmp->wrap > rlocn->offset) { log_error("%s: metadata (" FMTu64 " bytes) too large for circular buffer (" FMTu64 " bytes)", dev_name(dev_area->dev), rlocn->size, mdah->size - MDA_HEADER_SIZE); + vfmp->ret = 0; goto out; } @@ -1424,13 +1434,15 @@ static int _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char * (uint32_t) (rlocn->size - vfmp->wrap), (off_t) (dev_area->start + MDA_HEADER_SIZE), vfmp->wrap, calc_crc, vgsummary->vgname ? 1 : 0, - vgsummary)) + vgsummary)) { + vfmp->ret = 0; goto_out; + } - return _vgname_from_mda_process(vfmp); + _vgname_from_mda_process(vfmp); out: - return 0; + ; } int vgname_from_mda(const struct format_type *fmt, @@ -1472,6 +1484,7 @@ int vgname_from_mda(const struct format_type *fmt, vfmp->vgsummary = vgsummary; vfmp->primary_mda = primary_mda; vfmp->mda_free_sectors = mda_free_sectors; + vfmp->ret = 1; /* Do quick check for a vgname */ /* We cannot read the full metadata here because the name has to be validated before we use the size field */ @@ -1479,7 +1492,9 @@ int vgname_from_mda(const struct format_type *fmt, NAME_LEN, MDA_CONTENT_REASON(primary_mda), buf)) return_0; - return _vgname_from_mda_validate(vfmp, buf); + _vgname_from_mda_validate(vfmp, buf); + + return vfmp->ret; } static int _scan_raw(const struct format_type *fmt, const char *vgname __attribute__((unused))) diff --git a/lib/format_text/import.c b/lib/format_text/import.c index d729659..580c1f3 100644 --- a/lib/format_text/import.c +++ b/lib/format_text/import.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2018 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -38,18 +38,16 @@ struct import_vgsummary_params { struct dm_config_tree *cft; int checksum_only; struct lvmcache_vgsummary *vgsummary; + int ret; }; -static int _import_vgsummary(struct import_vgsummary_params *ivsp) +static void _import_vgsummary(struct import_vgsummary_params *ivsp) { struct text_vg_version_ops **vsn; - int r = 0; - if (ivsp->checksum_only) { + if (ivsp->checksum_only) /* Checksum matches already-cached content - no need to reparse. */ - r = 1; goto out; - } /* * Find a set of version functions that can read this file @@ -58,16 +56,19 @@ static int _import_vgsummary(struct import_vgsummary_params *ivsp) if (!(*vsn)->check_version(ivsp->cft)) continue; - if (!(*vsn)->read_vgsummary(ivsp->fmt, ivsp->cft, ivsp->vgsummary)) + if (!(*vsn)->read_vgsummary(ivsp->fmt, ivsp->cft, ivsp->vgsummary)) { + ivsp->ret = 0; goto_out; + } - r = 1; - break; + goto out; } + /* Nothing found */ + ivsp->ret = 0; + out: config_destroy(ivsp->cft); - return r; } /* @@ -96,6 +97,7 @@ int text_vgsummary_import(const struct format_type *fmt, ivsp->fmt = fmt; ivsp->checksum_only = checksum_only; ivsp->vgsummary = vgsummary; + ivsp->ret = 1; if (!dev && !config_file_read(fmt->cmd->mem, ivsp->cft)) { log_error("Couldn't read volume group metadata."); @@ -112,7 +114,9 @@ int text_vgsummary_import(const struct format_type *fmt, return 0; } - return _import_vgsummary(ivsp); + _import_vgsummary(ivsp); + + return ivsp->ret; } struct cached_vg_fmtdata { diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 5e370d4..c4ea166 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2018 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -330,27 +330,23 @@ struct process_mda_header_params { struct metadata_area *mda; struct device *dev; struct lvmcache_vgsummary vgsummary; + int ret; }; -static int _process_vgsummary(struct process_mda_header_params *pmp, struct lvmcache_vgsummary *vgsummary) +static void _process_vgsummary(struct process_mda_header_params *pmp, struct lvmcache_vgsummary *vgsummary) { - int r = 0; - if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) { pmp->umb->ret = 0; + pmp->ret = 0; goto_out; } - r = 1; - out: if (!dev_close(pmp->dev)) stack; - - return r; } -static int _process_mda_header(struct process_mda_header_params *pmp, struct mda_header *mdah) +static void _process_mda_header(struct process_mda_header_params *pmp, struct mda_header *mdah) { struct update_mda_baton *umb = pmp->umb; const struct format_type *fmt = umb->label->labeller->fmt; @@ -365,7 +361,7 @@ static int _process_mda_header(struct process_mda_header_params *pmp, struct mda mdac->area.start); if (!dev_close(pmp->dev)) stack; - return 1; + return; } if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &pmp->vgsummary, @@ -374,10 +370,10 @@ static int _process_mda_header(struct process_mda_header_params *pmp, struct mda stack; if (!dev_close(pmp->dev)) stack; - return 1; + return; } - return _process_vgsummary(pmp, &pmp->vgsummary); + _process_vgsummary(pmp, &pmp->vgsummary); } static int _update_mda(struct metadata_area *mda, void *baton) @@ -411,6 +407,7 @@ static int _update_mda(struct metadata_area *mda, void *baton) pmp->umb = umb; pmp->mda = mda; + pmp->ret = 1; if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) { stack; @@ -419,7 +416,9 @@ static int _update_mda(struct metadata_area *mda, void *baton) return 1; } - return _process_mda_header(pmp, mdah); + _process_mda_header(pmp, mdah); + + return pmp->ret; } static int _text_read(struct labeller *l, struct device *dev, void *buf, struct label **label) diff --git a/lib/label/label.c b/lib/label/label.c index 26d94cf..5d5bcc5 100644 --- a/lib/label/label.c +++ b/lib/label/label.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2018 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -125,6 +125,8 @@ struct find_labeller_params { uint64_t label_sector; /* Sector where label found */ struct label **result; + + int ret; }; static void _set_label_read_result(int failed, struct find_labeller_params *flp) @@ -144,7 +146,7 @@ out: stack; } -static int _find_labeller(struct find_labeller_params *flp, char *readbuf) +static void _find_labeller(struct find_labeller_params *flp, char *readbuf) { struct device *dev = flp->dev; uint64_t scan_sector = flp->scan_sector; @@ -155,7 +157,8 @@ static int _find_labeller(struct find_labeller_params *flp, char *readbuf) struct label_header *lh; struct lvmcache_info *info; uint64_t sector; - int r = 0; + +int r = 0; /* Scan a few sectors for a valid label */ for (sector = 0; sector < LABEL_SCAN_SECTORS; @@ -215,12 +218,11 @@ static int _find_labeller(struct find_labeller_params *flp, char *readbuf) if ((info = lvmcache_info_from_pvid(dev->pvid, dev, 0))) _update_lvmcache_orphan(info); log_very_verbose("%s: No label detected", dev_name(dev)); + flp->ret = 0; } else - r = (l->ops->read)(l, dev, labelbuf, result); + flp->ret = (l->ops->read)(l, dev, labelbuf, result); - _set_label_read_result(!r, flp); - - return r; + _set_label_read_result(!flp->ret, flp); } /* FIXME Also wipe associated metadata area headers? */ @@ -318,6 +320,7 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label ** flp->dev = dev; flp->scan_sector = scan_sector; flp->result = result; + flp->ret = 1; /* Ensure result is always wiped as a precaution */ if (result) @@ -340,7 +343,8 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label ** return 0; } - return _find_labeller(flp, readbuf); + _find_labeller(flp, readbuf); + return flp->ret; } int label_read(struct device *dev, struct label **result, uint64_t scan_sector)
1
0
0
0
master - format_text: Split vgname_from_mda into three pieces.
by Alasdair Kergon
04 Jan '18
04 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=c70c9f65659df846dbc59…
Commit: c70c9f65659df846dbc590053569a80935e09d2f Parent: d61b1369d0764841522494ef3ba0ef4b5e89c723 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Thu Jan 4 21:13:44 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Thu Jan 4 21:13:44 2018 +0000 format_text: Split vgname_from_mda into three pieces. --- lib/format_text/format-text.c | 165 +++++++++++++++++++++++++++-------------- 1 files changed, 110 insertions(+), 55 deletions(-) diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 4404c04..798fd66 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1328,41 +1328,68 @@ static int _scan_file(const struct format_type *fmt, const char *vgname) return 1; } -int vgname_from_mda(const struct format_type *fmt, - struct mda_header *mdah, int primary_mda, struct device_area *dev_area, - struct lvmcache_vgsummary *vgsummary, uint64_t *mda_free_sectors) +struct vgname_from_mda_params{ + const struct format_type *fmt; + struct mda_header *mdah; + struct device_area *dev_area; + int primary_mda; + struct lvmcache_vgsummary *vgsummary; + uint64_t *mda_free_sectors; + uint32_t wrap; + unsigned used_cached_metadata; +}; + +static int _vgname_from_mda_process(struct vgname_from_mda_params *vfmp) { - struct raw_locn *rlocn; - uint32_t wrap = 0; - unsigned int len = 0; - char buf[NAME_LEN + 1] __attribute__((aligned(8))); + struct mda_header *mdah = vfmp->mdah; + struct device_area *dev_area = vfmp->dev_area; + struct lvmcache_vgsummary *vgsummary = vfmp->vgsummary; + uint64_t *mda_free_sectors = vfmp->mda_free_sectors; + struct raw_locn *rlocn = mdah->raw_locns; uint64_t buffer_size, current_usage; - unsigned used_cached_metadata = 0; + int r = 0; - if (mda_free_sectors) - *mda_free_sectors = ((dev_area->size - MDA_HEADER_SIZE) / 2) >> SECTOR_SHIFT; + /* Ignore this entry if the characters aren't permissible */ + if (!validate_name(vgsummary->vgname)) + goto_out; - if (!mdah) { - log_error(INTERNAL_ERROR "vgname_from_mda called with NULL pointer for mda_header"); - return 0; - } + log_debug_metadata("%s: %s metadata at " FMTu64 " size " FMTu64 " with wrap " FMTu32 + " (in area at " FMTu64 " size " FMTu64 + ") for %s (" FMTVGID ")", + dev_name(dev_area->dev), + vfmp->used_cached_metadata ? "Using cached" : "Found", + dev_area->start + rlocn->offset, + rlocn->size, vfmp->wrap, dev_area->start, dev_area->size, vgsummary->vgname, + (char *)&vgsummary->vgid); - /* FIXME Cope with returning a list */ - rlocn = mdah->raw_locns; + if (mda_free_sectors) { + current_usage = ALIGN_ABSOLUTE(rlocn->size, dev_area->start + rlocn->offset, MDA_ALIGNMENT); - /* - * If no valid offset, do not try to search for vgname - */ - if (!rlocn->offset) { - log_debug("%s: found metadata with offset 0.", - dev_name(dev_area->dev)); - return 0; + buffer_size = mdah->size - MDA_HEADER_SIZE; + + if (current_usage * 2 >= buffer_size) + *mda_free_sectors = UINT64_C(0); + else + *mda_free_sectors = ((buffer_size - 2 * current_usage) / 2) >> SECTOR_SHIFT; } - /* Do quick check for a vgname */ - if (!dev_read_buf(dev_area->dev, dev_area->start + rlocn->offset, - NAME_LEN, MDA_CONTENT_REASON(primary_mda), buf)) - return_0; + r = 1; + +out: + return r; +} + +static int _vgname_from_mda_validate(struct vgname_from_mda_params *vfmp, char *buffer) +{ + const struct format_type *fmt = vfmp->fmt; + struct mda_header *mdah = vfmp->mdah; + struct device_area *dev_area = vfmp->dev_area; + struct lvmcache_vgsummary *vgsummary = vfmp->vgsummary; + struct raw_locn *rlocn = mdah->raw_locns; + unsigned len = 0; + char buf[NAME_LEN + 1] __attribute__((aligned(8))); + + memcpy(buf, buffer, NAME_LEN + 1); while (buf[len] && !isspace(buf[len]) && buf[len] != '{' && len < (NAME_LEN - 1)) @@ -1372,16 +1399,16 @@ int vgname_from_mda(const struct format_type *fmt, /* Ignore this entry if the characters aren't permissible */ if (!validate_name(buf)) - return_0; + goto_out; /* We found a VG - now check the metadata */ if (rlocn->offset + rlocn->size > mdah->size) - wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size); + vfmp->wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size); - if (wrap > rlocn->offset) { + if (vfmp->wrap > rlocn->offset) { log_error("%s: metadata (" FMTu64 " bytes) too large for circular buffer (" FMTu64 " bytes)", dev_name(dev_area->dev), rlocn->size, mdah->size - MDA_HEADER_SIZE); - return 0; + goto out; } /* Did we see this metadata before? */ @@ -1389,42 +1416,70 @@ int vgname_from_mda(const struct format_type *fmt, vgsummary->mda_size = rlocn->size; if (lvmcache_lookup_mda(vgsummary)) - used_cached_metadata = 1; + vfmp->used_cached_metadata = 1; /* FIXME 64-bit */ - if (!text_vgsummary_import(fmt, dev_area->dev, MDA_CONTENT_REASON(primary_mda), + if (!text_vgsummary_import(fmt, dev_area->dev, MDA_CONTENT_REASON(vfmp->primary_mda), (off_t) (dev_area->start + rlocn->offset), - (uint32_t) (rlocn->size - wrap), + (uint32_t) (rlocn->size - vfmp->wrap), (off_t) (dev_area->start + MDA_HEADER_SIZE), - wrap, calc_crc, vgsummary->vgname ? 1 : 0, + vfmp->wrap, calc_crc, vgsummary->vgname ? 1 : 0, vgsummary)) - return_0; + goto_out; - /* Ignore this entry if the characters aren't permissible */ - if (!validate_name(vgsummary->vgname)) - return_0; + return _vgname_from_mda_process(vfmp); - log_debug_metadata("%s: %s metadata at " FMTu64 " size " FMTu64 " with wrap " FMTu32 - " (in area at " FMTu64 " size " FMTu64 - ") for %s (" FMTVGID ")", - dev_name(dev_area->dev), - used_cached_metadata ? "Using cached" : "Found", - dev_area->start + rlocn->offset, - rlocn->size, wrap, dev_area->start, dev_area->size, vgsummary->vgname, - (char *)&vgsummary->vgid); +out: + return 0; +} - if (mda_free_sectors) { - current_usage = ALIGN_ABSOLUTE(rlocn->size, dev_area->start + rlocn->offset, MDA_ALIGNMENT); +int vgname_from_mda(const struct format_type *fmt, + struct mda_header *mdah, int primary_mda, struct device_area *dev_area, + struct lvmcache_vgsummary *vgsummary, uint64_t *mda_free_sectors) +{ + struct raw_locn *rlocn; + char buf[NAME_LEN + 1] __attribute__((aligned(8))); + struct vgname_from_mda_params *vfmp; - buffer_size = mdah->size - MDA_HEADER_SIZE; + if (mda_free_sectors) + *mda_free_sectors = ((dev_area->size - MDA_HEADER_SIZE) / 2) >> SECTOR_SHIFT; - if (current_usage * 2 >= buffer_size) - *mda_free_sectors = UINT64_C(0); - else - *mda_free_sectors = ((buffer_size - 2 * current_usage) / 2) >> SECTOR_SHIFT; + if (!mdah) { + log_error(INTERNAL_ERROR "vgname_from_mda called with NULL pointer for mda_header"); + return 0; } - return 1; + /* FIXME Cope with returning a list */ + rlocn = mdah->raw_locns; + + /* + * If no valid offset, do not try to search for vgname + */ + if (!rlocn->offset) { + log_debug("%s: found metadata with offset 0.", + dev_name(dev_area->dev)); + return 0; + } + + if (!(vfmp = dm_pool_zalloc(fmt->cmd->mem, sizeof(*vfmp)))) { + log_error("vgname_from_mda_params allocation failed"); + return 0; + } + + vfmp->fmt = fmt; + vfmp->mdah = mdah; + vfmp->dev_area = dev_area; + vfmp->vgsummary = vgsummary; + vfmp->primary_mda = primary_mda; + vfmp->mda_free_sectors = mda_free_sectors; + + /* Do quick check for a vgname */ + /* We cannot read the full metadata here because the name has to be validated before we use the size field */ + if (!dev_read_buf(dev_area->dev, dev_area->start + rlocn->offset, + NAME_LEN, MDA_CONTENT_REASON(primary_mda), buf)) + return_0; + + return _vgname_from_mda_validate(vfmp, buf); } static int _scan_raw(const struct format_type *fmt, const char *vgname __attribute__((unused)))
1
0
0
0
master - format_text: Split out raw_read_mda_header processing
by Alasdair Kergon
04 Jan '18
04 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d61b1369d076484152249…
Commit: d61b1369d0764841522494ef3ba0ef4b5e89c723 Parent: 139209ef42f8ea986c22fb3c889dbf893da7160b Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Thu Jan 4 15:52:59 2018 +0000 Committer: Alasdair G Kergon <agk(a)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,
1
0
0
0
master - format_text: Split up _update_mda.
by Alasdair Kergon
04 Jan '18
04 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=139209ef42f8ea986c22f…
Commit: 139209ef42f8ea986c22fb3c889dbf893da7160b Parent: 111a9fcff5ace7391a9247678c8257da60cc37e6 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Thu Jan 4 00:56:34 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Thu Jan 4 12:25:24 2018 +0000 format_text: Split up _update_mda. Dedicated functions are now used to process each piece of data obtained, so the refactoring in this file gives us one for the vgsummary and one for the metadata header. This new type of function takes two parameters (for now), the obtained data plus a single struct (that must not reference any data on the stack) that wraps up the entire context needed to process it. --- lib/format_text/text_label.c | 99 +++++++++++++++++++++++++++++------------- 1 files changed, 69 insertions(+), 30 deletions(-) diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 42cf5b3..5e370d4 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -325,13 +325,74 @@ struct update_mda_baton { int ret; }; +struct process_mda_header_params { + struct update_mda_baton *umb; + struct metadata_area *mda; + struct device *dev; + struct lvmcache_vgsummary vgsummary; +}; + +static int _process_vgsummary(struct process_mda_header_params *pmp, struct lvmcache_vgsummary *vgsummary) +{ + int r = 0; + + if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) { + pmp->umb->ret = 0; + goto_out; + } + + r = 1; + +out: + if (!dev_close(pmp->dev)) + stack; + + return r; +} + +static int _process_mda_header(struct process_mda_header_params *pmp, struct mda_header *mdah) +{ + struct update_mda_baton *umb = pmp->umb; + const struct format_type *fmt = umb->label->labeller->fmt; + struct metadata_area *mda = pmp->mda; + struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; + + mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns)); + + if (mda_is_ignored(mda)) { + log_debug_metadata("Ignoring mda on device %s at offset " FMTu64, + dev_name(mdac->area.dev), + mdac->area.start); + if (!dev_close(pmp->dev)) + stack; + return 1; + } + + if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &pmp->vgsummary, + &mdac->free_sectors)) { + /* FIXME Separate fatal and non-fatal error cases? */ + stack; + if (!dev_close(pmp->dev)) + stack; + return 1; + } + + return _process_vgsummary(pmp, &pmp->vgsummary); +} + static int _update_mda(struct metadata_area *mda, void *baton) { + struct process_mda_header_params *pmp; struct update_mda_baton *umb = baton; const struct format_type *fmt = umb->label->labeller->fmt; + struct dm_pool *mem = umb->label->labeller->fmt->cmd->mem; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; struct mda_header *mdah; - struct lvmcache_vgsummary vgsummary = { 0 }; + + if (!(pmp = dm_pool_zalloc(mem, sizeof(*pmp)))) { + log_error("struct process_mda_header_params allocation failed"); + return 0; + } /* * Using the labeller struct to preserve info about @@ -346,41 +407,19 @@ static int _update_mda(struct metadata_area *mda, void *baton) return 1; } - if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) { - stack; - goto close_dev; - } + pmp->dev = mdac->area.dev; - mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns)); + pmp->umb = umb; + pmp->mda = mda; - if (mda_is_ignored(mda)) { - log_debug_metadata("Ignoring mda on device %s at offset " FMTu64, - dev_name(mdac->area.dev), - mdac->area.start); - if (!dev_close(mdac->area.dev)) - stack; - return 1; - } - - if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary, - &mdac->free_sectors)) { - /* FIXME Separate fatal and non-fatal error cases? */ + if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) { stack; - goto close_dev; - } - - if (!lvmcache_update_vgname_and_id(umb->info, &vgsummary)) { - if (!dev_close(mdac->area.dev)) + if (!dev_close(pmp->dev)) stack; - umb->ret = 0; - return_0; + return 1; } -close_dev: - if (!dev_close(mdac->area.dev)) - stack; - - return 1; + return _process_mda_header(pmp, mdah); } static int _text_read(struct labeller *l, struct device *dev, void *buf, struct label **label)
1
0
0
0
master - format_text: Split up _update_mda.
by Alasdair Kergon
03 Jan '18
03 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=59e8e2c6cb989dbf9cf16…
Commit: 59e8e2c6cb989dbf9cf161ceb30350441561b02b Parent: 111a9fcff5ace7391a9247678c8257da60cc37e6 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Thu Jan 4 00:56:34 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Thu Jan 4 01:40:18 2018 +0000 format_text: Split up _update_mda. Dedicated functions are now used to process each piece of data obtained, so the refactoring in this file gives us one for the vgsummary and one for the metadata header. This new type of function takes two parameters (for now), the obtained data plus a single struct (that must not reference any data on the stack) that wraps up the entire context needed to process it. --- lib/format_text/text_label.c | 99 +++++++++++++++++++++++++++++------------- 1 files changed, 69 insertions(+), 30 deletions(-) diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 42cf5b3..f02597c 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -325,13 +325,74 @@ struct update_mda_baton { int ret; }; +struct process_mda_header_params { + struct update_mda_baton *umb; + struct metadata_area mda; + struct device *dev; + struct lvmcache_vgsummary vgsummary; +}; + +static int _process_vgsummary(struct process_mda_header_params *pmp, struct lvmcache_vgsummary *vgsummary) +{ + int r = 0; + + if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) { + pmp->umb->ret = 0; + goto_out; + } + + r = 1; + +out: + if (!dev_close(pmp->dev)) + stack; + + return r; +} + +static int _process_mda_header(struct process_mda_header_params *pmp, struct mda_header *mdah) +{ + struct update_mda_baton *umb = pmp->umb; + const struct format_type *fmt = umb->label->labeller->fmt; + struct metadata_area *mda = &pmp->mda; + struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; + + mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns)); + + if (mda_is_ignored(mda)) { + log_debug_metadata("Ignoring mda on device %s at offset " FMTu64, + dev_name(mdac->area.dev), + mdac->area.start); + if (!dev_close(pmp->dev)) + stack; + return 1; + } + + if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &pmp->vgsummary, + &mdac->free_sectors)) { + /* FIXME Separate fatal and non-fatal error cases? */ + stack; + if (!dev_close(pmp->dev)) + stack; + return 1; + } + + return _process_vgsummary(pmp, &pmp->vgsummary); +} + static int _update_mda(struct metadata_area *mda, void *baton) { + struct process_mda_header_params *pmp; struct update_mda_baton *umb = baton; const struct format_type *fmt = umb->label->labeller->fmt; + struct dm_pool *mem = umb->label->labeller->fmt->cmd->mem; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; struct mda_header *mdah; - struct lvmcache_vgsummary vgsummary = { 0 }; + + if (!(pmp = dm_pool_zalloc(mem, sizeof(*pmp)))) { + log_error("struct process_mda_header_params allocation failed"); + return 0; + } /* * Using the labeller struct to preserve info about @@ -346,41 +407,19 @@ static int _update_mda(struct metadata_area *mda, void *baton) return 1; } - if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) { - stack; - goto close_dev; - } + pmp->dev = mdac->area.dev; - mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns)); + pmp->umb = umb; + pmp->mda = *mda; - if (mda_is_ignored(mda)) { - log_debug_metadata("Ignoring mda on device %s at offset " FMTu64, - dev_name(mdac->area.dev), - mdac->area.start); - if (!dev_close(mdac->area.dev)) - stack; - return 1; - } - - if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary, - &mdac->free_sectors)) { - /* FIXME Separate fatal and non-fatal error cases? */ + if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) { stack; - goto close_dev; - } - - if (!lvmcache_update_vgname_and_id(umb->info, &vgsummary)) { - if (!dev_close(mdac->area.dev)) + if (!dev_close(pmp->dev)) stack; - umb->ret = 0; - return_0; + return 1; } -close_dev: - if (!dev_close(mdac->area.dev)) - stack; - - return 1; + return _process_mda_header(pmp, mdah); } static int _text_read(struct labeller *l, struct device *dev, void *buf, struct label **label)
1
0
0
0
master - format_text: Allocate update_mda baton from mempool.
by Alasdair Kergon
03 Jan '18
03 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=111a9fcff5ace7391a924…
Commit: 111a9fcff5ace7391a9247678c8257da60cc37e6 Parent: 5a846e09297a56b6fdb0ba85a215164d08204589 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Wed Jan 3 23:53:00 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Wed Jan 3 23:53:00 2018 +0000 format_text: Allocate update_mda baton from mempool. Also store return code. Note that fatal and non-fatal errors while handling the mda aren't currently distinguished. --- lib/format_text/text_label.c | 56 +++++++++++++++++++++++++++-------------- 1 files changed, 37 insertions(+), 19 deletions(-) diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index d5e4820..42cf5b3 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -36,14 +36,14 @@ static int _text_can_handle(struct labeller *l __attribute__((unused)), return 0; } -struct _dl_setup_baton { +struct dl_setup_baton { struct disk_locn *pvh_dlocn_xl; struct device *dev; }; static int _da_setup(struct disk_locn *da, void *baton) { - struct _dl_setup_baton *p = baton; + struct dl_setup_baton *p = baton; p->pvh_dlocn_xl->offset = xlate64(da->offset); p->pvh_dlocn_xl->size = xlate64(da->size); p->pvh_dlocn_xl++; @@ -57,7 +57,7 @@ static int _ba_setup(struct disk_locn *ba, void *baton) static int _mda_setup(struct metadata_area *mda, void *baton) { - struct _dl_setup_baton *p = baton; + struct dl_setup_baton *p = baton; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; if (mdac->area.dev != p->dev) @@ -72,7 +72,7 @@ static int _mda_setup(struct metadata_area *mda, void *baton) static int _dl_null_termination(void *baton) { - struct _dl_setup_baton *p = baton; + struct dl_setup_baton *p = baton; p->pvh_dlocn_xl->offset = xlate64(UINT64_C(0)); p->pvh_dlocn_xl->size = xlate64(UINT64_C(0)); @@ -87,7 +87,7 @@ static int _text_write(struct label *label, void *buf) struct pv_header *pvhdr; struct pv_header_extension *pvhdr_ext; struct lvmcache_info *info; - struct _dl_setup_baton baton; + struct dl_setup_baton baton; char buffer[64] __attribute__((aligned(8))); int ba1, da1, mda1, mda2; @@ -319,15 +319,16 @@ static int _text_initialise_label(struct labeller *l __attribute__((unused)), return 1; } -struct _update_mda_baton { +struct update_mda_baton { struct lvmcache_info *info; struct label *label; + int ret; }; static int _update_mda(struct metadata_area *mda, void *baton) { - struct _update_mda_baton *p = baton; - const struct format_type *fmt = p->label->labeller->fmt; + struct update_mda_baton *umb = baton; + const struct format_type *fmt = umb->label->labeller->fmt; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn; struct mda_header *mdah; struct lvmcache_vgsummary vgsummary = { 0 }; @@ -361,11 +362,17 @@ static int _update_mda(struct metadata_area *mda, void *baton) return 1; } - if (vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary, - &mdac->free_sectors) && - !lvmcache_update_vgname_and_id(p->info, &vgsummary)) { + if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary, + &mdac->free_sectors)) { + /* FIXME Separate fatal and non-fatal error cases? */ + stack; + goto close_dev; + } + + if (!lvmcache_update_vgname_and_id(umb->info, &vgsummary)) { if (!dev_close(mdac->area.dev)) stack; + umb->ret = 0; return_0; } @@ -376,8 +383,7 @@ close_dev: return 1; } -static int _text_read(struct labeller *l, struct device *dev, void *buf, - struct label **label) +static int _text_read(struct labeller *l, struct device *dev, void *buf, struct label **label) { struct label_header *lh = (struct label_header *) buf; struct pv_header *pvhdr; @@ -386,7 +392,8 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf, struct disk_locn *dlocn_xl; uint64_t offset; uint32_t ext_version; - struct _update_mda_baton baton; + struct dm_pool *mem = l->fmt->cmd->mem; + struct update_mda_baton *umb; /* * PV header base @@ -396,7 +403,7 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf, if (!(info = lvmcache_add(l, (char *)pvhdr->pv_uuid, dev, FMT_TEXT_ORPHAN_VG_NAME, FMT_TEXT_ORPHAN_VG_NAME, 0))) - return_0; + goto_bad; *label = lvmcache_get_label(info); @@ -444,16 +451,27 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf, lvmcache_add_ba(info, offset, xlate64(dlocn_xl->size)); dlocn_xl++; } + out: - baton.info = info; - baton.label = *label; + if (!(umb = dm_pool_zalloc(mem, sizeof(*umb)))) { + log_error("baton allocation failed"); + goto_bad; + } + + umb->info = info; + umb->label = *label; + umb->ret = 1; - if (!lvmcache_foreach_mda(info, _update_mda, &baton)) + if (!lvmcache_foreach_mda(info, _update_mda, umb)) return_0; - lvmcache_make_valid(info); + if (umb->ret) + lvmcache_make_valid(info); return 1; + +bad: + return 0; } static void _text_destroy_label(struct labeller *l __attribute__((unused)),
1
0
0
0
master - format_text: Split the text import fns into two pieces.
by Alasdair Kergon
03 Jan '18
03 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5a846e09297a56b6fdb0b…
Commit: 5a846e09297a56b6fdb0ba85a215164d08204589 Parent: 4b9806ab6f8723630c5284ed2baf1d82c7839a07 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Wed Jan 3 16:00:52 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Wed Jan 3 20:48:02 2018 +0000 format_text: Split the text import fns into two pieces. --- lib/format_text/import.c | 202 +++++++++++++++++++++++++++++++--------------- 1 files changed, 135 insertions(+), 67 deletions(-) diff --git a/lib/format_text/import.c b/lib/format_text/import.c index 039722a..d729659 100644 --- a/lib/format_text/import.c +++ b/lib/format_text/import.c @@ -33,6 +33,43 @@ static void _init_text_import(void) _text_import_initialised = 1; } +struct import_vgsummary_params { + const struct format_type *fmt; + struct dm_config_tree *cft; + int checksum_only; + struct lvmcache_vgsummary *vgsummary; +}; + +static int _import_vgsummary(struct import_vgsummary_params *ivsp) +{ + struct text_vg_version_ops **vsn; + int r = 0; + + if (ivsp->checksum_only) { + /* Checksum matches already-cached content - no need to reparse. */ + r = 1; + goto out; + } + + /* + * Find a set of version functions that can read this file + */ + for (vsn = &_text_vsn_list[0]; *vsn; vsn++) { + if (!(*vsn)->check_version(ivsp->cft)) + continue; + + if (!(*vsn)->read_vgsummary(ivsp->fmt, ivsp->cft, ivsp->vgsummary)) + goto_out; + + r = 1; + break; + } + +out: + config_destroy(ivsp->cft); + return r; +} + /* * Find out vgname on a given device. */ @@ -44,27 +81,68 @@ int text_vgsummary_import(const struct format_type *fmt, int checksum_only, struct lvmcache_vgsummary *vgsummary) { - struct dm_config_tree *cft; - struct text_vg_version_ops **vsn; - int r = 0; + struct import_vgsummary_params *ivsp; _init_text_import(); - if (!(cft = config_open(CONFIG_FILE_SPECIAL, NULL, 0))) + if (!(ivsp = dm_pool_zalloc(fmt->cmd->mem, sizeof(*ivsp)))) { + log_error("Failed to allocate import_vgsummary_params struct."); + return 0; + } + + if (!(ivsp->cft = config_open(CONFIG_FILE_SPECIAL, NULL, 0))) return_0; - if ((!dev && !config_file_read(fmt->cmd->mem, cft)) || - (dev && !config_file_read_fd(fmt->cmd->mem, cft, dev, reason, offset, size, - offset2, size2, checksum_fn, - vgsummary->mda_checksum, - checksum_only, 1))) { + ivsp->fmt = fmt; + ivsp->checksum_only = checksum_only; + ivsp->vgsummary = vgsummary; + + if (!dev && !config_file_read(fmt->cmd->mem, ivsp->cft)) { log_error("Couldn't read volume group metadata."); - goto out; + config_destroy(ivsp->cft); + return 0; } - if (checksum_only) { - /* Checksum matches already-cached content - no need to reparse. */ - r = 1; + if (dev && !config_file_read_fd(fmt->cmd->mem, ivsp->cft, dev, reason, offset, size, + offset2, size2, checksum_fn, + vgsummary->mda_checksum, + checksum_only, 1)) { + log_error("Couldn't read volume group metadata."); + config_destroy(ivsp->cft); + return 0; + } + + return _import_vgsummary(ivsp); +} + +struct cached_vg_fmtdata { + uint32_t cached_mda_checksum; + size_t cached_mda_size; +}; + +struct import_vg_params { + struct format_instance *fid; + struct dm_config_tree *cft; + int single_device; + int skip_parse; + unsigned *use_previous_vg; + struct volume_group *vg; + uint32_t checksum; + uint32_t total_size; + time_t *when; + struct cached_vg_fmtdata **vg_fmtdata; + char **desc; +}; + +static void _import_vg(struct import_vg_params *ivp) +{ + struct text_vg_version_ops **vsn; + + ivp->vg = NULL; + + if (ivp->skip_parse) { + if (ivp->use_previous_vg) + *ivp->use_previous_vg = 1; goto out; } @@ -72,25 +150,27 @@ int text_vgsummary_import(const struct format_type *fmt, * Find a set of version functions that can read this file */ for (vsn = &_text_vsn_list[0]; *vsn; vsn++) { - if (!(*vsn)->check_version(cft)) + if (!(*vsn)->check_version(ivp->cft)) continue; - if (!(*vsn)->read_vgsummary(fmt, cft, vgsummary)) + if (!(ivp->vg = (*vsn)->read_vg(ivp->fid, ivp->cft, ivp->single_device, 0))) goto_out; - r = 1; + (*vsn)->read_desc(ivp->vg->vgmem, ivp->cft, ivp->when, ivp->desc); break; } - out: - config_destroy(cft); - return r; -} + if (ivp->vg && ivp->vg_fmtdata && *ivp->vg_fmtdata) { + (*ivp->vg_fmtdata)->cached_mda_size = ivp->total_size; + (*ivp->vg_fmtdata)->cached_mda_checksum = ivp->checksum; + } -struct cached_vg_fmtdata { - uint32_t cached_mda_checksum; - size_t cached_mda_size; -}; + if (ivp->use_previous_vg) + *ivp->use_previous_vg = 0; + +out: + config_destroy(ivp->cft); +} struct volume_group *text_vg_import_fd(struct format_instance *fid, const char *file, @@ -104,10 +184,7 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid, uint32_t checksum, time_t *when, char **desc) { - struct volume_group *vg = NULL; - struct dm_config_tree *cft; - struct text_vg_version_ops **vsn; - int skip_parse; + struct import_vg_params *ivp; if (vg_fmtdata && !*vg_fmtdata && !(*vg_fmtdata = dm_pool_zalloc(fid->mem, sizeof(**vg_fmtdata)))) { @@ -115,56 +192,47 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid, return NULL; } - _init_text_import(); + if (!(ivp = dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*ivp)))) { + log_error("Failed to allocate import_vgsummary_params struct."); + return NULL; + } - *desc = NULL; - *when = 0; + _init_text_import(); - if (!(cft = config_open(CONFIG_FILE_SPECIAL, file, 0))) + ivp->fid = fid; + ivp->when = when; + *ivp->when = 0; + ivp->desc = desc; + *ivp->desc = NULL; + ivp->single_device = single_device; + ivp->use_previous_vg = use_previous_vg; + ivp->checksum = checksum; + ivp->total_size = size + size2; + ivp->vg_fmtdata = vg_fmtdata; + + if (!(ivp->cft = config_open(CONFIG_FILE_SPECIAL, file, 0))) return_NULL; /* Does the metadata match the already-cached VG? */ - skip_parse = vg_fmtdata && - ((*vg_fmtdata)->cached_mda_checksum == checksum) && - ((*vg_fmtdata)->cached_mda_size == (size + size2)); - - if ((!dev && !config_file_read(fid->mem, cft)) || - (dev && !config_file_read_fd(fid->mem, cft, dev, MDA_CONTENT_REASON(primary_mda), offset, size, - offset2, size2, checksum_fn, checksum, - skip_parse, 1))) - goto_out; - - if (skip_parse) { - if (use_previous_vg) - *use_previous_vg = 1; - goto out; - } - - /* - * Find a set of version functions that can read this file - */ - for (vsn = &_text_vsn_list[0]; *vsn; vsn++) { - if (!(*vsn)->check_version(cft)) - continue; + ivp->skip_parse = vg_fmtdata && + ((*vg_fmtdata)->cached_mda_checksum == checksum) && + ((*vg_fmtdata)->cached_mda_size == ivp->total_size); - if (!(vg = (*vsn)->read_vg(fid, cft, single_device, 0))) - goto_out; - - (*vsn)->read_desc(vg->vgmem, cft, when, desc); - break; + if (!dev && !config_file_read(fid->mem, ivp->cft)) { + config_destroy(ivp->cft); + return_NULL; } - if (vg && vg_fmtdata && *vg_fmtdata) { - (*vg_fmtdata)->cached_mda_size = (size + size2); - (*vg_fmtdata)->cached_mda_checksum = checksum; + if (dev && !config_file_read_fd(fid->mem, ivp->cft, dev, MDA_CONTENT_REASON(primary_mda), offset, size, + offset2, size2, checksum_fn, checksum, + ivp->skip_parse, 1)) { + config_destroy(ivp->cft); + return_NULL; } - if (use_previous_vg) - *use_previous_vg = 0; + _import_vg(ivp); - out: - config_destroy(cft); - return vg; + return ivp->vg; } struct volume_group *text_vg_import_file(struct format_instance *fid,
1
0
0
0
master - toolcontext: Add paired label_init to refresh_toolcontext.
by Alasdair Kergon
02 Jan '18
02 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4b9806ab6f8723630c528…
Commit: 4b9806ab6f8723630c5284ed2baf1d82c7839a07 Parent: 22b6c482ecb4673c30aa1e9ae1946f9fc5497510 Author: Alasdair G Kergon <agk(a)redhat.com> AuthorDate: Tue Jan 2 22:00:31 2018 +0000 Committer: Alasdair G Kergon <agk(a)redhat.com> CommitterDate: Tue Jan 2 22:00:31 2018 +0000 toolcontext: Add paired label_init to refresh_toolcontext. label_init() and label_exit() should be paired. --- lib/commands/toolcontext.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index eda412e..364587c 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -2138,6 +2138,8 @@ int refresh_toolcontext(struct cmd_context *cmd) cmd->lib_dir = NULL; + label_init(); + if (!_init_lvm_conf(cmd)) return_0;
1
0
0
0
← Newer
1
2
3
4
5
6
7
Older →
Jump to page:
1
2
3
4
5
6
7
Results per page:
10
25
50
100
200