int ping_monitor(char *devname)
{
int sfd = connect_monitor(devname);
- int err = fping_monitor(sfd);
+ int err;
+
+ if (sfd >= 0) {
+ err = fping_monitor(sfd);
+ close(sfd);
+ } else
+ err = -1;
- close(sfd);
return err;
}
ver = version ? mdadm_version(version) : -1;
free(version);
if (ver < 3002000) {
- fprintf(stderr, Name
- ": mdmon instance for %s cannot be disabled\n",
- container);
+ pr_err("mdmon instance for %s cannot be disabled\n",
+ container);
return -1;
}
}
ent = mdstat_read(0, 0);
if (!ent) {
- fprintf(stderr, Name
- ": failed to read /proc/mdstat while disabling mdmon\n");
+ pr_err("failed to read /proc/mdstat while disabling mdmon\n");
return -1;
}
sysfs_free(sra);
sra = sysfs_read(-1, e->devnum, GET_VERSION);
if (!sra) {
- fprintf(stderr, Name
- ": failed to read sysfs for subarray%s\n",
- to_subarray(e, container));
+ pr_err("failed to read sysfs for subarray%s\n",
+ to_subarray(e, container));
break;
}
/* can't reshape an array that we can't monitor */
}
if (e) {
- fprintf(stderr, Name ": failed to freeze subarray%s\n",
+ pr_err("failed to freeze subarray%s\n",
to_subarray(e, container));
/* thaw the partially frozen container */
sysfs_free(sra);
sra = sysfs_read(-1, e2->devnum, GET_VERSION);
if (unblock_subarray(sra, freeze))
- fprintf(stderr, Name ": Failed to unfreeze %s\n", e2->dev);
+ pr_err("Failed to unfreeze %s\n", e2->dev);
}
ping_monitor(container); /* cleared frozen */
ent = mdstat_read(0, 0);
if (!ent) {
- fprintf(stderr, Name
- ": failed to read /proc/mdstat while unblocking container\n");
+ pr_err("failed to read /proc/mdstat while unblocking container\n");
return;
}
continue;
sysfs_free(sra);
sra = sysfs_read(-1, e->devnum, GET_VERSION|GET_LEVEL);
+ if (!sra)
+ continue;
if (sra->array.level > 0)
to_ping++;
if (unblock_subarray(sra, unfreeze))
- fprintf(stderr, Name ": Failed to unfreeze %s\n", e->dev);
+ pr_err("Failed to unfreeze %s\n", e->dev);
}
if (to_ping)
ping_monitor(container);
close(sfd);
return err;
}
+
+/* using takeover operation for grow purposes, mdadm has to be sure
+ * that mdmon processes all updates, and if necessary it will be closed
+ * at takeover to raid0 operation
+ */
+void flush_mdmon(char *container)
+{
+ ping_manager(container);
+ ping_monitor(container);
+}