Don't hold md device open for so long in --monitor mode
map_dev can be slow and interferes with trying to stop the array.
This commit is contained in:
parent
4a39c6f236
commit
ab5303d695
|
@ -25,6 +25,8 @@ Changes Prior to this release
|
||||||
to 'clean'. This is slightly safer in some cases.
|
to 'clean'. This is slightly safer in some cases.
|
||||||
- Check device is large enough before hot-add: this improves quality
|
- Check device is large enough before hot-add: this improves quality
|
||||||
of error message.
|
of error message.
|
||||||
|
- Don't hold md device open for so long in --monitor mode - map_dev
|
||||||
|
can be slow and interferes with trying to stop the array.
|
||||||
|
|
||||||
Changes Prior to 2.5.6 release
|
Changes Prior to 2.5.6 release
|
||||||
- Fix bug which meant "bitmap=xxx" in mdadm.conf was not handled
|
- Fix bug which meant "bitmap=xxx" in mdadm.conf was not handled
|
||||||
|
|
24
Monitor.c
24
Monitor.c
|
@ -215,6 +215,7 @@ int Monitor(mddev_dev_t devlist,
|
||||||
mdstat = mdstat_read(oneshot?0:1, 0);
|
mdstat = mdstat_read(oneshot?0:1, 0);
|
||||||
|
|
||||||
for (st=statelist; st; st=st->next) {
|
for (st=statelist; st; st=st->next) {
|
||||||
|
struct { int state, major, minor; } info[MaxDisks];
|
||||||
mdu_array_info_t array;
|
mdu_array_info_t array;
|
||||||
struct mdstat_ent *mse = NULL, *mse2;
|
struct mdstat_ent *mse = NULL, *mse2;
|
||||||
char *dev = st->devname;
|
char *dev = st->devname;
|
||||||
|
@ -323,6 +324,19 @@ int Monitor(mddev_dev_t devlist,
|
||||||
if (mse)
|
if (mse)
|
||||||
st->percent = mse->percent;
|
st->percent = mse->percent;
|
||||||
|
|
||||||
|
|
||||||
|
for (i=0; i<MaxDisks && i <= array.raid_disks + array.nr_disks;
|
||||||
|
i++) {
|
||||||
|
mdu_disk_info_t disc;
|
||||||
|
if (ioctl(fd, GET_DISK_INFO, &disc) >= 0) {
|
||||||
|
info[i].state = disc.state;
|
||||||
|
info[i].major = disc.major;
|
||||||
|
info[i].minor = disc.minor;
|
||||||
|
} else
|
||||||
|
info[i].major = info[i].minor = 0;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
for (i=0; i<MaxDisks; i++) {
|
for (i=0; i<MaxDisks; i++) {
|
||||||
mdu_disk_info_t disc;
|
mdu_disk_info_t disc;
|
||||||
int newstate=0;
|
int newstate=0;
|
||||||
|
@ -332,9 +346,12 @@ int Monitor(mddev_dev_t devlist,
|
||||||
if (i > array.raid_disks + array.nr_disks) {
|
if (i > array.raid_disks + array.nr_disks) {
|
||||||
newstate = 0;
|
newstate = 0;
|
||||||
disc.major = disc.minor = 0;
|
disc.major = disc.minor = 0;
|
||||||
} else if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
|
} else if (info[i].major || info[i].minor) {
|
||||||
newstate = disc.state;
|
newstate = info[i].state;
|
||||||
dv = map_dev(disc.major, disc.minor, 1);
|
dv = map_dev(info[i].major, info[i].minor, 1);
|
||||||
|
disc.state = newstate;
|
||||||
|
disc.major = info[i].major;
|
||||||
|
disc.minor = info[i].minor;
|
||||||
} else if (mse && mse->pattern && i < strlen(mse->pattern)) {
|
} else if (mse && mse->pattern && i < strlen(mse->pattern)) {
|
||||||
switch(mse->pattern[i]) {
|
switch(mse->pattern[i]) {
|
||||||
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
|
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
|
||||||
|
@ -369,7 +386,6 @@ int Monitor(mddev_dev_t devlist,
|
||||||
st->devstate[i] = disc.state;
|
st->devstate[i] = disc.state;
|
||||||
st->devid[i] = makedev(disc.major, disc.minor);
|
st->devid[i] = makedev(disc.major, disc.minor);
|
||||||
}
|
}
|
||||||
close(fd);
|
|
||||||
st->active = array.active_disks;
|
st->active = array.active_disks;
|
||||||
st->working = array.working_disks;
|
st->working = array.working_disks;
|
||||||
st->spare = array.spare_disks;
|
st->spare = array.spare_disks;
|
||||||
|
|
Loading…
Reference in New Issue