Blame SOURCES/bz635995-data_corruption_during_activation_volume_marked_for_rebuild.patch

41b6f0
--- a/lib/activate/activate.c	
41b6f0
+++ a/lib/activate/activate.c	
41b6f0
@@ -370,7 +370,10 @@ get_dm_devs(struct raid_set *rs, int valid)
41b6f0
 	return ret + get_rds(rs, valid);
41b6f0
 }
41b6f0
 
41b6f0
-/* Retrieve number of drive to rebuild from metadata format handler. */
41b6f0
+/* Retrieve number of drive to rebuild from metadata format handler.
41b6f0
+ *
41b6f0
+ * Returns number of drive to rebuild or -1 if there is no drive to rebuild
41b6f0
+ */
41b6f0
 static int
41b6f0
 get_rebuild_drive(struct lib_context *lc, struct raid_set *rs,
41b6f0
 		  struct handler_info *info)
41b6f0
@@ -378,25 +381,23 @@ get_rebuild_drive(struct lib_context *lc, struct raid_set *rs,
41b6f0
 	/* Initialize drive to rebuild invalid. */
41b6f0
 	info->data.i32 = -1;
41b6f0
 
41b6f0
-	if (lc->options[LC_REBUILD_SET].opt) {
41b6f0
-		struct raid_dev *rd;
41b6f0
+	struct raid_dev *rd;
41b6f0
 
41b6f0
-		if (list_empty(&rs->devs))
41b6f0
-			LOG_ERR(lc, 0, "RAID set has no devices!");
41b6f0
+	if (list_empty(&rs->devs))
41b6f0
+		LOG_ERR(lc, 0, "RAID set has no devices!");
41b6f0
 
41b6f0
-		rd = list_entry(rs->devs.next, typeof(*rd), devs);
41b6f0
-		if (rd->fmt->metadata_handler) {
41b6f0
-			if (!rd->
41b6f0
-			    fmt->metadata_handler(lc, GET_REBUILD_DRIVE_NO,
41b6f0
-						  info, rs))
41b6f0
-				LOG_ERR(lc, 0, "Can't get rebuild drive #!");
41b6f0
-		} else
41b6f0
-			LOG_ERR(lc, 0,
41b6f0
-				"Can't rebuild w/o metadata_handler for %s",
41b6f0
-				rd->fmt->name);
41b6f0
-	}
41b6f0
+	rd = list_entry(rs->devs.next, typeof(*rd), devs);
41b6f0
+	if (rd->fmt->metadata_handler) {
41b6f0
+		if (!rd->
41b6f0
+		    fmt->metadata_handler(lc, GET_REBUILD_DRIVE_NO,
41b6f0
+					  info, rs))
41b6f0
+			LOG_ERR(lc, 0, "Can't get rebuild drive #!");
41b6f0
+	} else
41b6f0
+		LOG_ERR(lc, 0,
41b6f0
+			"Can't rebuild w/o metadata_handler for %s",
41b6f0
+			rd->fmt->name);
41b6f0
 
41b6f0
-	return 1;
41b6f0
+	return info->data.i32;
41b6f0
 }
41b6f0
 
41b6f0
 /* Return true if RAID set needs rebuilding. */
41b6f0
@@ -458,7 +459,7 @@ dm_raid1(struct lib_context *lc, char **table, struct raid_set *rs)
41b6f0
 	 */
41b6f0
 	need_sync = rs_need_sync(rs);
41b6f0
 	rebuild_drive.data.i32 = -1;
41b6f0
-	if (need_sync && !get_rebuild_drive(lc, rs, &rebuild_drive))
41b6f0
+	if (need_sync && get_rebuild_drive(lc, rs, &rebuild_drive) < 0)
41b6f0
 		return 0;
41b6f0
 
41b6f0
 	if (!_dm_raid1_bol(lc, table, rs, sectors, mirrors, need_sync))
41b6f0
@@ -540,7 +541,7 @@ _dm_raid45_bol(struct lib_context *lc, char **table, struct raid_set *rs,
41b6f0
 
41b6f0
 	/* Get drive as rebuild target. */
41b6f0
 	rebuild_drive.data.i32 = -1;
41b6f0
-	if (need_sync && !get_rebuild_drive(lc, rs, &rebuild_drive))
41b6f0
+	if (need_sync && get_rebuild_drive(lc, rs, &rebuild_drive) < 0)
41b6f0
 		return 0;
41b6f0
 
41b6f0
 	return p_fmt(lc, table, "0 %U %s core 2 %u %s %s 1 %u %u %d",
41b6f0
--- a/lib/format/ataraid/isw.c	
41b6f0
+++ a/lib/format/ataraid/isw.c	
41b6f0
@@ -1302,11 +1302,9 @@ isw_metadata_handler(struct lib_context *lc, enum handler_commands command,
41b6f0
 	case GET_REBUILD_DRIVE_NO:
41b6f0
 		rd = list_entry(rs->devs.next, typeof(*rd), devs);
41b6f0
 		isw = META(rd, isw);
41b6f0
-		idx = rd_idx_by_name(isw, lc->options[LC_REBUILD_SET].arg.str);
41b6f0
-		if (idx < 0)
41b6f0
-			return 0;
41b6f0
 
41b6f0
-		dev = raiddev(isw, idx);
41b6f0
+		/* Get disk to rebuild index form metadata stored on first disk */
41b6f0
+		dev = raiddev(isw, 0);
41b6f0
 		disk = isw->disk;
41b6f0
 
41b6f0
 		if (info) {