diff options
author | NeilBrown <neilb@suse.de> | 2010-01-28 09:01:36 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-01-28 09:02:21 +1100 |
commit | 9f22b13fe1726f3ac4da423a3e56441590c28d9f (patch) | |
tree | b9cfaff64c541bbebb78f4643a17b522fdfc5683 /Assemble.c | |
parent | 080fd00521590cef01e4b6d8268fd998e15698cf (diff) | |
download | mdadm-9f22b13fe1726f3ac4da423a3e56441590c28d9f.tar.gz mdadm-9f22b13fe1726f3ac4da423a3e56441590c28d9f.tar.xz mdadm-9f22b13fe1726f3ac4da423a3e56441590c28d9f.zip |
Assemble: error-check ->load_super
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>
Diffstat (limited to 'Assemble.c')
-rw-r--r-- | Assemble.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -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); |