]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: error-check ->load_super
authorNeilBrown <neilb@suse.de>
Wed, 27 Jan 2010 22:01:36 +0000 (09:01 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 27 Jan 2010 22:02:21 +0000 (09:02 +1100)
Once load_super has succeeded, it should continue to succeed.  However
devices can disappear etc so it is prudent to always check the return
status of load_super.

Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c

index 014d644b42667a5755b2edb5736c15d9775f360b..7f900489bb19483bacf9fa15bb8cc97d5b0c083f 100644 (file)
@@ -619,7 +619,14 @@ int Assemble(struct supertype *st, char *mddev,
                        remove_partitions(dfd);
 
                        tst = dup_super(st);
-                       tst->ss->load_super(tst, dfd, NULL);
+                       if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
+                               fprintf(stderr, Name ": cannot re-read metadata from %s - aborting\n",
+                                       devname);
+                               if (dfd >= 0)
+                                       close(dfd);
+                               close(mdfd);
+                               return 1;
+                       }
                        tst->ss->getinfo_super(tst, content);
 
                        memcpy(content->uuid, ident->uuid, 16);
@@ -662,7 +669,14 @@ int Assemble(struct supertype *st, char *mddev,
 
                        remove_partitions(dfd);
 
-                       tst->ss->load_super(tst, dfd, NULL);
+                       if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
+                               fprintf(stderr, Name ": cannot re-read metadata from %s - aborting\n",
+                                       devname);
+                               if (dfd >= 0)
+                                       close(dfd);
+                               close(mdfd);
+                               return 1;
+                       }
                        tst->ss->getinfo_super(tst, content);
                        tst->ss->free_super(tst);
                        close(dfd);