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:
NeilBrown 2010-05-31 11:34:14 +10:00
commit d492df0307
3 changed files with 33 additions and 26 deletions

View File

@ -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");

View File

@ -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
View File

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