From faeea370571b6525d9d95d2904aaacbdb9552e00 Mon Sep 17 00:00:00 2001
From: Jonathan Brassow <jbrassow@redhat.com>
Date: Thu, 11 Apr 2013 15:57:14 -0500
Subject: [PATCH] RAID:  Revert previous commit that allowed identical table
 loads.

Revert commit 31c24dd9f2ad7b5f7913a18c9f11a00d7b3474a1.  This commit
was used to force a RAID device-mapper table to be loaded into the
kernel despite the fact that it was identical to the one already
loaded.  The effect allowed a RAID array with a transiently failed
device to refresh and reintegrate the failed device.  This operation
is better done in the kernel on a 'resume'.  Since,
'lvchange --refresh' already performs a suspend/resume cycle, the
above commit is not needed once the kernel change is made.  Reverting
the commit removes an unnecessary (at least for now) change to the
device-mapper interface.
---
 lib/raid/raid.c       | 15 ---------------
 libdm/libdevmapper.h  |  3 +--
 libdm/libdm-deptree.c | 20 +-------------------
 3 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 69b6ee349..1e28c7365 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -161,7 +161,6 @@ static int _raid_add_target_line(struct dev_manager *dm __attribute__((unused)),
 	uint32_t s;
 	uint64_t flags = 0;
 	uint64_t rebuilds = 0;
-	char *raid_health = NULL;
 
 	if (!seg->area_count) {
 		log_error(INTERNAL_ERROR "_raid_add_target_line called "
@@ -191,20 +190,6 @@ static int _raid_add_target_line(struct dev_manager *dm __attribute__((unused)),
 	if (mirror_in_sync())
 		flags = DM_NOSYNC;
 
-	/*
-	 * If the RAID LV is not 'PARTIAL' and the status indicates
-	 * that the array has failed devices, it means that the
-	 * failed devices have returned and can be reintegrated.
-	 *
-	 * We reload the (potentially identical) table to force the
-	 * kernel to re-read the RAID superblocks - possibly restoring
-	 * transiently failed devices.
-	 */
-	if (!(seg->lv->status & PARTIAL_LV) &&
-	    lv_raid_dev_health(seg->lv, &raid_health) &&
-	    strchr(raid_health, 'D'))
-		dm_tree_node_force_identical_table_reload(node);
-
 	if (!dm_tree_node_add_raid_target(node, len, _raid_name(seg),
 					  seg->region_size, seg->stripe_size,
 					  rebuilds, flags))
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 2f2c77d86..172976fd5 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -501,14 +501,13 @@ struct dm_tree_node *dm_tree_next_child(void **handle,
 					uint32_t inverted);
 
 /*
- * Get and set properties of a node.
+ * Get properties of a node.
  */
 const char *dm_tree_node_get_name(const struct dm_tree_node *node);
 const char *dm_tree_node_get_uuid(const struct dm_tree_node *node);
 const struct dm_info *dm_tree_node_get_info(const struct dm_tree_node *node);
 void *dm_tree_node_get_context(const struct dm_tree_node *node);
 int dm_tree_node_size_changed(const struct dm_tree_node *dnode);
-int dm_tree_node_force_identical_table_reload(struct dm_tree_node *dnode);
 
 /*
  * Returns the number of children of the given node (excluding the root node).
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 750f49418..9f82174a8 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -232,16 +232,6 @@ struct load_properties {
 
 	/* Send messages for this node in preload */
 	unsigned send_messages;
-
-	/*
-	 * If a mapping table is replacing an existing identical table,
-	 * the load is suppressed by default - avoiding the construction
-	 * of an unnecessary in-kernel table.  Sometimes we want to avoid
-	 * this optimization and load the identical table anyway.  This
-	 * field is used to indicate that we desire identical tables to be
-	 * loaded and not suppressed.
-	 */
-	unsigned force_identical_table_reload;
 };
 
 /* Two of these used to join two nodes with uses and used_by. */
@@ -597,13 +587,6 @@ int dm_tree_node_size_changed(const struct dm_tree_node *dnode)
 	return dnode->props.size_changed;
 }
 
-int dm_tree_node_force_identical_table_reload(struct dm_tree_node *dnode)
-{
-	dnode->props.force_identical_table_reload = 1;
-	return 1;
-}
-
-
 int dm_tree_node_num_children(const struct dm_tree_node *node, uint32_t inverted)
 {
 	if (inverted) {
@@ -2426,8 +2409,7 @@ static int _load_node(struct dm_tree_node *dnode)
 				   seg, &seg_start))
 			goto_out;
 
-	if (!dnode->props.force_identical_table_reload &&
-	    !dm_task_suppress_identical_reload(dmt))
+	if (!dm_task_suppress_identical_reload(dmt))
 		log_error("Failed to suppress reload of identical tables.");
 
 	if ((r = dm_task_run(dmt))) {