Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
List overview
Download
lvm2-commits
January 2018
----- 2025 -----
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
lvm2-commits@lists.fedorahosted.org
5 participants
66 discussions
Start a n
N
ew thread
master - format_text: Use malloc aligned for export buffer
by Alasdair Kergon
10 Jan '18
10 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=e2438b5b9ff526cae8fa2…
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; }
1
0
0
0
master - label: Rename a variable
by Alasdair Kergon
10 Jan '18
10 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=b65246499bb126097ca8a…
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; }
1
0
0
0
master - libdm: Introduce dm_malloc_aligned
by Alasdair Kergon
10 Jan '18
10 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ea96381534360d6a893f0…
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);
1
0
0
0
master - man lvmlockd: remove lv resizing comment
by David Teigland
10 Jan '18
10 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=943b21779770f1cd93e73…
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
1
0
0
0
master - lvmlockd: print warning when skipping locking
by David Teigland
09 Jan '18
09 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=51340888aab5e1b8630c7…
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()) {
1
0
0
0
master - lvmlockd: add lockopt values for skipping selected locks
by David Teigland
09 Jan '18
09 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=46cedb105bb7fdba01077…
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;
1
0
0
0
master - format_text: Use vgsummary callbacks
by Alasdair Kergon
09 Jan '18
09 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f4675af4cfbc0139ba94e…
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; }
1
0
0
0
master - label: Add label_read callback.
by Alasdair Kergon
08 Jan '18
08 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4b02d4e22eeb0dbf61e2c…
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);
1
0
0
0
master - label: Add callback fns (partially)
by Alasdair Kergon
08 Jan '18
08 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=6d322e68f302e5406e93e…
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.
1
0
0
0
master - label: Add callback fns (partially)
by Alasdair Kergon
06 Jan '18
06 Jan '18
Gitweb:
https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=a9fe4886ba08771b3bc01…
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.
1
0
0
0
← Newer
1
2
3
4
5
6
7
Older →
Jump to page:
1
2
3
4
5
6
7
Results per page:
10
25
50
100
200