mrc0mmand / rpms / lvm2

Forked from rpms/lvm2 2 years ago
Clone

Blame SOURCES/lvm2-2_02_131-fix-devices-filter-to-be-applied-before-disk-accessing-filters.patch

a9ef5a
 WHATS_NEW                  |  1 +
a9ef5a
 lib/commands/toolcontext.c | 64 +++++++++++++++++++++++++++-------------------
a9ef5a
 2 files changed, 39 insertions(+), 26 deletions(-)
a9ef5a
a9ef5a
diff --git a/WHATS_NEW b/WHATS_NEW
a9ef5a
index 6441cc1..0e77789 100644
a9ef5a
--- a/WHATS_NEW
a9ef5a
+++ b/WHATS_NEW
a9ef5a
@@ -16,6 +16,7 @@ Version 2.02.133 -
a9ef5a
 
a9ef5a
 Version 2.02.131 - 
a9ef5a
 =====================================
a9ef5a
+  Fix devices/filter to be applied before disk-accessing filters. (2.02.112)
a9ef5a
   Fix vgimportclone cache_dir path name (2.02.115).
a9ef5a
   Disallow usage of --stripe and --stripesize when creating cache pool.
a9ef5a
   Swapping of LV identifiers handles more complex LVs.
a9ef5a
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
a9ef5a
index 11affee..c8d96ca 100644
a9ef5a
--- a/lib/commands/toolcontext.c
a9ef5a
+++ b/lib/commands/toolcontext.c
a9ef5a
@@ -1069,7 +1069,7 @@ static struct dev_filter *_init_lvmetad_filter_chain(struct cmd_context *cmd)
a9ef5a
 			nr_filt++;
a9ef5a
 	}
a9ef5a
 
a9ef5a
-	/* regex filter. Optional. */
a9ef5a
+	/* global regex filter. Optional. */
a9ef5a
 	if ((cn = find_config_tree_node(cmd, devices_global_filter_CFG, NULL))) {
a9ef5a
 		if (!(filters[nr_filt] = regex_filter_create(cn->v))) {
a9ef5a
 			log_error("Failed to create global regex device filter");
a9ef5a
@@ -1078,6 +1078,17 @@ static struct dev_filter *_init_lvmetad_filter_chain(struct cmd_context *cmd)
a9ef5a
 		nr_filt++;
a9ef5a
 	}
a9ef5a
 
a9ef5a
+	/* regex filter. Optional. */
a9ef5a
+	if (!lvmetad_used()) {
a9ef5a
+		if ((cn = find_config_tree_node(cmd, devices_filter_CFG, NULL))) {
a9ef5a
+			if (!(filters[nr_filt] = regex_filter_create(cn->v))) {
a9ef5a
+				log_error("Failed to create regex device filter");
a9ef5a
+				goto bad;
a9ef5a
+			}
a9ef5a
+			nr_filt++;
a9ef5a
+		}
a9ef5a
+	}
a9ef5a
+
a9ef5a
 	/* device type filter. Required. */
a9ef5a
 	if (!(filters[nr_filt] = lvm_type_filter_create(cmd->dev_types))) {
a9ef5a
 		log_error("Failed to create lvm type filter");
a9ef5a
@@ -1145,26 +1156,24 @@ bad:
a9ef5a
  *     md component filter -> fw raid filter
a9ef5a
  *
a9ef5a
  *   - cmd->filter - the filter chain used for lvmetad responses:
a9ef5a
- *     persistent filter -> usable device filter(FILTER_MODE_POST_LVMETAD) ->
a9ef5a
- *     regex filter
a9ef5a
+ *     persistent filter -> regex_filter -> usable device filter(FILTER_MODE_POST_LVMETAD)
a9ef5a
  *
a9ef5a
  *   - cmd->full_filter - the filter chain used for all the remaining situations:
a9ef5a
- *     lvmetad_filter -> filter
a9ef5a
+ *     cmd->lvmetad_filter -> cmd->filter
a9ef5a
  *
a9ef5a
- * If lvmetad isnot used, there's just one filter chain:
a9ef5a
+ * If lvmetad is not used, there's just one filter chain:
a9ef5a
  *
a9ef5a
  *   - cmd->filter == cmd->full_filter:
a9ef5a
- *     persistent filter -> regex filter -> sysfs filter ->
a9ef5a
- *     global regex filter -> type filter ->
a9ef5a
- *     usable device filter(FILTER_MODE_NO_LVMETAD) ->
a9ef5a
- *     mpath component filter -> partitioned filter ->
a9ef5a
- *     md component filter -> fw raid filter
a9ef5a
+ *     persistent filter -> sysfs filter -> global regex filter ->
a9ef5a
+ *     regex_filter -> type filter -> usable device filter(FILTER_MODE_NO_LVMETAD) ->
a9ef5a
+ *     mpath component filter -> partitioned filter -> md component filter -> fw raid filter
a9ef5a
  *
a9ef5a
  */
a9ef5a
 int init_filters(struct cmd_context *cmd, unsigned load_persistent_cache)
a9ef5a
 {
a9ef5a
 	const char *dev_cache;
a9ef5a
 	struct dev_filter *filter = NULL, *filter_components[2] = {0};
a9ef5a
+	int nr_filt;
a9ef5a
 	struct stat st;
a9ef5a
 	const struct dm_config_node *cn;
a9ef5a
 	struct timespec ts, cts;
a9ef5a
@@ -1193,26 +1202,26 @@ int init_filters(struct cmd_context *cmd, unsigned load_persistent_cache)
a9ef5a
 	 */
a9ef5a
 	/* filter component 0 */
a9ef5a
 	if (lvmetad_used()) {
a9ef5a
-		if (!(filter_components[0] = usable_filter_create(cmd->dev_types, FILTER_MODE_POST_LVMETAD))) {
a9ef5a
+		nr_filt = 0;
a9ef5a
+		if ((cn = find_config_tree_array(cmd, devices_filter_CFG, NULL))) {
a9ef5a
+			if (!(filter_components[nr_filt] = regex_filter_create(cn->v))) {
a9ef5a
+				log_verbose("Failed to create regex device filter.");
a9ef5a
+				goto bad;
a9ef5a
+			}
a9ef5a
+			nr_filt++;
a9ef5a
+		}
a9ef5a
+		if (!(filter_components[nr_filt] = usable_filter_create(cmd->dev_types, FILTER_MODE_POST_LVMETAD))) {
a9ef5a
 			log_verbose("Failed to create usable device filter.");
a9ef5a
 			goto bad;
a9ef5a
 		}
a9ef5a
+		nr_filt++;
a9ef5a
+		if (!(filter = composite_filter_create(nr_filt, 0, filter_components)))
a9ef5a
+			goto_bad;
a9ef5a
 	} else {
a9ef5a
-		filter_components[0] = cmd->lvmetad_filter;
a9ef5a
+		filter = cmd->lvmetad_filter;
a9ef5a
 		cmd->lvmetad_filter = NULL;
a9ef5a
 	}
a9ef5a
 
a9ef5a
-	/* filter component 1 */
a9ef5a
-	if ((cn = find_config_tree_array(cmd, devices_filter_CFG, NULL))) {
a9ef5a
-		if (!(filter_components[1] = regex_filter_create(cn->v)))
a9ef5a
-			goto_bad;
a9ef5a
-		/* we have two filter components - create composite filter */
a9ef5a
-		if (!(filter = composite_filter_create(2, 0, filter_components)))
a9ef5a
-			goto_bad;
a9ef5a
-	} else
a9ef5a
-		/* we have only one filter component - no need to create composite filter */
a9ef5a
-		filter = filter_components[0];
a9ef5a
-
a9ef5a
 	if (!(dev_cache = find_config_tree_str(cmd, devices_cache_CFG, NULL)))
a9ef5a
 		goto_bad;
a9ef5a
 
a9ef5a
@@ -1224,9 +1233,12 @@ int init_filters(struct cmd_context *cmd, unsigned load_persistent_cache)
a9ef5a
 	cmd->filter = filter;
a9ef5a
 
a9ef5a
 	if (lvmetad_used()) {
a9ef5a
-		filter_components[0] = cmd->lvmetad_filter;
a9ef5a
-		filter_components[1] = cmd->filter;
a9ef5a
-		if (!(cmd->full_filter = composite_filter_create(2, 0, filter_components)))
a9ef5a
+		nr_filt = 0;
a9ef5a
+		filter_components[nr_filt] = cmd->lvmetad_filter;
a9ef5a
+		nr_filt++;
a9ef5a
+		filter_components[nr_filt] = cmd->filter;
a9ef5a
+		nr_filt++;
a9ef5a
+		if (!(cmd->full_filter = composite_filter_create(nr_filt, 0, filter_components)))
a9ef5a
 			goto_bad;
a9ef5a
 	} else
a9ef5a
 		cmd->full_filter = filter;