summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mdadm.c9
-rw-r--r--mdadm.h1
-rw-r--r--mdopen.c31
3 files changed, 29 insertions, 12 deletions
diff --git a/mdadm.c b/mdadm.c
index fb52b141..b33f605b 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -943,8 +943,9 @@ int main(int argc, char *argv[])
exit(2);
}
if (mode == MANAGE || mode == GROW)
- autof=1; /* Don't create */
- mdfd = create_mddev(devlist->devname, autof);
+ mdfd = open_mddev(devlist->devname, 1);
+ else
+ mdfd = create_mddev(devlist->devname, autof);
if (mdfd < 0)
exit(1);
if ((int)ident.super_minor == -2) {
@@ -1242,7 +1243,7 @@ int main(int argc, char *argv[])
e->dev);
continue;
}
- mdfd = create_mddev(name, 1);
+ mdfd = open_mddev(name, 1);
if (mdfd >= 0) {
if (Manage_runstop(name, mdfd, -1, quiet?1:last?0:-1))
err = 1;
@@ -1279,7 +1280,7 @@ int main(int argc, char *argv[])
case Waitclean:
rv |= WaitClean(dv->devname, verbose-quiet); continue;
}
- mdfd = create_mddev(dv->devname, 1);
+ mdfd = open_mddev(dv->devname, 1);
if (mdfd>=0) {
switch(dv->disposition) {
case 'R':
diff --git a/mdadm.h b/mdadm.h
index 8527bbb1..7b7e233b 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -802,6 +802,7 @@ extern char *get_md_name(int dev);
extern char DefaultConfFile[];
extern int create_mddev(char *dev, int autof);
+extern int open_mddev(char *dev, int report_errors);
extern int create_mddev_devnum(char *devname, int devnum, char *name,
char *chosen_name, int parts);
extern int open_container(int fd);
diff --git a/mdopen.c b/mdopen.c
index 51568359..285d811b 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -254,15 +254,30 @@ int create_mddev(char *dev, int autof)
make_parts(dev,parts, ci->symlinks);
}
}
- mdfd = open(dev, O_RDWR);
- if (mdfd < 0)
- fprintf(stderr, Name ": error opening %s: %s\n",
- dev, strerror(errno));
- else if (md_get_version(mdfd) <= 0) {
- fprintf(stderr, Name ": %s does not appear to be an md device\n",
- dev);
+ mdfd = open_mddev(dev, 1);
+ return mdfd;
+}
+
+/* Open this and check that it is an md device.
+ * On success, return filedescriptor.
+ * On failure, return -1 if it doesn't exist,
+ * or -2 if it exists but is not an md device.
+ */
+int open_mddev(char *dev, int report_errors)
+{
+ int mdfd = open(dev, O_RDWR);
+ if (mdfd < 0) {
+ if (report_errors)
+ fprintf(stderr, Name ": error opening %s: %s\n",
+ dev, strerror(errno));
+ return -1;
+ }
+ if (md_get_version(mdfd) <= 0) {
close(mdfd);
- mdfd = -1;
+ if (report_errors)
+ fprintf(stderr, Name ": %s does not appear to be "
+ "an md device\n", dev);
+ return -2;
}
return mdfd;
}