diff options
author | Milan Broz <mbroz@redhat.com> | 2010-05-13 13:04:03 +0000 |
---|---|---|
committer | Milan Broz <mbroz@redhat.com> | 2010-05-13 13:04:03 +0000 |
commit | 9ad39e546b144ab4d18699fc9e8b2b5297c79cb9 (patch) | |
tree | 8198a48b9e06cc26ce1f58368c758a5d7cdd146e /lib | |
parent | 1540955fc6013d5991820f172dc50eb33d9d49b7 (diff) | |
download | lvm2-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.c | 2 | ||||
-rw-r--r-- | lib/commands/toolcontext.c | 2 | ||||
-rw-r--r-- | lib/filters/filter-persistent.c | 4 | ||||
-rw-r--r-- | lib/filters/filter-persistent.h | 2 |
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 |