Merge commit '3288b419b988b20a53a2b12eb8e5f9f536228db4'; commit '4363fd80bcc9f85ed824228dee5e6350a8d73e18'; commit '63b4aae33ebf00d443378daf313622630f2336c0'
* commit '3288b419b988b20a53a2b12eb8e5f9f536228db4': Revert "Incremental: honor --no-degraded to delay assembly" Incremental: honor an 'enough' flag from external handlers * commit '4363fd80bcc9f85ed824228dee5e6350a8d73e18': imsm: robustify recovery-start detection fix: memory leak in mdmon_pid() * commit '63b4aae33ebf00d443378daf313622630f2336c0': mdmon: fix missing open of md/<dev>/recovery_start
This commit is contained in:
commit
d492df0307
44
managemon.c
44
managemon.c
|
@ -361,6 +361,23 @@ static void manage_container(struct mdstat_ent *mdstat,
|
|||
}
|
||||
}
|
||||
|
||||
static int disk_init_and_add(struct mdinfo *disk, struct mdinfo *clone,
|
||||
struct active_array *aa)
|
||||
{
|
||||
if (!disk || !clone)
|
||||
return -1;
|
||||
|
||||
*disk = *clone;
|
||||
disk->recovery_fd = sysfs_open(aa->devnum, disk->sys_name, "recovery_start");
|
||||
disk->state_fd = sysfs_open(aa->devnum, disk->sys_name, "state");
|
||||
disk->prev_state = read_dev_state(disk->state_fd);
|
||||
disk->curr_state = disk->prev_state;
|
||||
disk->next = aa->info.devs;
|
||||
aa->info.devs = disk;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void manage_member(struct mdstat_ent *mdstat,
|
||||
struct active_array *a)
|
||||
{
|
||||
|
@ -414,14 +431,7 @@ static void manage_member(struct mdstat_ent *mdstat,
|
|||
free(newd);
|
||||
continue;
|
||||
}
|
||||
*newd = *d;
|
||||
newd->next = newa->info.devs;
|
||||
newa->info.devs = newd;
|
||||
|
||||
newd->state_fd = sysfs_open(a->devnum, newd->sys_name,
|
||||
"state");
|
||||
newd->prev_state = read_dev_state(newd->state_fd);
|
||||
newd->curr_state = newd->prev_state;
|
||||
disk_init_and_add(newd, d, newa);
|
||||
}
|
||||
queue_metadata_update(updates);
|
||||
updates = NULL;
|
||||
|
@ -513,19 +523,7 @@ static void manage_new(struct mdstat_ent *mdstat,
|
|||
if (i == di->disk.raid_disk)
|
||||
break;
|
||||
|
||||
if (di && newd) {
|
||||
memcpy(newd, di, sizeof(*newd));
|
||||
|
||||
newd->state_fd = sysfs_open(new->devnum,
|
||||
newd->sys_name,
|
||||
"state");
|
||||
newd->recovery_fd = sysfs_open(new->devnum,
|
||||
newd->sys_name,
|
||||
"recovery_start");
|
||||
|
||||
newd->prev_state = read_dev_state(newd->state_fd);
|
||||
newd->curr_state = newd->prev_state;
|
||||
} else {
|
||||
if (disk_init_and_add(newd, di, new) != 0) {
|
||||
if (newd)
|
||||
free(newd);
|
||||
|
||||
|
@ -535,11 +533,7 @@ static void manage_new(struct mdstat_ent *mdstat,
|
|||
new->container = NULL;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
sprintf(newd->sys_name, "rd%d", i);
|
||||
newd->next = new->info.devs;
|
||||
new->info.devs = newd;
|
||||
}
|
||||
|
||||
new->action_fd = sysfs_open(new->devnum, NULL, "sync_action");
|
||||
|
|
|
@ -4103,6 +4103,15 @@ static void update_recovery_start(struct imsm_dev *dev, struct mdinfo *array)
|
|||
rebuild = d;
|
||||
}
|
||||
|
||||
if (!rebuild) {
|
||||
/* (?) none of the disks are marked with
|
||||
* IMSM_ORD_REBUILD, so assume they are missing and the
|
||||
* disk_ord_tbl was not correctly updated
|
||||
*/
|
||||
dprintf("%s: failed to locate out-of-sync disk\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
units = __le32_to_cpu(dev->vol.curr_migr_unit);
|
||||
rebuild->recovery_start = units * blocks_per_migr_unit(dev);
|
||||
}
|
||||
|
|
6
util.c
6
util.c
|
@ -1532,7 +1532,11 @@ int mdmon_pid(int devnum)
|
|||
char pid[10];
|
||||
int fd;
|
||||
int n;
|
||||
sprintf(path, "%s/%s.pid", pid_dir, devnum2devname(devnum));
|
||||
char *devname = devnum2devname(devnum);
|
||||
|
||||
sprintf(path, "%s/%s.pid", pid_dir, devname);
|
||||
free(devname);
|
||||
|
||||
fd = open(path, O_RDONLY | O_NOATIME, 0);
|
||||
|
||||
if (fd < 0)
|
||||
|
|
Loading…
Reference in New Issue