summaryrefslogtreecommitdiff
path: root/Monitor.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-12-14 17:31:22 +1100
committerNeil Brown <neilb@suse.de>2006-12-14 17:31:22 +1100
commitb90c0e9a12090c435f23da8378b3436c93f77f2f (patch)
tree221aa0ad769db836533999ef8fd2003e90904066 /Monitor.c
parente336254463da8ffa9923118a9c802253d312b8bb (diff)
--wait or -W will wait for resync activity to finish on the given devices.
Diffstat (limited to 'Monitor.c')
-rw-r--r--Monitor.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/Monitor.c b/Monitor.c
index 315fee25..5091c51b 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -553,3 +553,38 @@ static void alert(char *event, char *dev, char *disc, char *mailaddr, char *mail
syslog(priority, "%s event detected on md device %s", event, dev);
}
}
+
+/* Not really Monitor but ... */
+int Wait(char *dev)
+{
+ struct stat stb;
+ int devnum;
+ int rv = 1;
+
+ if (stat(dev, &stb) != 0) {
+ fprintf(stderr, Name ": Cannot find %s: %s\n", dev,
+ strerror(errno));
+ return 2;
+ }
+ if (major(stb.st_rdev) == MD_MAJOR)
+ devnum = minor(stb.st_rdev);
+ else
+ devnum = -minor(stb.st_rdev)/16;
+
+ while(1) {
+ struct mdstat_ent *ms = mdstat_read(1, 0);
+ struct mdstat_ent *e;
+
+ for (e=ms ; e; e=e->next)
+ if (e->devnum == devnum)
+ break;
+
+ if (!e || e->percent < 0) {
+ free_mdstat(ms);
+ return rv;
+ }
+ free(ms);
+ rv = 0;
+ mdstat_wait(5);
+ }
+}