]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Fix some compiler warnings.
[thirdparty/mdadm.git] / Create.c
index ef60244a352216dd950f8a9301cae242be3c7b29..48115db800a730a29968f1e1ae78e0c8bfd50e1c 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -292,6 +292,8 @@ int Create(struct supertype *st, char *mddev,
        for (dv=devlist; dv && !have_container; dv=dv->next, dnum++) {
                char *dname = dv->devname;
                unsigned long long freesize;
+               int dfd;
+
                if (strcasecmp(dname, "missing")==0) {
                        if (first_missing > dnum)
                                first_missing = dnum;
@@ -300,6 +302,20 @@ int Create(struct supertype *st, char *mddev,
                        missing_disks ++;
                        continue;
                }
+               dfd = open(dname, O_RDONLY);
+               if (dfd < 0) {
+                       fprintf(stderr, Name ": cannot open %s: %s\n",
+                               dname, strerror(errno));
+                       exit(2);
+               }
+               if (fstat(dfd, &stb) != 0 ||
+                   (stb.st_mode & S_IFMT) != S_IFBLK) {
+                       close(dfd);
+                       fprintf(stderr, Name ": %s is not a block device\n",
+                               dname);
+                       exit(2);
+               }
+               close(dfd);
                info.array.working_disks++;
                if (dnum < raiddisks)
                        info.array.active_disks++;
@@ -329,6 +345,12 @@ int Create(struct supertype *st, char *mddev,
                        }
 
                        if (!st) {
+                               int dfd = open(dname, O_RDONLY|O_EXCL);
+                               if (dfd < 0) {
+                                       fprintf(stderr, Name ": cannot open %s: %s\n",
+                                               dname, strerror(errno));
+                                       exit(2);
+                               }
                                fprintf(stderr, Name ": device %s not suitable "
                                        "for any style of array\n",
                                        dname);
@@ -636,8 +658,8 @@ int Create(struct supertype *st, char *mddev,
                goto abort;
 
        total_slots = info.array.nr_disks;
-       sysfs_init(&info, mdfd, 0);
        st->ss->getinfo_super(st, &info, NULL);
+       sysfs_init(&info, mdfd, 0);
 
        if (did_default && verbose >= 0) {
                if (is_subarray(info.text_version)) {
@@ -834,11 +856,19 @@ int Create(struct supertype *st, char *mddev,
                                        /* getinfo_super might have lost these ... */
                                        inf->disk.major = major(stb.st_rdev);
                                        inf->disk.minor = minor(stb.st_rdev);
+                                       /* FIXME the following should not be needed
+                                        * as getinfo_super is suppose to set
+                                        * them.  However it doesn't for imsm,
+                                        * so we have this hack for now
+                                        */
+                                       if (st->ss == &super_imsm) {
+                                               inf->disk.number = dnum;
+                                               inf->disk.raid_disk = dnum;
+                                       }
                                }
                                break;
                        case 2:
                                inf->errors = 0;
-                               rv = 0;
 
                                rv = add_disk(mdfd, st, &info, inf);
 
@@ -874,7 +904,13 @@ int Create(struct supertype *st, char *mddev,
                                me = map_by_devnum(&map, st->container_dev);
                        }
 
-                       st->ss->write_init_super(st);
+                       if (st->ss->write_init_super(st)) {
+                               fprintf(stderr,
+                                       Name ": Failed to write metadata to %s\n",
+                                       dv->devname);
+                               st->ss->free_super(st);
+                               goto abort;
+                       }
 
                        /* update parent container uuid */
                        if (me) {