1. If array not changed we should still report any degraded
- another array may have a new spare that we can move.
2. Array with err=1 can't give a spare.
3. We look for spares in "from" not "st" which is supertype
and has devname=NULL.
Signed-off-by: Anna Czarnowska <anna.czarnowska@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
int test, struct alert_info *ainfo,
int increments)
{
int test, struct alert_info *ainfo,
int increments)
{
+ /* Update the state 'st' to reflect any changes shown in mdstat,
+ * or found by directly examining the array, and return
+ * '1' if the array is degraded, or '0' if it is optimal (or dead).
+ */
struct { int state, major, minor; } info[MaxDisks];
mdu_array_info_t array;
struct mdstat_ent *mse = NULL, *mse2;
struct { int state, major, minor; } info[MaxDisks];
mdu_array_info_t array;
struct mdstat_ent *mse = NULL, *mse2;
))) {
close(fd);
st->err = 0;
))) {
close(fd);
st->err = 0;
+ if ((st->active < st->raid) && st->spare == 0)
+ return 1;
+ else
+ return 0;
}
if (st->utime == 0 && /* new array */
mse->pattern && strchr(mse->pattern, '_') /* degraded */
}
if (st->utime == 0 && /* new array */
mse->pattern && strchr(mse->pattern, '_') /* degraded */
if (from->parent)
/* Cannot move from a member */
return 0;
if (from->parent)
/* Cannot move from a member */
return 0;
+ if (from->err)
+ return 0;
for (sub = from->subarray; sub; sub = sub->subarray)
/* If source array has degraded subarrays, don't
* remove anything
for (sub = from->subarray; sub; sub = sub->subarray)
/* If source array has degraded subarrays, don't
* remove anything
*/
struct supertype *st = from->metadata;
*/
struct supertype *st = from->metadata;
- int fd = open(st->devname, O_RDONLY);
+ int fd = open(from->devname, O_RDONLY);
int err;
struct mdinfo *disks, *d;
unsigned long long min_size
int err;
struct mdinfo *disks, *d;
unsigned long long min_size