From 851a2bf855b4fc118bd145a21aa6f5fb6e74dfb8 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 8 Mar 2005 13:46:17 +0000 Subject: [PATCH] Cope with new devices appearing by rescanning /dev if a uuid can't be found. --- VERSION | 2 +- WHATS_NEW | 3 ++- lib/cache/lvmcache.c | 4 ++-- lib/cache/lvmcache.h | 3 ++- lib/device/dev-cache.c | 10 +++++----- lib/device/dev-cache.h | 2 +- lib/format1/disk-rep.c | 2 +- lib/format_text/format-text.c | 2 +- lib/metadata/metadata.c | 4 ++-- tools/lvmdiskscan.c | 4 ++-- tools/toollib.c | 2 +- 11 files changed, 20 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index 5650a1468..6e79a4caa 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.01.07-cvs (2005-03-01) +2.01.07-cvs (2005-03-08) diff --git a/WHATS_NEW b/WHATS_NEW index e15b5926d..a85d31d65 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ -Version 2.01.07 - +Version 2.01.07 - 8th March 2005 ================================ + Cope with new devices appearing by rescanning /dev if a uuid can't be found. Remove DESTDIR from LVM_SHARED_PATH. clvmd fixes: make FDs close-on-exec gulm unlocks VG & orphan locks at startup in case they are stale diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index c617ac7fe..43ccf4e88 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -188,7 +188,7 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan) goto out; } - if (!(iter = dev_iter_create(cmd->filter))) { + if (!(iter = dev_iter_create(cmd->filter, (full_scan == 2) ? 1: 0))) { log_error("dev_iter creation failed"); goto out; } @@ -266,7 +266,7 @@ struct device *device_from_pvid(struct cmd_context *cmd, struct id *pvid) if (memlock()) return NULL; - lvmcache_label_scan(cmd, 1); + lvmcache_label_scan(cmd, 2); /* Try again */ if ((info = info_from_pvid((char *) pvid))) { diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h index a461cd321..d139bbd79 100644 --- a/lib/cache/lvmcache.h +++ b/lib/cache/lvmcache.h @@ -56,7 +56,8 @@ struct lvmcache_info { int lvmcache_init(void); void lvmcache_destroy(void); -/* Set full_scan to 1 to reread every filtered device label */ +/* Set full_scan to 1 to reread every filtered device label or + * 2 to rescan /dev for new devices */ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan); /* Add/delete a device */ diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c index f465fdaf7..246fc310c 100644 --- a/lib/device/dev-cache.c +++ b/lib/device/dev-cache.c @@ -355,11 +355,11 @@ static int _insert(const char *path, int rec) return r; } -static void _full_scan(void) +static void _full_scan(int dev_scan) { struct list *dh; - if (_cache.has_scanned) + if (_cache.has_scanned && !dev_scan) return; list_iterate(dh, &_cache.dirs) { @@ -381,7 +381,7 @@ void dev_cache_scan(int do_scan) _cache.has_scanned = 1; else { _cache.has_scanned = 0; - _full_scan(); + _full_scan(1); } } @@ -540,7 +540,7 @@ struct device *dev_cache_get(const char *name, struct dev_filter *f) return (d && (!f || f->passes_filter(f, d))) ? d : NULL; } -struct dev_iter *dev_iter_create(struct dev_filter *f) +struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan) { struct dev_iter *di = dbg_malloc(sizeof(*di)); @@ -549,7 +549,7 @@ struct dev_iter *dev_iter_create(struct dev_filter *f) return NULL; } - _full_scan(); + _full_scan(dev_scan); di->current = btree_first(_cache.devices); di->filter = f; diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h index af2756ccd..5ddd055d7 100644 --- a/lib/device/dev-cache.h +++ b/lib/device/dev-cache.h @@ -45,7 +45,7 @@ struct device *dev_cache_get(const char *name, struct dev_filter *f); * Object for iterating through the cache. */ struct dev_iter; -struct dev_iter *dev_iter_create(struct dev_filter *f); +struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan); void dev_iter_destroy(struct dev_iter *iter); struct device *dev_iter_get(struct dev_iter *iter); diff --git a/lib/format1/disk-rep.c b/lib/format1/disk-rep.c index 631a7c075..834e5c86b 100644 --- a/lib/format1/disk-rep.c +++ b/lib/format1/disk-rep.c @@ -482,7 +482,7 @@ int read_pvs_in_vg(const struct format_type *fmt, const char *vg_name, /* vgcache_del(vg_name); */ } - if (!(iter = dev_iter_create(filter))) { + if (!(iter = dev_iter_create(filter, 1))) { log_error("read_pvs_in_vg: dev_iter_create failed"); return 0; } diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 520ac53f9..1f9006029 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1185,7 +1185,7 @@ static int _pv_read(const struct format_type *fmt, const char *pv_name, /* Perform full scan and try again */ if (!memlock()) { - lvmcache_label_scan(fmt->cmd, 1); + lvmcache_label_scan(fmt->cmd, 2); if (info->vginfo && info->vginfo->vgname && *info->vginfo->vgname && diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 213628d5d..9a6351be2 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -654,7 +654,7 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vgname, stack; return NULL; } - lvmcache_label_scan(cmd, 1); + lvmcache_label_scan(cmd, 2); if (!(fmt = fmt_from_vgname(vgname))) { stack; return NULL; @@ -768,7 +768,7 @@ struct volume_group *vg_read_by_vgid(struct cmd_context *cmd, const char *vgid) * allowed to do a full scan here any more. */ // The slow way - full scan required to cope with vgrename - if (!(vgnames = get_vgs(cmd, 1))) { + if (!(vgnames = get_vgs(cmd, 2))) { log_error("vg_read_by_vgid: get_vgs failed"); return NULL; } diff --git a/tools/lvmdiskscan.c b/tools/lvmdiskscan.c index 488e44104..1d11efa77 100644 --- a/tools/lvmdiskscan.c +++ b/tools/lvmdiskscan.c @@ -34,7 +34,7 @@ static int _get_max_dev_name_len(struct dev_filter *filter) struct dev_iter *iter; struct device *dev; - if (!(iter = dev_iter_create(filter))) { + if (!(iter = dev_iter_create(filter, 1))) { log_error("dev_iter_create failed"); return 0; } @@ -103,7 +103,7 @@ int lvmdiskscan(struct cmd_context *cmd, int argc, char **argv) max_len = _get_max_dev_name_len(cmd->filter); - if (!(iter = dev_iter_create(cmd->filter))) { + if (!(iter = dev_iter_create(cmd->filter, 0))) { log_error("dev_iter_create failed"); return ECMD_FAILED; } diff --git a/tools/toollib.c b/tools/toollib.c index b04ef87e4..d2d174745 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -463,7 +463,7 @@ static int _process_all_devs(struct cmd_context *cmd, void *handle, int ret_max = 0; int ret = 0; - if (!(iter = dev_iter_create(cmd->filter))) { + if (!(iter = dev_iter_create(cmd->filter, 1))) { log_error("dev_iter creation failed"); return ECMD_FAILED; }