summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMilan Broz <mbroz@redhat.com>2010-05-13 13:04:03 +0000
committerMilan Broz <mbroz@redhat.com>2010-05-13 13:04:03 +0000
commit9ad39e546b144ab4d18699fc9e8b2b5297c79cb9 (patch)
tree8198a48b9e06cc26ce1f58368c758a5d7cdd146e /lib
parent1540955fc6013d5991820f172dc50eb33d9d49b7 (diff)
downloadlvm2-9ad39e546b144ab4d18699fc9e8b2b5297c79cb9.tar.gz
lvm2-9ad39e546b144ab4d18699fc9e8b2b5297c79cb9.tar.xz
lvm2-9ad39e546b144ab4d18699fc9e8b2b5297c79cb9.zip
Currently if clvmd is running and user issues vgscan,
the device cache file is dumped both in vgscan and clvmd process. Unfortunately, clvmd calls lvmcache_label_scan, it properly destroys persistent filter, but during persistent_filter_dump it merges old cache content back! This causes that change in filters is not properly propagated into device cache after vgscan on cluster. (Only new devices are added.) https://bugzilla.redhat.com/show_bug.cgi?id=591861
Diffstat (limited to 'lib')
-rw-r--r--lib/cache/lvmcache.c2
-rw-r--r--lib/commands/toolcontext.c2
-rw-r--r--lib/filters/filter-persistent.c4
-rw-r--r--lib/filters/filter-persistent.h2
4 files changed, 5 insertions, 5 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 0e31a4ee..940c61f3 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -567,7 +567,7 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
* device cache for the benefit of short-lived processes.
*/
if (full_scan == 2 && cmd->is_long_lived && cmd->dump_filter)
- persistent_filter_dump(cmd->filter);
+ persistent_filter_dump(cmd->filter, 0);
r = 1;
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 69c79e7c..c780d267 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -1341,7 +1341,7 @@ int refresh_toolcontext(struct cmd_context *cmd)
void destroy_toolcontext(struct cmd_context *cmd)
{
if (cmd->dump_filter)
- persistent_filter_dump(cmd->filter);
+ persistent_filter_dump(cmd->filter, 1);
archive_exit(cmd);
backup_exit(cmd);
diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c
index 9243a944..4cb0d7db 100644
--- a/lib/filters/filter-persistent.c
+++ b/lib/filters/filter-persistent.c
@@ -168,7 +168,7 @@ static void _write_array(struct pfilter *pf, FILE *fp, const char *path,
fprintf(fp, "\n\t]\n");
}
-int persistent_filter_dump(struct dev_filter *f)
+int persistent_filter_dump(struct dev_filter *f, int merge_existing)
{
struct pfilter *pf;
char *tmp_file;
@@ -220,7 +220,7 @@ int persistent_filter_dump(struct dev_filter *f)
/*
* If file contents changed since we loaded it, merge new contents
*/
- if (info.st_ctime != pf->ctime)
+ if (merge_existing && info.st_ctime != pf->ctime)
/* Keep cft open to avoid losing lock */
persistent_filter_load(f, &cft);
diff --git a/lib/filters/filter-persistent.h b/lib/filters/filter-persistent.h
index 4b0fc555..a7f1245e 100644
--- a/lib/filters/filter-persistent.h
+++ b/lib/filters/filter-persistent.h
@@ -23,6 +23,6 @@ struct dev_filter *persistent_filter_create(struct dev_filter *f,
int persistent_filter_wipe(struct dev_filter *f);
int persistent_filter_load(struct dev_filter *f, struct config_tree **cft_out);
-int persistent_filter_dump(struct dev_filter *f);
+int persistent_filter_dump(struct dev_filter *f, int merge_existing);
#endif