master - format_text: Use malloc aligned for export buffer
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=e2438b5b9ff526cae8f...
Commit: e2438b5b9ff526cae8fa29ca7023b43995f00647
Parent: b65246499bb126097ca8a81c3de0ca39f4f56320
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Jan 9 21:52:19 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Jan 10 15:48:03 2018 +0000
format_text: Use malloc aligned for export buffer
---
lib/format_text/export.c | 13 +++++++------
1 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/lib/format_text/export.c b/lib/format_text/export.c
index 1bcaf83..08e1cda 100644
--- a/lib/format_text/export.c
+++ b/lib/format_text/export.c
@@ -124,11 +124,12 @@ static int _extend_buffer(struct formatter *f)
log_debug_metadata("Doubling metadata output buffer to " FMTu32,
f->data.buf.size * 2);
- if (!(newbuf = dm_realloc(f->data.buf.start,
- f->data.buf.size * 2))) {
- log_error("Buffer reallocation failed.");
- return 0;
- }
+ if (!(newbuf = dm_malloc_aligned(f->data.buf.size * 2, 0)))
+ return_0;
+
+ memcpy(newbuf, f->data.buf.start, f->data.buf.size);
+ free(f->data.buf.start);
+
f->data.buf.start = newbuf;
f->data.buf.size *= 2;
@@ -1065,7 +1066,7 @@ size_t text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf)
return_0;
f->data.buf.size = 65536; /* Initial metadata limit */
- if (!(f->data.buf.start = dm_malloc(f->data.buf.size))) {
+ if (!(f->data.buf.start = dm_malloc_aligned(f->data.buf.size, 0))) {
log_error("text_export buffer allocation failed");
goto out;
}
6 years, 2 months
master - label: Rename a variable
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=b65246499bb126097ca...
Commit: b65246499bb126097ca8a81c3de0ca39f4f56320
Parent: ea96381534360d6a893f0a48db8dd15fcb9ced33
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Jan 9 21:13:46 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Jan 10 15:48:03 2018 +0000
label: Rename a variable
---
lib/label/label.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/label/label.c b/lib/label/label.c
index ccee95d..362a1b0 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -248,7 +248,7 @@ int label_remove(struct device *dev)
struct labeller_i *li;
struct label_header *lh;
struct lvmcache_info *info;
- char *buf = NULL;
+ char *readbuf = NULL;
memset(labelbuf, 0, LABEL_SIZE);
@@ -263,7 +263,7 @@ int label_remove(struct device *dev)
*/
dev_flush(dev);
- if (!(buf = dev_read(dev, UINT64_C(0), LABEL_SCAN_SIZE, DEV_IO_LABEL))) {
+ if (!(readbuf = dev_read(dev, UINT64_C(0), LABEL_SCAN_SIZE, DEV_IO_LABEL))) {
log_debug_devs("%s: Failed to read label area", dev_name(dev));
goto out;
}
@@ -271,7 +271,7 @@ int label_remove(struct device *dev)
/* Scan first few sectors for anything looking like a label */
for (sector = 0; sector < LABEL_SCAN_SECTORS;
sector += LABEL_SIZE >> SECTOR_SHIFT) {
- lh = (struct label_header *) (buf + (sector << SECTOR_SHIFT));
+ lh = (struct label_header *) (readbuf + (sector << SECTOR_SHIFT));
wipe = 0;
@@ -309,7 +309,7 @@ int label_remove(struct device *dev)
if (!dev_close(dev))
stack;
- dm_free(buf);
+ dm_free(readbuf);
return r;
}
6 years, 2 months
master - libdm: Introduce dm_malloc_aligned
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ea96381534360d6a893...
Commit: ea96381534360d6a893f0a48db8dd15fcb9ced33
Parent: 943b21779770f1cd93e73925e62f108e2efbd6cc
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Jan 9 20:25:43 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Jan 10 15:48:03 2018 +0000
libdm: Introduce dm_malloc_aligned
---
WHATS_NEW_DM | 1 +
lib/device/dev-io.c | 10 ++++++++-
lib/label/label.c | 1 -
libdm/.exported_symbols.DM_1_02_147 | 1 +
libdm/libdevmapper.h | 3 ++
libdm/mm/dbg_malloc.c | 38 ++++++++++++++++++++++++++++++++++-
6 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index bcd6deb..5c6b888 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.147 -
=====================================
+ Introduce dm_malloc_aligned for page alignment of buffers.
Version 1.02.146 - 18th December 2017
=====================================
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 22a0d4c..ee4a0a5 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -257,6 +257,13 @@ static int _aligned_io(struct device_area *where, char *buffer,
/* Perform the I/O directly. */
return _io(where, buffer, should_write, reason);
+#ifndef DEBUG_MEM
+ /* Allocate a bounce buffer with an extra block */
+ if (!(bounce_buf = bounce = dm_malloc_aligned((size_t) widened.size, 0))) {
+ log_error("Bounce buffer malloc failed");
+ return 0;
+ }
+#else
/* Allocate a bounce buffer with an extra block */
if (!(bounce_buf = bounce = dm_malloc((size_t) widened.size + block_size))) {
log_error("Bounce buffer malloc failed");
@@ -268,6 +275,7 @@ static int _aligned_io(struct device_area *where, char *buffer,
*/
if (((uintptr_t) bounce) & mask)
bounce = (char *) ((((uintptr_t) bounce) + mask) & ~mask);
+#endif
/* Do we need to read into the bounce buffer? */
if ((!should_write || buffer_was_widened) &&
@@ -887,7 +895,7 @@ int dev_write(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t r
int dev_set(struct device *dev, uint64_t offset, size_t len, dev_io_reason_t reason, int value)
{
size_t s;
- char buffer[4096] __attribute__((aligned(8)));
+ char buffer[4096] __attribute__((aligned(4096)));
if (!dev_open(dev))
return_0;
diff --git a/lib/label/label.c b/lib/label/label.c
index 3a5c9fc..ccee95d 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -318,7 +318,6 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
{
struct lvmcache_info *info;
struct find_labeller_params *flp;
- char *readbuf = NULL;
if ((info = lvmcache_info_from_pvid(dev->pvid, dev, 1))) {
log_debug_devs("Reading label from lvmcache for %s", dev_name(dev));
diff --git a/libdm/.exported_symbols.DM_1_02_147 b/libdm/.exported_symbols.DM_1_02_147
new file mode 100644
index 0000000..97f00f7
--- /dev/null
+++ b/libdm/.exported_symbols.DM_1_02_147
@@ -0,0 +1 @@
+dm_malloc_aligned_wrapper
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 5e77906..2438f74 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -2075,6 +2075,8 @@ uint32_t dm_tree_get_cookie(struct dm_tree_node *node);
*/
void *dm_malloc_wrapper(size_t s, const char *file, int line)
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
+void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
+ __attribute__((__malloc__)) __attribute__((__warn_unused_result__));
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
void *dm_realloc_wrapper(void *p, unsigned int s, const char *file, int line)
@@ -2086,6 +2088,7 @@ int dm_dump_memory_wrapper(void);
void dm_bounds_check_wrapper(void);
#define dm_malloc(s) dm_malloc_wrapper((s), __FILE__, __LINE__)
+#define dm_malloc_aligned(s, a) dm_malloc_aligned_wrapper((s), (a), __FILE__, __LINE__)
#define dm_zalloc(s) dm_zalloc_wrapper((s), __FILE__, __LINE__)
#define dm_strdup(s) dm_strdup_wrapper((s), __FILE__, __LINE__)
#define dm_free(p) dm_free_wrapper(p)
diff --git a/libdm/mm/dbg_malloc.c b/libdm/mm/dbg_malloc.c
index 0667bf3..f108e7b 100644
--- a/libdm/mm/dbg_malloc.c
+++ b/libdm/mm/dbg_malloc.c
@@ -18,7 +18,6 @@
#ifdef VALGRIND_POOL
#include "memcheck.h"
#endif
-
#include <assert.h>
#include <stdarg.h>
@@ -26,6 +25,8 @@ void *dm_malloc_aux(size_t s, const char *file, int line)
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
void *dm_malloc_aux_debug(size_t s, const char *file, int line)
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
+static void *_dm_malloc_aligned_aux(size_t s, size_t a, const char *file, int line)
+ __attribute__((__malloc__)) __attribute__((__warn_unused_result__));
void *dm_zalloc_aux(size_t s, const char *file, int line)
__attribute__((__malloc__)) __attribute__((__warn_unused_result__));
void *dm_zalloc_aux_debug(size_t s, const char *file, int line)
@@ -286,6 +287,30 @@ void *dm_malloc_aux(size_t s, const char *file __attribute__((unused)),
return malloc(s);
}
+/* Allocate size s with alignment a (or page size if 0) */
+static void *_dm_malloc_aligned_aux(size_t s, size_t a, const char *file __attribute__((unused)),
+ int line __attribute__((unused)))
+{
+ void *memptr;
+ int r;
+
+ if (!a)
+ a = getpagesize();
+
+ if (s > 50000000) {
+ log_error("Huge memory allocation (size %" PRIsize_t
+ ") rejected - metadata corruption?", s);
+ return 0;
+ }
+
+ if ((r = posix_memalign(&memptr, a, s))) {
+ log_error("Failed to allocate %" PRIsize_t " bytes aligned to %d: %s", s, a, strerror(r));
+ return 0;
+ }
+
+ return memptr;
+}
+
void *dm_zalloc_aux(size_t s, const char *file, int line)
{
void *ptr = dm_malloc_aux(s, file, line);
@@ -303,6 +328,12 @@ void *dm_malloc_wrapper(size_t s, const char *file, int line)
return dm_malloc_aux_debug(s, file, line);
}
+void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
+{
+ /* FIXME Implement alignment when debugging - currently just ignored */
+ return _dm_malloc_aux_debug(s, file, line);
+}
+
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
{
return dm_zalloc_aux_debug(s, file, line);
@@ -340,6 +371,11 @@ void *dm_malloc_wrapper(size_t s, const char *file, int line)
return dm_malloc_aux(s, file, line);
}
+void *dm_malloc_aligned_wrapper(size_t s, size_t a, const char *file, int line)
+{
+ return _dm_malloc_aligned_aux(s, a, file, line);
+}
+
void *dm_zalloc_wrapper(size_t s, const char *file, int line)
{
return dm_zalloc_aux(s, file, line);
6 years, 2 months
master - man lvmlockd: remove lv resizing comment
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=943b21779770f1cd93e...
Commit: 943b21779770f1cd93e73925e62f108e2efbd6cc
Parent: 51340888aab5e1b8630c7d8083e621ca0f4e4264
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Jan 10 09:15:52 2018 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Wed Jan 10 09:17:57 2018 -0600
man lvmlockd: remove lv resizing comment
---
man/lvmlockd.8_main | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/man/lvmlockd.8_main b/man/lvmlockd.8_main
index bb45871..6f982bd 100644
--- a/man/lvmlockd.8_main
+++ b/man/lvmlockd.8_main
@@ -862,9 +862,6 @@ vgsplit
.br
\[bu]
vgmerge
-.br
-\[bu]
-resizing an LV that is active in the shared mode on multiple hosts
.SS lvmlockd changes from clvmd
6 years, 2 months
master - lvmlockd: print warning when skipping locking
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=51340888aab5e1b8630...
Commit: 51340888aab5e1b8630c7d8083e621ca0f4e4264
Parent: 46cedb105bb7fdba0107794ca5801c2a0e8fd524
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Jan 9 11:46:00 2018 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Tue Jan 9 11:46:00 2018 -0600
lvmlockd: print warning when skipping locking
---
tools/lvmcmdline.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 791e272..6be4bcd 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2684,12 +2684,18 @@ static int _init_lvmlockd(struct cmd_context *cmd)
if (use_lvmlockd && arg_is_set(cmd, lockopt_ARG)) {
const char *opts = arg_str_value(cmd, lockopt_ARG, "");
- if (strstr(opts, "skiplv"))
+ if (strstr(opts, "skiplv")) {
+ log_warn("WARNING: skipping LV lock in lvmlockd.");
cmd->lockd_lv_disable = 1;
- if (strstr(opts, "skipvg"))
+ }
+ if (strstr(opts, "skipvg")) {
+ log_warn("WARNING: skipping VG lock in lvmlockd.");
cmd->lockd_vg_disable = 1;
- if (strstr(opts, "skipgl"))
+ }
+ if (strstr(opts, "skipgl")) {
+ log_warn("WARNING: skipping global lock in lvmlockd.");
cmd->lockd_gl_disable = 1;
+ }
}
if (use_lvmlockd && locking_is_clustered()) {
6 years, 2 months
master - lvmlockd: add lockopt values for skipping selected locks
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=46cedb105bb7fdba010...
Commit: 46cedb105bb7fdba0107794ca5801c2a0e8fd524
Parent: f4675af4cfbc0139ba94ec3f18b15c09bf106a61
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Jan 9 11:18:57 2018 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Tue Jan 9 11:20:10 2018 -0600
lvmlockd: add lockopt values for skipping selected locks
and add lockopt to common options.
---
tools/command-lines.in | 9 ++++-----
tools/lvmcmdline.c | 10 ++++++++++
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/tools/command-lines.in b/tools/command-lines.in
index d0e5e06..a1776ce 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -187,7 +187,7 @@
# OO_ALL is included in every command automatically.
#
OO_ALL: --commandprofile String, --config String, --debug,
---driverloaded Bool, --help, --longhelp, --profile String, --quiet,
+--driverloaded Bool, --help, --lockopt String, --longhelp, --profile String, --quiet,
--verbose, --version, --yes, --test
#
@@ -1524,19 +1524,18 @@ ID: vgchange_systemid
DESC: Change the system ID of a VG.
vgchange --lockstart
-OO: --lockopt String, --select String
+OO: --select String
OP: VG|Tag|Select ...
ID: vgchange_lockstart
DESC: Start the lockspace of a shared VG in lvmlockd.
vgchange --lockstop
-OO: --lockopt String, --select String
+OO: --select String
OP: VG|Tag|Select ...
ID: vgchange_lockstop
DESC: Stop the lockspace of a shared VG in lvmlockd.
vgchange --locktype LockType VG
-OO: --lockopt String
ID: vgchange_locktype
DESC: Change the lock type for a shared VG.
@@ -1563,7 +1562,7 @@ OO: --addtag Tag, --alloc Alloc, --autobackup Bool, --clustered Bool, --maxlogic
--physicalextentsize SizeMB, --force, --zero Bool, --labelsector Number,
--metadatasize SizeMB, --pvmetadatacopies MetadataCopiesPV, --vgmetadatacopies MetadataCopiesVG,
--reportformat ReportFmt, --dataalignment SizeKB, --dataalignmentoffset SizeKB,
---shared, --systemid String, --locktype LockType, --lockopt String
+--shared, --systemid String, --locktype LockType
ID: vgcreate_general
---
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index b693722..791e272 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2682,6 +2682,16 @@ static int _init_lvmlockd(struct cmd_context *cmd)
return 1;
}
+ if (use_lvmlockd && arg_is_set(cmd, lockopt_ARG)) {
+ const char *opts = arg_str_value(cmd, lockopt_ARG, "");
+ if (strstr(opts, "skiplv"))
+ cmd->lockd_lv_disable = 1;
+ if (strstr(opts, "skipvg"))
+ cmd->lockd_vg_disable = 1;
+ if (strstr(opts, "skipgl"))
+ cmd->lockd_gl_disable = 1;
+ }
+
if (use_lvmlockd && locking_is_clustered()) {
log_error("ERROR: configuration setting use_lvmlockd cannot be used with clustered locking_type 3.");
return 0;
6 years, 2 months
master - format_text: Use vgsummary callbacks
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f4675af4cfbc0139ba9...
Commit: f4675af4cfbc0139ba94ec3f18b15c09bf106a61
Parent: 4b02d4e22eeb0dbf61e2c93f3803fbbaeffb0291
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Jan 9 01:50:23 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Jan 9 03:14:30 2018 +0000
format_text: Use vgsummary callbacks
---
lib/device/dev-cache.h | 2 +-
lib/format1/lvm1-label.c | 4 ++--
lib/format_text/format-text.c | 38 +++++++++++++++++++++++++-------------
lib/format_text/import-export.h | 4 +++-
lib/format_text/import.c | 11 ++++++++++-
lib/format_text/layout.h | 3 ++-
lib/format_text/text_label.c | 23 +++++++++++------------
lib/label/label.c | 2 +-
8 files changed, 55 insertions(+), 32 deletions(-)
diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h
index 0143dfa..5603553 100644
--- a/lib/device/dev-cache.h
+++ b/lib/device/dev-cache.h
@@ -23,7 +23,7 @@
* predicate for devices.
*/
struct dev_filter {
- int (*passes_filter) (struct dev_filter *f, struct device * dev);
+ int (*passes_filter) (struct dev_filter *f, struct device *dev);
void (*destroy) (struct dev_filter *f);
void (*wipe) (struct dev_filter *f);
int (*dump) (struct dev_filter *f, struct dm_pool *mem, int merge_existing);
diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c
index 6a2ec49..84d6f4e 100644
--- a/lib/format1/lvm1-label.c
+++ b/lib/format1/lvm1-label.c
@@ -91,8 +91,8 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct
r = 1;
out:
- if (read_label_callback_fn)
- read_label_callback_fn(!r, read_label_callback_context, NULL);
+ if (read_label_callback_fn)
+ read_label_callback_fn(!r, read_label_callback_context, NULL);
return r;
}
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index c2d6294..7e80a11 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -1360,6 +1360,8 @@ struct vgname_from_mda_params{
int primary_mda;
struct lvmcache_vgsummary *vgsummary;
uint64_t *mda_free_sectors;
+ lvm_callback_fn_t update_vgsummary_fn;
+ void *update_vgsummary_context;
uint32_t wrap;
unsigned used_cached_metadata;
int ret;
@@ -1375,6 +1377,11 @@ static void _vgname_from_mda_process(int failed, void *context, void *data)
struct raw_locn *rlocn = mdah->raw_locns;
uint64_t buffer_size, current_usage;
+ if (failed) {
+ vfmp->ret = 0;
+ goto_out;
+ }
+
/* Ignore this entry if the characters aren't permissible */
if (!validate_name(vgsummary->vgname)) {
vfmp->ret = 0;
@@ -1402,7 +1409,8 @@ static void _vgname_from_mda_process(int failed, void *context, void *data)
}
out:
- ;
+ if (vfmp->ret)
+ vfmp->update_vgsummary_fn(0, vfmp->update_vgsummary_context, vfmp->vgsummary);
}
static void _vgname_from_mda_validate(int failed, void *context, void *data)
@@ -1417,7 +1425,12 @@ static void _vgname_from_mda_validate(int failed, void *context, void *data)
unsigned len = 0;
char buf[NAME_LEN + 1] __attribute__((aligned(8)));
- memcpy(buf, buffer, NAME_LEN + 1);
+ if (failed) {
+ vfmp->ret = 0;
+ goto_out;
+ }
+
+ memcpy(buf, buffer, NAME_LEN);
while (buf[len] && !isspace(buf[len]) && buf[len] != '{' &&
len < (NAME_LEN - 1))
@@ -1455,23 +1468,22 @@ static void _vgname_from_mda_validate(int failed, void *context, void *data)
(uint32_t) (rlocn->size - vfmp->wrap),
(off_t) (dev_area->start + MDA_HEADER_SIZE),
vfmp->wrap, calc_crc, vgsummary->vgname ? 1 : 0,
- vgsummary)) {
+ vgsummary, _vgname_from_mda_process, vfmp)) {
vfmp->ret = 0;
goto_out;
}
- _vgname_from_mda_process(0, vfmp, NULL);
-
out:
- ;
+ if (!failed)
+ dm_free(data);
}
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 lvmcache_vgsummary *vgsummary, uint64_t *mda_free_sectors,
+ lvm_callback_fn_t update_vgsummary_fn, void *update_vgsummary_context)
{
struct raw_locn *rlocn;
- char buf[NAME_LEN + 1] __attribute__((aligned(8)));
struct vgname_from_mda_params *vfmp;
if (mda_free_sectors)
@@ -1505,16 +1517,16 @@ 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->update_vgsummary_fn = update_vgsummary_fn;
+ vfmp->update_vgsummary_context = update_vgsummary_context;
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 */
- if (!dev_read_buf(dev_area->dev, dev_area->start + rlocn->offset,
- NAME_LEN, MDA_CONTENT_REASON(primary_mda), buf))
+ if (!dev_read_callback(dev_area->dev, dev_area->start + rlocn->offset, NAME_LEN, MDA_CONTENT_REASON(primary_mda),
+ _vgname_from_mda_validate, vfmp))
return_0;
- _vgname_from_mda_validate(0, vfmp, buf);
-
return vfmp->ret;
}
@@ -1546,7 +1558,7 @@ static int _scan_raw(const struct format_type *fmt, const char *vgname __attribu
}
/* TODO: caching as in vgname_from_mda() (trigger this code?) */
- if (vgname_from_mda(fmt, mdah, 0, &rl->dev_area, &vgsummary, NULL)) {
+ if (vgname_from_mda(fmt, mdah, 0, &rl->dev_area, &vgsummary, NULL, NULL, NULL)) {
vg = _vg_read_raw_area(&fid, vgsummary.vgname, &rl->dev_area, NULL, NULL, 0, 0, 0);
if (vg)
lvmcache_update_vg(vg, 0);
diff --git a/lib/format_text/import-export.h b/lib/format_text/import-export.h
index 894d881..da6d2ab 100644
--- a/lib/format_text/import-export.h
+++ b/lib/format_text/import-export.h
@@ -89,6 +89,8 @@ int text_vgsummary_import(const struct format_type *fmt,
off_t offset2, uint32_t size2,
checksum_fn_t checksum_fn,
int checksum_only,
- struct lvmcache_vgsummary *vgsummary);
+ struct lvmcache_vgsummary *vgsummary,
+ lvm_callback_fn_t process_vgsummary_fn,
+ void *process_vgsummary_context);
#endif
diff --git a/lib/format_text/import.c b/lib/format_text/import.c
index a295b78..d6b72d4 100644
--- a/lib/format_text/import.c
+++ b/lib/format_text/import.c
@@ -38,6 +38,8 @@ struct import_vgsummary_params {
struct dm_config_tree *cft;
int checksum_only;
struct lvmcache_vgsummary *vgsummary;
+ lvm_callback_fn_t process_vgsummary_fn;
+ void *process_vgsummary_context;
int ret;
};
@@ -75,6 +77,9 @@ static void _import_vgsummary(int failed, void *context, void *data)
out:
config_destroy(ivsp->cft);
+
+ if (ivsp->ret && ivsp->process_vgsummary_fn)
+ ivsp->process_vgsummary_fn(0, ivsp->process_vgsummary_context, NULL);
}
/*
@@ -86,7 +91,9 @@ int text_vgsummary_import(const struct format_type *fmt,
off_t offset2, uint32_t size2,
checksum_fn_t checksum_fn,
int checksum_only,
- struct lvmcache_vgsummary *vgsummary)
+ struct lvmcache_vgsummary *vgsummary,
+ lvm_callback_fn_t process_vgsummary_fn,
+ void *process_vgsummary_context)
{
struct import_vgsummary_params *ivsp;
@@ -103,6 +110,8 @@ int text_vgsummary_import(const struct format_type *fmt,
ivsp->fmt = fmt;
ivsp->checksum_only = checksum_only;
ivsp->vgsummary = vgsummary;
+ ivsp->process_vgsummary_fn = process_vgsummary_fn;
+ ivsp->process_vgsummary_context = process_vgsummary_context;
ivsp->ret = 1;
if (!dev) {
diff --git a/lib/format_text/layout.h b/lib/format_text/layout.h
index 3320b0c..986f779 100644
--- a/lib/format_text/layout.h
+++ b/lib/format_text/layout.h
@@ -109,6 +109,7 @@ struct mda_context {
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);
+ uint64_t *mda_free_sectors,
+ lvm_callback_fn_t update_vgsummary_callback_fn, void *update_vgsummary_callback_context);
#endif
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index 60ce5db..d0782a9 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -343,6 +343,9 @@ static void _process_vgsummary(int failed, void *context, void *data)
--pmp->umb->nr_outstanding_mdas;
+ if (failed)
+ goto_out;
+
if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) {
pmp->umb->ret = 0;
pmp->ret = 0;
@@ -372,23 +375,19 @@ static void _process_mda_header(int failed, void *context, void *data)
log_debug_metadata("Ignoring mda on device %s at offset " FMTu64,
dev_name(mdac->area.dev),
mdac->area.start);
- --pmp->umb->nr_outstanding_mdas;
- if (!dev_close(pmp->dev))
- stack;
- return;
+ goto bad;
}
- if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &pmp->vgsummary,
- &mdac->free_sectors)) {
+ if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &pmp->vgsummary, &mdac->free_sectors, _process_vgsummary, pmp)) {
/* FIXME Separate fatal and non-fatal error cases? */
- stack;
- --pmp->umb->nr_outstanding_mdas;
- if (!dev_close(pmp->dev))
- stack;
- return;
+ goto_bad;
}
- _process_vgsummary(0, pmp, &pmp->vgsummary);
+ return;
+
+bad:
+ _process_vgsummary(1, pmp, NULL);
+ return;
}
static int _update_mda(struct metadata_area *mda, void *baton)
diff --git a/lib/label/label.c b/lib/label/label.c
index b116ea6..3a5c9fc 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -374,7 +374,7 @@ int label_read_callback(struct dm_pool *mem, struct device *dev, uint64_t scan_s
{
struct label **result; /* FIXME Eliminate this */
- if (!(result = dm_zalloc(sizeof(*result)))) {
+ if (!(result = dm_pool_zalloc(mem, sizeof(*result)))) {
log_error("Couldn't allocate memory for internal result pointer.");
return 0;
}
6 years, 2 months
master - label: Add label_read callback.
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4b02d4e22eeb0dbf61e...
Commit: 4b02d4e22eeb0dbf61e2c93f3803fbbaeffb0291
Parent: 6d322e68f302e5406e93ec7649f537776f78f641
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Mon Jan 8 23:08:22 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Jan 8 23:30:50 2018 +0000
label: Add label_read callback.
---
lib/cache/lvmcache.c | 15 +++++++++++++--
lib/label/label.c | 44 +++++++++++++++++++++++++++++++++++++-------
lib/label/label.h | 2 ++
3 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 25bf7ee..53f1c95 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -1095,6 +1095,14 @@ next:
goto next;
}
+/* Track the number of outstanding label reads */
+static void _process_label_data(int failed, void *context, void *data)
+{
+ int *nr_labels_outstanding = context;
+
+ (*nr_labels_outstanding)--;
+}
+
int lvmcache_label_scan(struct cmd_context *cmd)
{
struct dm_list del_cache_devs;
@@ -1106,6 +1114,7 @@ int lvmcache_label_scan(struct cmd_context *cmd)
struct device *dev;
struct format_type *fmt;
int dev_count = 0;
+ int nr_labels_outstanding = 0;
int r = 0;
@@ -1144,13 +1153,15 @@ int lvmcache_label_scan(struct cmd_context *cmd)
_destroy_duplicate_device_list(&_found_duplicate_devs);
while ((dev = dev_iter_get(iter))) {
- (void) label_read(dev, &label, UINT64_C(0));
+ nr_labels_outstanding++;
+ if (!label_read_callback(cmd->mem, dev, UINT64_C(0), _process_label_data, &nr_labels_outstanding))
+ nr_labels_outstanding--;
dev_count++;
}
dev_iter_destroy(iter);
- log_very_verbose("Scanned %d device labels", dev_count);
+ log_very_verbose("Scanned %d device labels (%d outstanding)", dev_count, nr_labels_outstanding);
/*
* _choose_preferred_devs() returns:
diff --git a/lib/label/label.c b/lib/label/label.c
index 0ed5c6a..b116ea6 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -122,8 +122,10 @@ static void _update_lvmcache_orphan(struct lvmcache_info *info)
struct find_labeller_params {
struct device *dev;
uint64_t scan_sector; /* Sector to be scanned */
-
uint64_t label_sector; /* Sector where label found */
+ lvm_callback_fn_t process_label_data_fn;
+ void *process_label_data_context;
+
struct label **result;
int ret;
@@ -134,8 +136,10 @@ static void _set_label_read_result(int failed, void *context, void *data)
struct find_labeller_params *flp = context;
struct label **result = flp->result;
- if (failed)
+ if (failed) {
+ flp->ret = 0;
goto_out;
+ }
if (result && *result) {
(*result)->dev = flp->dev;
@@ -145,6 +149,9 @@ static void _set_label_read_result(int failed, void *context, void *data)
out:
if (!dev_close(flp->dev))
stack;
+
+ if (flp->ret && flp->process_label_data_fn)
+ flp->process_label_data_fn(0, flp->process_label_data_context, NULL);
}
static void _find_labeller(int failed, void *context, void *data)
@@ -161,6 +168,12 @@ static void _find_labeller(int failed, void *context, void *data)
struct lvmcache_info *info;
uint64_t sector;
+ if (failed) {
+ log_debug_devs("%s: Failed to read label area", dev_name(dev));
+ _set_label_read_result(1, flp, NULL);
+ return;
+ }
+
/* Scan a few sectors for a valid label */
for (sector = 0; sector < LABEL_SCAN_SECTORS;
sector += LABEL_SIZE >> SECTOR_SHIFT) {
@@ -222,7 +235,7 @@ static void _find_labeller(int failed, void *context, void *data)
flp->ret = 0;
_set_label_read_result(1, flp, NULL);
} else
- flp->ret = (l->ops->read)(l, dev, labelbuf, result, &_set_label_read_result, flp);
+ (void) (l->ops->read)(l, dev, labelbuf, result, &_set_label_read_result, flp);
}
/* FIXME Also wipe associated metadata area headers? */
@@ -300,7 +313,8 @@ int label_remove(struct device *dev)
return r;
}
-static int _label_read(struct device *dev, uint64_t scan_sector, struct label **result)
+static int _label_read(struct device *dev, uint64_t scan_sector, struct label **result,
+ lvm_callback_fn_t process_label_data_fn, void *process_label_data_context)
{
struct lvmcache_info *info;
struct find_labeller_params *flp;
@@ -309,6 +323,8 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
if ((info = lvmcache_info_from_pvid(dev->pvid, dev, 1))) {
log_debug_devs("Reading label from lvmcache for %s", dev_name(dev));
*result = lvmcache_get_label(info);
+ if (process_label_data_fn)
+ process_label_data_fn(0, process_label_data_context, NULL);
return 1;
}
@@ -320,6 +336,8 @@ 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->process_label_data_fn = process_label_data_fn;
+ flp->process_label_data_context = process_label_data_context;
flp->ret = 1;
/* Ensure result is always wiped as a precaution */
@@ -337,19 +355,31 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
return 0;
}
- if (!(readbuf = dev_read(dev, scan_sector << SECTOR_SHIFT, LABEL_SCAN_SIZE, DEV_IO_LABEL))) {
+ if (!(dev_read_callback(dev, scan_sector << SECTOR_SHIFT, LABEL_SCAN_SIZE, DEV_IO_LABEL, _find_labeller, flp))) {
log_debug_devs("%s: Failed to read label area", dev_name(dev));
_set_label_read_result(1, flp, NULL);
return 0;
}
- _find_labeller(0, flp, readbuf);
return flp->ret;
}
int label_read(struct device *dev, struct label **result, uint64_t scan_sector)
{
- return _label_read(dev, scan_sector, result);
+ return _label_read(dev, scan_sector, result, NULL, NULL);
+}
+
+int label_read_callback(struct dm_pool *mem, struct device *dev, uint64_t scan_sector,
+ lvm_callback_fn_t process_label_data_fn, void *process_label_data_context)
+{
+ struct label **result; /* FIXME Eliminate this */
+
+ if (!(result = dm_zalloc(sizeof(*result)))) {
+ log_error("Couldn't allocate memory for internal result pointer.");
+ return 0;
+ }
+
+ return _label_read(dev, scan_sector, result, process_label_data_fn, process_label_data_context);
}
/* Caller may need to use label_get_handler to create label struct! */
diff --git a/lib/label/label.h b/lib/label/label.h
index 984acce..1f12294 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -96,6 +96,8 @@ struct labeller *label_get_handler(const char *name);
int label_remove(struct device *dev);
int label_read(struct device *dev, struct label **result,
uint64_t scan_sector);
+int label_read_callback(struct dm_pool *mem, struct device *dev, uint64_t scan_sector,
+ lvm_callback_fn_t process_label_data_fn, void *process_label_data_context);
int label_write(struct device *dev, struct label *label);
struct label *label_create(struct labeller *labeller);
void label_destroy(struct label *label);
6 years, 2 months
master - label: Add callback fns (partially)
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=6d322e68f302e5406e9...
Commit: 6d322e68f302e5406e93ec7649f537776f78f641
Parent: 5e7d3ad749d3de735ba213ad64637182afec2586
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sun Jan 7 03:43:25 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Jan 8 17:04:56 2018 +0000
label: Add callback fns (partially)
---
lib/format1/lvm1-label.c | 16 ++++++++--
lib/format_pool/pool_label.c | 12 ++++++--
lib/format_text/format-text.c | 63 ++++++++++++++++++++++++++---------------
lib/format_text/layout.h | 2 +
lib/format_text/text_label.c | 35 ++++++++++++++++++----
lib/label/label.c | 10 +++---
lib/label/label.h | 4 +-
7 files changed, 98 insertions(+), 44 deletions(-)
diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c
index 3b8a655..6a2ec49 100644
--- a/lib/format1/lvm1-label.c
+++ b/lib/format1/lvm1-label.c
@@ -54,8 +54,8 @@ static int _lvm1_write(struct label *label __attribute__((unused)), void *buf __
return 0;
}
-static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
- struct label **label)
+static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct pv_disk *pvd = (struct pv_disk *) buf;
struct vg_disk vgd;
@@ -63,6 +63,7 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
const char *vgid = FMT_LVM1_ORPHAN_VG_NAME;
const char *vgname = FMT_LVM1_ORPHAN_VG_NAME;
unsigned exported = 0;
+ int r;
munge_pvd(dev, pvd);
@@ -76,7 +77,8 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
if (!(info = lvmcache_add(l, (char *)pvd->pv_uuid, dev, vgname, vgid,
exported)))
- return_0;
+ goto_out;
+
*label = lvmcache_get_label(info);
lvmcache_set_device_size(info, ((uint64_t)xlate32(pvd->pv_size)) << SECTOR_SHIFT);
@@ -86,7 +88,13 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
lvmcache_del_bas(info);
lvmcache_make_valid(info);
- return 1;
+ r = 1;
+
+out:
+ if (read_label_callback_fn)
+ read_label_callback_fn(!r, read_label_callback_context, NULL);
+
+ return r;
}
static int _lvm1_initialise_label(struct labeller *l __attribute__((unused)), struct label *label)
diff --git a/lib/format_pool/pool_label.c b/lib/format_pool/pool_label.c
index 2e30a7b..451d7d0 100644
--- a/lib/format_pool/pool_label.c
+++ b/lib/format_pool/pool_label.c
@@ -55,12 +55,18 @@ static int _pool_write(struct label *label __attribute__((unused)), void *buf __
return 0;
}
-static int _pool_read(struct labeller *l, struct device *dev, void *buf,
- struct label **label)
+static int _pool_read(struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct pool_list pl;
+ int r;
- return read_pool_label(&pl, l, dev, buf, label);
+ r = read_pool_label(&pl, l, dev, buf, label);
+
+ if (read_label_callback_fn)
+ read_label_callback_fn(!r, read_label_callback_context, NULL);
+
+ return r;
}
static int _pool_initialise_label(struct labeller *l __attribute__((unused)), struct label *label)
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index a0aff4d..c2d6294 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -329,6 +329,8 @@ static void _xlate_mdah(struct mda_header *mdah)
struct process_raw_mda_header_params {
struct mda_header *mdah;
struct device_area dev_area;
+ lvm_callback_fn_t mdah_callback_fn;
+ void *mdah_callback_context;
int ret;
};
@@ -338,10 +340,13 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
struct mda_header *mdah = prmp->mdah;
struct device_area *dev_area = &prmp->dev_area;
- if (!dev_close(dev_area->dev)) {
- prmp->ret = 0;
- goto_out;
- }
+ if (!dev_close(dev_area->dev))
+ goto_bad;
+
+ if (failed)
+ goto_bad;
+
+ memcpy(mdah, data, MDA_HEADER_SIZE);
if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, (uint8_t *)mdah->magic,
MDA_HEADER_SIZE -
@@ -349,8 +354,7 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
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;
+ goto bad;
}
_xlate_mdah(mdah);
@@ -359,31 +363,37 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
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;
+ goto bad;
}
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);
- prmp->ret = 0;
- goto out;
+ goto bad;
}
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);
- prmp->ret = 0;
- goto out;
+ goto bad;
}
+ goto out;
+
+bad:
+ prmp->ret = 0;
out:
- ;
+ if (!failed)
+ dm_free(data);
+
+ if (prmp->ret && prmp->mdah_callback_fn)
+ prmp->mdah_callback_fn(0, prmp->mdah_callback_context, mdah);
}
-static 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,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context)
{
struct mda_header *mdah;
struct process_raw_mda_header_params *prmp;
@@ -406,15 +416,13 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic
prmp->mdah = mdah;
prmp->dev_area = *dev_area;
+ prmp->mdah_callback_fn = mdah_callback_fn;
+ prmp->mdah_callback_context = mdah_callback_context;
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))
- stack;
- return_NULL;
- }
-
- _process_raw_mda_header(0, prmp, NULL);
+ if (!dev_read_callback(dev_area->dev, dev_area->start, MDA_HEADER_SIZE, MDA_HEADER_REASON(primary_mda),
+ _process_raw_mda_header, prmp))
+ stack;
if (!prmp->ret)
return_NULL;
@@ -424,7 +432,16 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic
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);
+ return _raw_read_mda_header(mem, dev_area, primary_mda, NULL, NULL);
+}
+
+int raw_read_mda_header_callback(struct dm_pool *mem, struct device_area *dev_area, int primary_mda,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context)
+{
+ if (!_raw_read_mda_header(mem, dev_area, primary_mda, mdah_callback_fn, mdah_callback_context))
+ return_0;
+
+ return 1;
}
static int _raw_write_mda_header(const struct format_type *fmt,
@@ -2002,7 +2019,7 @@ static int _mda_export_text_raw(struct metadata_area *mda,
{
struct mda_context *mdc = (struct mda_context *) mda->metadata_locn;
- if (!mdc || !_raw_read_mda_header(cft->mem, &mdc->area, mda_is_primary(mda)))
+ if (!mdc || !_raw_read_mda_header(cft->mem, &mdc->area, mda_is_primary(mda), NULL, NULL))
return 1; /* pretend the MDA does not exist */
return config_make_nodes(cft, parent, NULL,
diff --git a/lib/format_text/layout.h b/lib/format_text/layout.h
index c0906a6..3320b0c 100644
--- a/lib/format_text/layout.h
+++ b/lib/format_text/layout.h
@@ -82,6 +82,8 @@ struct mda_header {
} __attribute__ ((packed));
struct mda_header *raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda);
+int raw_read_mda_header_callback(struct dm_pool *mem, struct device_area *dev_area, int primary_mda,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context);
struct mda_lists {
struct dm_list dirs;
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index 05e1626..60ce5db 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -322,6 +322,9 @@ static int _text_initialise_label(struct labeller *l __attribute__((unused)),
struct update_mda_baton {
struct lvmcache_info *info;
struct label *label;
+ int nr_outstanding_mdas;
+ lvm_callback_fn_t read_label_callback_fn;
+ void *read_label_callback_context;
int ret;
};
@@ -338,6 +341,8 @@ static void _process_vgsummary(int failed, void *context, void *data)
struct process_mda_header_params *pmp = context;
struct lvmcache_vgsummary *vgsummary = data;
+ --pmp->umb->nr_outstanding_mdas;
+
if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) {
pmp->umb->ret = 0;
pmp->ret = 0;
@@ -358,12 +363,16 @@ static void _process_mda_header(int failed, void *context, void *data)
struct metadata_area *mda = pmp->mda;
struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
+ if (failed)
+ return;
+
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);
+ --pmp->umb->nr_outstanding_mdas;
if (!dev_close(pmp->dev))
stack;
return;
@@ -373,6 +382,7 @@ static void _process_mda_header(int failed, void *context, void *data)
&mdac->free_sectors)) {
/* FIXME Separate fatal and non-fatal error cases? */
stack;
+ --pmp->umb->nr_outstanding_mdas;
if (!dev_close(pmp->dev))
stack;
return;
@@ -388,7 +398,6 @@ static int _update_mda(struct metadata_area *mda, void *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;
if (!(pmp = dm_pool_zalloc(mem, sizeof(*pmp)))) {
log_error("struct process_mda_header_params allocation failed");
@@ -408,25 +417,26 @@ static int _update_mda(struct metadata_area *mda, void *baton)
return 1;
}
+ umb->nr_outstanding_mdas++;
pmp->dev = mdac->area.dev;
pmp->umb = umb;
pmp->mda = mda;
pmp->ret = 1;
- if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) {
+ if (!raw_read_mda_header_callback(fmt->cmd->mem, &mdac->area, mda_is_primary(mda), _process_mda_header, pmp)) {
stack;
+ --pmp->umb->nr_outstanding_mdas;
if (!dev_close(pmp->dev))
stack;
return 1;
}
- _process_mda_header(0, pmp, mdah);
-
return pmp->ret;
}
-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,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct label_header *lh = (struct label_header *) buf;
struct pv_header *pvhdr;
@@ -503,17 +513,28 @@ out:
umb->info = info;
umb->label = *label;
+ umb->read_label_callback_fn = read_label_callback_fn;
+ umb->read_label_callback_context = read_label_callback_context;
+ umb->nr_outstanding_mdas = 1;
+
umb->ret = 1;
if (!lvmcache_foreach_mda(info, _update_mda, umb))
return_0;
- if (umb->ret)
- lvmcache_make_valid(info);
+ if (!--umb->nr_outstanding_mdas)
+ if (umb->ret)
+ lvmcache_make_valid(info);
+
+ if (umb->read_label_callback_fn)
+ umb->read_label_callback_fn(!umb->ret, umb->read_label_callback_context, NULL);
return 1;
bad:
+ if (read_label_callback_fn)
+ read_label_callback_fn(1, read_label_callback_context, NULL);
+
return 0;
}
diff --git a/lib/label/label.c b/lib/label/label.c
index a187bad..0ed5c6a 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -129,8 +129,9 @@ struct find_labeller_params {
int ret;
};
-static void _set_label_read_result(int failed, struct find_labeller_params *flp)
+static void _set_label_read_result(int failed, void *context, void *data)
{
+ struct find_labeller_params *flp = context;
struct label **result = flp->result;
if (failed)
@@ -219,10 +220,9 @@ static void _find_labeller(int failed, void *context, void *data)
_update_lvmcache_orphan(info);
log_very_verbose("%s: No label detected", dev_name(dev));
flp->ret = 0;
+ _set_label_read_result(1, flp, NULL);
} else
- flp->ret = (l->ops->read)(l, dev, labelbuf, result);
-
- _set_label_read_result(!flp->ret, flp);
+ flp->ret = (l->ops->read)(l, dev, labelbuf, result, &_set_label_read_result, flp);
}
/* FIXME Also wipe associated metadata area headers? */
@@ -339,7 +339,7 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
if (!(readbuf = dev_read(dev, scan_sector << SECTOR_SHIFT, LABEL_SCAN_SIZE, DEV_IO_LABEL))) {
log_debug_devs("%s: Failed to read label area", dev_name(dev));
- _set_label_read_result(1, flp);
+ _set_label_read_result(1, flp, NULL);
return 0;
}
diff --git a/lib/label/label.h b/lib/label/label.h
index ea11290..984acce 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -62,8 +62,8 @@ struct label_ops {
/*
* Read a label from a volume.
*/
- int (*read) (struct labeller * l, struct device * dev,
- void *buf, struct label ** label);
+ int (*read) (struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t label_read_callback_fn, void *label_read_callback_context);
/*
* Populate label_type etc.
6 years, 2 months
master - label: Add callback fns (partially)
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=a9fe4886ba08771b3bc...
Commit: a9fe4886ba08771b3bc013516857109818822c6a
Parent: 5e7d3ad749d3de735ba213ad64637182afec2586
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sat Jan 6 02:43:54 2018 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Sat Jan 6 04:14:51 2018 +0000
label: Add callback fns (partially)
---
lib/format1/lvm1-label.c | 16 ++++++++---
lib/format_pool/pool_label.c | 10 +++++--
lib/format_text/format-text.c | 61 ++++++++++++++++++++++++++---------------
lib/format_text/layout.h | 2 +
lib/format_text/text_label.c | 28 ++++++++++++++-----
lib/label/label.c | 10 +++---
lib/label/label.h | 4 +-
7 files changed, 88 insertions(+), 43 deletions(-)
diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c
index 3b8a655..6a2ec49 100644
--- a/lib/format1/lvm1-label.c
+++ b/lib/format1/lvm1-label.c
@@ -54,8 +54,8 @@ static int _lvm1_write(struct label *label __attribute__((unused)), void *buf __
return 0;
}
-static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
- struct label **label)
+static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct pv_disk *pvd = (struct pv_disk *) buf;
struct vg_disk vgd;
@@ -63,6 +63,7 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
const char *vgid = FMT_LVM1_ORPHAN_VG_NAME;
const char *vgname = FMT_LVM1_ORPHAN_VG_NAME;
unsigned exported = 0;
+ int r;
munge_pvd(dev, pvd);
@@ -76,7 +77,8 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
if (!(info = lvmcache_add(l, (char *)pvd->pv_uuid, dev, vgname, vgid,
exported)))
- return_0;
+ goto_out;
+
*label = lvmcache_get_label(info);
lvmcache_set_device_size(info, ((uint64_t)xlate32(pvd->pv_size)) << SECTOR_SHIFT);
@@ -86,7 +88,13 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf,
lvmcache_del_bas(info);
lvmcache_make_valid(info);
- return 1;
+ r = 1;
+
+out:
+ if (read_label_callback_fn)
+ read_label_callback_fn(!r, read_label_callback_context, NULL);
+
+ return r;
}
static int _lvm1_initialise_label(struct labeller *l __attribute__((unused)), struct label *label)
diff --git a/lib/format_pool/pool_label.c b/lib/format_pool/pool_label.c
index 2e30a7b..cd6c82a 100644
--- a/lib/format_pool/pool_label.c
+++ b/lib/format_pool/pool_label.c
@@ -55,12 +55,16 @@ static int _pool_write(struct label *label __attribute__((unused)), void *buf __
return 0;
}
-static int _pool_read(struct labeller *l, struct device *dev, void *buf,
- struct label **label)
+static int _pool_read(struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct pool_list pl;
+ int r;
- return read_pool_label(&pl, l, dev, buf, label);
+ r = read_pool_label(&pl, l, dev, buf, label);
+
+ if (read_label_callback_fn)
+ read_label_callback_fn(!r, read_label_callback_context, NULL);
}
static int _pool_initialise_label(struct labeller *l __attribute__((unused)), struct label *label)
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index a0aff4d..2158b5f 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -329,6 +329,8 @@ static void _xlate_mdah(struct mda_header *mdah)
struct process_raw_mda_header_params {
struct mda_header *mdah;
struct device_area dev_area;
+ lvm_callback_fn_t mdah_callback_fn;
+ void *mdah_callback_context;
int ret;
};
@@ -338,10 +340,13 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
struct mda_header *mdah = prmp->mdah;
struct device_area *dev_area = &prmp->dev_area;
- if (!dev_close(dev_area->dev)) {
- prmp->ret = 0;
+ if (!dev_close(dev_area->dev))
goto_out;
- }
+
+ if (failed)
+ goto_bad;
+
+ memcpy(mdah, data, MDA_HEADER_SIZE);
if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, (uint8_t *)mdah->magic,
MDA_HEADER_SIZE -
@@ -349,8 +354,7 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
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;
+ goto bad;
}
_xlate_mdah(mdah);
@@ -359,31 +363,37 @@ static void _process_raw_mda_header(int failed, void *context, void *data)
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;
+ goto bad;
}
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);
- prmp->ret = 0;
- goto out;
+ goto bad;
}
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);
- prmp->ret = 0;
- goto out;
+ goto bad;
}
+ goto out;
+
+bad:
+ prmp->ret = 0;
out:
- ;
+ if (!failed)
+ dm_free(data);
+
+ if (prmp->mdah_callback_fn)
+ prmp->mdah_callback_fn(!prmp->ret, prmp->mdah_callback_context, mdah);
}
-static 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,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context)
{
struct mda_header *mdah;
struct process_raw_mda_header_params *prmp;
@@ -406,15 +416,13 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic
prmp->mdah = mdah;
prmp->dev_area = *dev_area;
+ prmp->mdah_callback_fn = mdah_callback_fn;
+ prmp->mdah_callback_context = mdah_callback_context;
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))
- stack;
- return_NULL;
- }
-
- _process_raw_mda_header(0, prmp, NULL);
+ if (!dev_read_callback(dev_area->dev, dev_area->start, MDA_HEADER_SIZE, MDA_HEADER_REASON(primary_mda),
+ _process_raw_mda_header, prmp))
+ stack;
if (!prmp->ret)
return_NULL;
@@ -424,7 +432,16 @@ static struct mda_header *_raw_read_mda_header(struct dm_pool *mem, struct devic
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);
+ return _raw_read_mda_header(mem, dev_area, primary_mda, NULL, NULL);
+}
+
+int raw_read_mda_header_callback(struct dm_pool *mem, struct device_area *dev_area, int primary_mda,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context)
+{
+ if (!_raw_read_mda_header(mem, dev_area, primary_mda, mdah_callback_fn, mdah_callback_context))
+ return_0;
+
+ return 1;
}
static int _raw_write_mda_header(const struct format_type *fmt,
@@ -2002,7 +2019,7 @@ static int _mda_export_text_raw(struct metadata_area *mda,
{
struct mda_context *mdc = (struct mda_context *) mda->metadata_locn;
- if (!mdc || !_raw_read_mda_header(cft->mem, &mdc->area, mda_is_primary(mda)))
+ if (!mdc || !_raw_read_mda_header(cft->mem, &mdc->area, mda_is_primary(mda), NULL, NULL))
return 1; /* pretend the MDA does not exist */
return config_make_nodes(cft, parent, NULL,
diff --git a/lib/format_text/layout.h b/lib/format_text/layout.h
index c0906a6..3320b0c 100644
--- a/lib/format_text/layout.h
+++ b/lib/format_text/layout.h
@@ -82,6 +82,8 @@ struct mda_header {
} __attribute__ ((packed));
struct mda_header *raw_read_mda_header(struct dm_pool *mem, struct device_area *dev_area, int primary_mda);
+int raw_read_mda_header_callback(struct dm_pool *mem, struct device_area *dev_area, int primary_mda,
+ lvm_callback_fn_t mdah_callback_fn, void *mdah_callback_context);
struct mda_lists {
struct dm_list dirs;
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index 05e1626..3f090b4 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -322,6 +322,9 @@ static int _text_initialise_label(struct labeller *l __attribute__((unused)),
struct update_mda_baton {
struct lvmcache_info *info;
struct label *label;
+ int nr_outstanding_mdas;
+ lvm_callback_fn_t read_label_callback_fn;
+ void *read_label_callback_context;
int ret;
};
@@ -338,6 +341,8 @@ static void _process_vgsummary(int failed, void *context, void *data)
struct process_mda_header_params *pmp = context;
struct lvmcache_vgsummary *vgsummary = data;
+ --pmp->umb->nr_outstanding_mdas;
+
if (!lvmcache_update_vgname_and_id(pmp->umb->info, vgsummary)) {
pmp->umb->ret = 0;
pmp->ret = 0;
@@ -388,7 +393,6 @@ static int _update_mda(struct metadata_area *mda, void *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;
if (!(pmp = dm_pool_zalloc(mem, sizeof(*pmp)))) {
log_error("struct process_mda_header_params allocation failed");
@@ -408,25 +412,25 @@ static int _update_mda(struct metadata_area *mda, void *baton)
return 1;
}
+ umb->nr_outstanding_mdas++;
pmp->dev = mdac->area.dev;
pmp->umb = umb;
pmp->mda = mda;
pmp->ret = 1;
- if (!(mdah = raw_read_mda_header(fmt->cmd->mem, &mdac->area, mda_is_primary(mda)))) {
+ if (!raw_read_mda_header_callback(fmt->cmd->mem, &mdac->area, mda_is_primary(mda), _process_mda_header, pmp)) {
stack;
if (!dev_close(pmp->dev))
stack;
return 1;
}
- _process_mda_header(0, pmp, mdah);
-
return pmp->ret;
}
-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,
+ lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context)
{
struct label_header *lh = (struct label_header *) buf;
struct pv_header *pvhdr;
@@ -503,17 +507,27 @@ out:
umb->info = info;
umb->label = *label;
+ umb->read_label_callback_fn = read_label_callback_fn;
+ umb->read_label_callback_context = read_label_callback_context;
+ umb->nr_outstanding_mdas = 1;
+
umb->ret = 1;
if (!lvmcache_foreach_mda(info, _update_mda, umb))
return_0;
- if (umb->ret)
- lvmcache_make_valid(info);
+ if (!--umb->nr_outstanding_mdas)
+ if (umb->ret)
+ lvmcache_make_valid(info);
+
+ if (umb->read_label_callback_fn)
+ umb->read_label_callback_fn(!umb->ret, umb->read_label_callback_context, NULL);
return 1;
bad:
+ if (umb->read_label_callback_fn)
+ umb->read_label_callback_fn(1, umb->read_label_callback_context, NULL);
return 0;
}
diff --git a/lib/label/label.c b/lib/label/label.c
index a187bad..0ed5c6a 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -129,8 +129,9 @@ struct find_labeller_params {
int ret;
};
-static void _set_label_read_result(int failed, struct find_labeller_params *flp)
+static void _set_label_read_result(int failed, void *context, void *data)
{
+ struct find_labeller_params *flp = context;
struct label **result = flp->result;
if (failed)
@@ -219,10 +220,9 @@ static void _find_labeller(int failed, void *context, void *data)
_update_lvmcache_orphan(info);
log_very_verbose("%s: No label detected", dev_name(dev));
flp->ret = 0;
+ _set_label_read_result(1, flp, NULL);
} else
- flp->ret = (l->ops->read)(l, dev, labelbuf, result);
-
- _set_label_read_result(!flp->ret, flp);
+ flp->ret = (l->ops->read)(l, dev, labelbuf, result, &_set_label_read_result, flp);
}
/* FIXME Also wipe associated metadata area headers? */
@@ -339,7 +339,7 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
if (!(readbuf = dev_read(dev, scan_sector << SECTOR_SHIFT, LABEL_SCAN_SIZE, DEV_IO_LABEL))) {
log_debug_devs("%s: Failed to read label area", dev_name(dev));
- _set_label_read_result(1, flp);
+ _set_label_read_result(1, flp, NULL);
return 0;
}
diff --git a/lib/label/label.h b/lib/label/label.h
index ea11290..984acce 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -62,8 +62,8 @@ struct label_ops {
/*
* Read a label from a volume.
*/
- int (*read) (struct labeller * l, struct device * dev,
- void *buf, struct label ** label);
+ int (*read) (struct labeller *l, struct device *dev, void *buf, struct label **label,
+ lvm_callback_fn_t label_read_callback_fn, void *label_read_callback_context);
/*
* Populate label_type etc.
6 years, 2 months