mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
filters: add cmd->full_filter - composite of cmd->filter and cmd->lvmetad_filter
There are actually three filter chains if lvmetad is used: - cmd->lvmetad_filter used when when scanning devices for lvmetad - cmd->filter used when processing lvmetad responses - cmd->full_fiilter (which is just cmd->lvmetad_filter + cmd->filter chained together) used for remaining situations This patch adds the third one - "cmd->full_filter" - currently this is used if device processing does not fall into any of the groups before, for example, devices which does not have the PV label yet and we're just creating a new one or we're processing the devices where the list of the devices (PVs) is not returned by lvmetad initially. Currently, the cmd->full_filter is used exactly in these functions: - lvmcache_label_scan - _pvcreate_check - pvcreate_vol - lvmdiskscan - pvscan - _process_each_label If lvmetad is used, then simply cmd->full_filter == cmd->filter because cmd->lvmetad_filter is NULL in this case.
This commit is contained in:
parent
d3fb69c3f3
commit
5011cac9cf
8
lib/cache/lvmcache.c
vendored
8
lib/cache/lvmcache.c
vendored
@ -693,10 +693,10 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (full_scan == 2 && (cmd->filter && !cmd->filter->use_count) && !refresh_filters(cmd))
|
||||
if (full_scan == 2 && (cmd->full_filter && !cmd->full_filter->use_count) && !refresh_filters(cmd))
|
||||
goto_out;
|
||||
|
||||
if (!cmd->filter || !(iter = dev_iter_create(cmd->filter, (full_scan == 2) ? 1 : 0))) {
|
||||
if (!cmd->full_filter || !(iter = dev_iter_create(cmd->full_filter, (full_scan == 2) ? 1 : 0))) {
|
||||
log_error("dev_iter creation failed");
|
||||
goto out;
|
||||
}
|
||||
@ -719,8 +719,8 @@ 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 && cmd->filter && cmd->filter->dump &&
|
||||
!cmd->filter->dump(cmd->filter, 0))
|
||||
cmd->dump_filter && cmd->full_filter && cmd->full_filter->dump &&
|
||||
!cmd->full_filter->dump(cmd->full_filter, 0))
|
||||
stack;
|
||||
|
||||
r = 1;
|
||||
|
@ -920,22 +920,25 @@ bad:
|
||||
/*
|
||||
* The way the filtering is initialized depends on whether lvmetad is uesd or not.
|
||||
*
|
||||
* If lvmetad is used, there are two filter chains:
|
||||
* If lvmetad is used, there are three filter chains:
|
||||
*
|
||||
* - the lvmetad filter chain used when scanning devs for lvmetad update:
|
||||
* - cmd->lvmetad_filter - the lvmetad filter chain used when scanning devs for lvmetad update:
|
||||
* sysfs filter -> global regex filter -> type filter ->
|
||||
* usable device filter(FILTER_MODE_PRE_LVMETAD) ->
|
||||
* mpath component filter -> partitioned filter ->
|
||||
* md component filter
|
||||
*
|
||||
* - the filter chain used for lvmetad responses:
|
||||
* - cmd->filter - the filter chain used for lvmetad responses:
|
||||
* persistent filter -> usable device filter(FILTER_MODE_POST_LVMETAD) ->
|
||||
* regex filter
|
||||
*
|
||||
* - cmd->full_filter - the filter chain used for all the remaining situations:
|
||||
* lvmetad_filter -> filter
|
||||
*
|
||||
* If lvmetad isnot used, there's just one filter chain:
|
||||
*
|
||||
* - persistent filter -> regex filter -> sysfs filter ->
|
||||
* - cmd->filter == cmd->full_filter:
|
||||
* persistent filter -> regex filter -> sysfs filter ->
|
||||
* global regex filter -> type filter ->
|
||||
* usable device filter(FILTER_MODE_NO_LVMETAD) ->
|
||||
* mpath component filter -> partitioned filter ->
|
||||
@ -998,6 +1001,14 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
|
||||
|
||||
cmd->filter = filter;
|
||||
|
||||
if (lvmetad_used()) {
|
||||
filter_components[0] = cmd->lvmetad_filter;
|
||||
filter_components[1] = cmd->filter;
|
||||
if (!(cmd->full_filter = composite_filter_create(2, filter_components)))
|
||||
goto_bad;
|
||||
} else
|
||||
cmd->full_filter = filter;
|
||||
|
||||
/* Should we ever dump persistent filter state? */
|
||||
if (find_config_tree_bool(cmd, devices_write_cache_state_CFG, NULL))
|
||||
cmd->dump_filter = 1;
|
||||
@ -1653,21 +1664,9 @@ static void _destroy_dev_types(struct cmd_context *cmd)
|
||||
|
||||
static void _destroy_filters(struct cmd_context *cmd)
|
||||
{
|
||||
/*
|
||||
* If lvmetad is used, the cmd->lvmetad_filter is
|
||||
* a separate filter chain than cmd->filter so
|
||||
* we need to destroy it separately.
|
||||
* Otherwise, if lvmetad is not used, cmd->lvmetad_filter
|
||||
* is actually a part of cmd->filter and as such, it
|
||||
* will be destroyed together with cmd->filter.
|
||||
*/
|
||||
if (cmd->lvmetad_filter) {
|
||||
cmd->lvmetad_filter->destroy(cmd->lvmetad_filter);
|
||||
cmd->lvmetad_filter = NULL;
|
||||
}
|
||||
if (cmd->filter) {
|
||||
cmd->filter->destroy(cmd->filter);
|
||||
cmd->filter = NULL;
|
||||
if (cmd->full_filter) {
|
||||
cmd->full_filter->destroy(cmd->full_filter);
|
||||
cmd->lvmetad_filter = cmd->filter = cmd->full_filter = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1819,19 +1818,7 @@ void destroy_toolcontext(struct cmd_context *cmd)
|
||||
label_exit();
|
||||
_destroy_segtypes(&cmd->segtypes);
|
||||
_destroy_formats(cmd, &cmd->formats);
|
||||
|
||||
/*
|
||||
* If lvmetad is used, the cmd->lvmetad_filter is
|
||||
* a separate filter chain than cmd->filter so
|
||||
* we need to destroy it separately.
|
||||
* Otherwise, if lvmetad is not used, cmd->lvmetad_filter
|
||||
* is actually a part of cmd->filter and as such, it
|
||||
* will be destroyed together with cmd->filter.
|
||||
*/
|
||||
if (cmd->lvmetad_filter)
|
||||
cmd->lvmetad_filter->destroy(cmd->lvmetad_filter);
|
||||
if (cmd->filter)
|
||||
cmd->filter->destroy(cmd->filter);
|
||||
_destroy_filters(cmd);
|
||||
if (cmd->mem)
|
||||
dm_pool_destroy(cmd->mem);
|
||||
dev_cache_exit();
|
||||
|
@ -97,8 +97,23 @@ struct cmd_context {
|
||||
unsigned independent_metadata_areas:1; /* Active formats have MDAs outside PVs */
|
||||
|
||||
struct dev_types *dev_types;
|
||||
struct dev_filter *filter;
|
||||
|
||||
/*
|
||||
* Use of filters depends on whether lvmetad is used or not:
|
||||
*
|
||||
* - if lvmetad is used:
|
||||
* - cmd->lvmetad_filter used when scanning devices for lvmetad
|
||||
* - cmd->filter used when processing lvmetad responses
|
||||
* - cmd->full_filter used for remaining situations
|
||||
*
|
||||
* - if lvmetad is not used:
|
||||
* - cmd->lvmetad_filter is NULL
|
||||
* - cmd->filter == cmd->full_filter used for all situations
|
||||
*
|
||||
*/
|
||||
struct dev_filter *lvmetad_filter;
|
||||
struct dev_filter *filter;
|
||||
struct dev_filter *full_filter;
|
||||
int dump_filter; /* Dump filter when exiting? */
|
||||
|
||||
struct dm_list config_files; /* master lvm config + any existing tag configs */
|
||||
|
@ -1405,7 +1405,7 @@ static int _pvcreate_check(struct cmd_context *cmd, const char *name,
|
||||
if (sigint_caught())
|
||||
goto_out;
|
||||
|
||||
dev = dev_cache_get(name, cmd->filter);
|
||||
dev = dev_cache_get(name, cmd->full_filter);
|
||||
|
||||
/* Is there an md superblock here? */
|
||||
if (!dev && md_filtering()) {
|
||||
@ -1413,7 +1413,7 @@ static int _pvcreate_check(struct cmd_context *cmd, const char *name,
|
||||
goto_out;
|
||||
|
||||
init_md_filtering(0);
|
||||
dev = dev_cache_get(name, cmd->filter);
|
||||
dev = dev_cache_get(name, cmd->full_filter);
|
||||
init_md_filtering(1);
|
||||
|
||||
scan_needed = 1;
|
||||
@ -1591,7 +1591,7 @@ struct physical_volume *pvcreate_vol(struct cmd_context *cmd, const char *pv_nam
|
||||
|
||||
if (pp->rp.idp) {
|
||||
if ((dev = lvmcache_device_from_pvid(cmd, pp->rp.idp, NULL, NULL)) &&
|
||||
(dev != dev_cache_get(pv_name, cmd->filter))) {
|
||||
(dev != dev_cache_get(pv_name, cmd->full_filter))) {
|
||||
if (!id_write_format((const struct id*)&pp->rp.idp->uuid,
|
||||
buffer, sizeof(buffer)))
|
||||
goto_bad;
|
||||
@ -1607,7 +1607,7 @@ struct physical_volume *pvcreate_vol(struct cmd_context *cmd, const char *pv_nam
|
||||
if (sigint_caught())
|
||||
goto_bad;
|
||||
|
||||
if (!(dev = dev_cache_get(pv_name, cmd->filter))) {
|
||||
if (!(dev = dev_cache_get(pv_name, cmd->full_filter))) {
|
||||
log_error("%s: Couldn't find device. Check your filters?",
|
||||
pv_name);
|
||||
goto bad;
|
||||
|
@ -111,9 +111,9 @@ int lvmdiskscan(struct cmd_context *cmd, int argc __attribute__((unused)),
|
||||
if (arg_count(cmd, lvmpartition_ARG))
|
||||
log_warn("WARNING: only considering LVM devices");
|
||||
|
||||
max_len = _get_max_dev_name_len(cmd->filter);
|
||||
max_len = _get_max_dev_name_len(cmd->full_filter);
|
||||
|
||||
if (!(iter = dev_iter_create(cmd->filter, 0))) {
|
||||
if (!(iter = dev_iter_create(cmd->full_filter, 0))) {
|
||||
log_error("dev_iter_create failed");
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
@ -360,8 +360,8 @@ int pvscan(struct cmd_context *cmd, int argc, char **argv)
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
if (cmd->filter->wipe)
|
||||
cmd->filter->wipe(cmd->filter);
|
||||
if (cmd->full_filter->wipe)
|
||||
cmd->full_filter->wipe(cmd->full_filter);
|
||||
lvmcache_destroy(cmd, 1, 0);
|
||||
|
||||
/* populate lvmcache */
|
||||
|
@ -1846,7 +1846,7 @@ int process_each_label(struct cmd_context *cmd, int argc, char **argv, void *han
|
||||
|
||||
if (argc) {
|
||||
for (; opt < argc; opt++) {
|
||||
if (!(dev = dev_cache_get(argv[opt], cmd->filter))) {
|
||||
if (!(dev = dev_cache_get(argv[opt], cmd->full_filter))) {
|
||||
log_error("Failed to find device "
|
||||
"\"%s\"", argv[opt]);
|
||||
ret_max = ECMD_FAILED;
|
||||
@ -1872,7 +1872,7 @@ int process_each_label(struct cmd_context *cmd, int argc, char **argv, void *han
|
||||
return ret_max;
|
||||
}
|
||||
|
||||
if (!(iter = dev_iter_create(cmd->filter, 1))) {
|
||||
if (!(iter = dev_iter_create(cmd->full_filter, 1))) {
|
||||
log_error("dev_iter creation failed");
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user