summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2015-12-11 14:02:36 -0600
committerDavid Teigland <teigland@redhat.com>2015-12-11 14:20:00 -0600
commit90cf5acff15a26d87d4cabf6601e82846d608a69 (patch)
tree43116806c72f680d73484de614de1265ace5c71d
parent3e48354f2d458e80cab4c096b2869bdc1ad463c3 (diff)
downloadlvm2-dev-dct-dev-cache-full-scan.tar.gz
process_each_pv: do full scan earlier to find new devicesdev-dct-dev-cache-full-scan
Before commit c1f246fedfc349c25749da501e68a7f70bd122b0, _get_all_devices() did a full device scan before get_vgnameids() was called. New devices would be added to the dev-cache before label scanning done by get_vgnameids. So, labels would be read from new devices by the first 'pvs' command. After that commit, _get_all_devices() was called after get_vgnameids() was finished with label scanning. So, new devices would be missed by the label scanning, and would not appear to be lvm devices to the first 'pvs' command. A new device would be added to .cache by the first command, so the second 'pvs' command would scan labels from it in get_vgnameids(). Now, the full device scan is factored out of get_all_devices() and called by itself at the start of the command so that new devices will be known before get_vgnameids() scans labels.
-rw-r--r--lib/cache/lvmcache.c9
-rw-r--r--lib/device/dev-cache.c20
-rw-r--r--lib/device/dev-cache.h1
-rw-r--r--tools/toollib.c7
4 files changed, 28 insertions, 9 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 799de6f6e..2a01ec2cb 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -749,6 +749,7 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
struct dev_iter *iter;
struct device *dev;
struct format_type *fmt;
+ int dev_count = 0;
int r = 0;
@@ -779,11 +780,17 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
goto out;
}
- while ((dev = dev_iter_get(iter)))
+ log_very_verbose("Scanning device labels");
+
+ while ((dev = dev_iter_get(iter))) {
(void) label_read(dev, &label, UINT64_C(0));
+ dev_count++;
+ }
dev_iter_destroy(iter);
+ log_very_verbose("Scanned %d device labels", dev_count);
+
_has_scanned = 1;
/* Perform any format-specific scanning e.g. text files */
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index 7626cebbd..97165dbf8 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -1026,6 +1026,16 @@ struct device *dev_cache_get_by_devt(dev_t dev, struct dev_filter *f)
f->passes_filter(f, d))) ? d : NULL;
}
+void dev_cache_full_scan(struct dev_filter *f)
+{
+ if (f && f->wipe) {
+ f->wipe(f); /* might call _full_scan(1) */
+ if (!full_scan_done())
+ _full_scan(1);
+ } else
+ _full_scan(1);
+}
+
struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan)
{
struct dev_iter *di = dm_malloc(sizeof(*di));
@@ -1037,14 +1047,8 @@ struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan)
if (dev_scan && !trust_cache()) {
/* Flag gets reset between each command */
- if (!full_scan_done()) {
- if (f && f->wipe) {
- f->wipe(f); /* might call _full_scan(1) */
- if (!full_scan_done())
- _full_scan(1);
- } else
- _full_scan(1);
- }
+ if (!full_scan_done())
+ dev_cache_full_scan(f);
} else
_full_scan(0);
diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h
index 4fca35885..4efe41fe5 100644
--- a/lib/device/dev-cache.h
+++ b/lib/device/dev-cache.h
@@ -45,6 +45,7 @@ int dev_cache_check_for_open_devices(void);
/* Trigger(1) or avoid(0) a scan */
void dev_cache_scan(int do_scan);
int dev_cache_has_scanned(void);
+void dev_cache_full_scan(struct dev_filter *f);
int dev_cache_add_dir(const char *path);
int dev_cache_add_loopfile(const char *path);
diff --git a/tools/toollib.c b/tools/toollib.c
index e03aaf77f..fb6edadde 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -3340,6 +3340,13 @@ int process_each_pv(struct cmd_context *cmd,
return_ECMD_FAILED;
/*
+ * This full scan would be done by _get_all_devices() if
+ * it were not done here first. It's called here first
+ * so that get_vgnameids() will look at any new devices.
+ */
+ dev_cache_full_scan(cmd->full_filter);
+
+ /*
* Need pvid's set on all PVs before processing so that pvid's
* can be compared to find duplicates while processing.
*/