diff options
author | Petr Rockai <prockai@redhat.com> | 2013-05-27 00:49:40 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2013-06-02 00:48:58 +0200 |
commit | e7878da9216945c3209a430d8b01038312d911bd (patch) | |
tree | 200ca89f69bdb581d2a1a391d21f4beb4431743e | |
parent | 05bf4b8cc3e3d15e79c9964e496dbe396beacb3c (diff) | |
download | lvm2-e7878da9216945c3209a430d8b01038312d911bd.tar.gz |
filters: toplevel filter not persistent
Add a generic dump operation to filters and make the composite filter call
through to its components. Previously, when global filter was set, the code
would treat the toplevel composite filter's private area as if it belonged a
persistent filter, trying to write nonsense into a non-sensical file.
Also deal with NULL cmd->filter gracefully.
-rw-r--r-- | WHATS_NEW | 1 | ||||
-rw-r--r-- | lib/commands/toolcontext.c | 4 | ||||
-rw-r--r-- | lib/device/dev-cache.h | 1 | ||||
-rw-r--r-- | lib/filters/filter-composite.c | 12 | ||||
-rw-r--r-- | lib/filters/filter-persistent.c | 6 |
5 files changed, 22 insertions, 2 deletions
@@ -1,5 +1,6 @@ Version 2.02.99 - =================================== + Update persistent filter functinality for global filter. Override system's global_filter settings for vgimportclone. Detect maximum usable size for snapshot for lvresize. Creation of snapshot takes at most 100% origin coverage. diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index 5c1719b5d..965ba4a8c 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -1650,8 +1650,8 @@ void destroy_toolcontext(struct cmd_context *cmd) struct dm_config_tree *cft_cmdline; FILE *new_stream; - if (cmd->dump_filter) - persistent_filter_dump(cmd->filter, 1); + if (cmd->dump_filter && cmd->filter && cmd->filter->dump) + cmd->filter->dump(cmd->filter); archive_exit(cmd); backup_exit(cmd); diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h index 3267c9d32..4119d9005 100644 --- a/lib/device/dev-cache.h +++ b/lib/device/dev-cache.h @@ -26,6 +26,7 @@ struct dev_filter { int (*passes_filter) (struct dev_filter * f, struct device * dev); void (*destroy) (struct dev_filter * f); void (*wipe) (struct dev_filter * f); + void (*dump) (struct dev_filter * f); void *private; unsigned use_count; }; diff --git a/lib/filters/filter-composite.c b/lib/filters/filter-composite.c index 229800090..0d09c0477 100644 --- a/lib/filters/filter-composite.c +++ b/lib/filters/filter-composite.c @@ -49,6 +49,17 @@ static void _composite_destroy(struct dev_filter *f) dm_free(f); } +static void _dump(struct dev_filter *f) +{ + struct dev_filter **filters = (struct dev_filter **) f->private; + + while (*filters) { + if ((*filters)->dump) + (*filters)->dump(*filters); + filters++; + } +} + struct dev_filter *composite_filter_create(int n, struct dev_filter **filters) { struct dev_filter **filters_copy, *cft; @@ -72,6 +83,7 @@ struct dev_filter *composite_filter_create(int n, struct dev_filter **filters) cft->passes_filter = _and_p; cft->destroy = _composite_destroy; + cft->dump = _dump; cft->use_count = 0; cft->private = filters_copy; diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c index 0d53fce42..7288d9dfa 100644 --- a/lib/filters/filter-persistent.c +++ b/lib/filters/filter-persistent.c @@ -274,6 +274,11 @@ out: return r; } +static void _dump(struct dev_filter *f) +{ + persistent_filter_dump(f, 1); +} + static int _lookup_p(struct dev_filter *f, struct device *dev) { struct pfilter *pf = (struct pfilter *) f->private; @@ -367,6 +372,7 @@ struct dev_filter *persistent_filter_create(struct dev_filter *real, f->use_count = 0; f->private = pf; f->wipe = _persistent_filter_wipe; + f->dump = _dump; return f; |