int deactivate = 0;
struct mdinfo *mdi;
int dirty = 0;
+ int count = 0;
a->next_state = bad_word;
a->next_action = bad_action;
mdi->curr_state);
if (! (mdi->curr_state & DS_INSYNC))
check_degraded = 1;
+ count++;
}
+ if (count != a->info.array.raid_disks)
+ check_degraded = 1;
}
if (!deactivate &&
if (remove_result > 0) {
dprintf(" %d:removed", mdi->disk.raid_disk);
close(mdi->state_fd);
+ close(mdi->recovery_fd);
mdi->state_fd = -1;
}
}
struct mdinfo *victim;
for (a = aa; a; a = a->next) {
- if (!a->container)
+ if (!a->container || a->to_remove)
continue;
victim = find_device(a, failed->disk.major, failed->disk.minor);
if (!victim)
/* once an array has been deactivated we want to
* ask the manager to discard it.
*/
- if (!a->container || (a->info.array.level == 0)) {
+ if (!a->container || a->to_remove) {
if (discard_this) {
ap = &(*ap)->next;
continue;
* problem as there are no active arrays, there is
* nothing that we need to be ready to do.
*/
- int fd = open_dev_excl(container->devnum);
+ int fd;
+ if (sigterm)
+ fd = open_dev_excl(container->devnum);
+ else
+ fd = open_dev_flags(container->devnum, O_RDONLY|O_EXCL);
if (fd >= 0 || errno != EBUSY) {
/* OK, we are safe to leave */
if (sigterm && !dirty_arrays)
if (!nowait) {
sigset_t set;
+ struct timespec ts;
+ ts.tv_sec = 24*3600;
+ ts.tv_nsec = 0;
+ if (*aap == NULL) {
+ /* just waiting to get O_EXCL access */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 20000000ULL;
+ }
sigprocmask(SIG_UNBLOCK, NULL, &set);
sigdelset(&set, SIGUSR1);
monitor_loop_cnt |= 1;
- rv = pselect(maxfd+1, NULL, NULL, &rfds, NULL, &set);
+ rv = pselect(maxfd+1, NULL, NULL, &rfds, &ts, &set);
monitor_loop_cnt += 1;
if (rv == -1 && errno == EINTR)
rv = 0;
/* FIXME check if device->state_fd need to be cleared?*/
signal_manager();
}
- if (a->container) {
+ if (a->container && !a->to_remove) {
is_dirty = read_and_act(a);
rv |= 1;
dirty_arrays += is_dirty;
/* propagate failures across container members */
for (a = *aap; a ; a = a->next) {
- if (!a->container)
+ if (!a->container || a->to_remove)
continue;
for (mdi = a->info.devs ; mdi ; mdi = mdi->next)
if (mdi->curr_state & DS_FAULTY)