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