|
|
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) {
|