master - device: Introduce dev_read_callback
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5e7d3ad749d3de735ba...
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;
}
6 years, 3 months
master - metadata: Use a consistent format for callback fn parameters
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=946f07af3e8f97b0e48...
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 */
6 years, 3 months
master - metadata: Change the new data processing fns to void.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=a0ddfad94b92da4c5d2...
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)
6 years, 3 months
master - format_text: Split vgname_from_mda into three pieces.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=c70c9f65659df846dbc...
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)))
6 years, 3 months
master - format_text: Split out raw_read_mda_header processing
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d61b1369d0764841522...
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,
6 years, 3 months
master - format_text: Split up _update_mda.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=139209ef42f8ea986c2...
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)
6 years, 3 months
master - format_text: Split up _update_mda.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=59e8e2c6cb989dbf9cf...
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)
6 years, 3 months
master - format_text: Allocate update_mda baton from mempool.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=111a9fcff5ace7391a9...
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)),
6 years, 3 months
master - format_text: Split the text import fns into two pieces.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5a846e09297a56b6fdb...
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,
6 years, 3 months
master - toolcontext: Add paired label_init to refresh_toolcontext.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4b9806ab6f8723630c5...
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;
6 years, 3 months