]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Print error message if failing to write super for 1.x metadata
authorJes Sorensen <Jes.Sorensen@redhat.com>
Wed, 22 Feb 2012 21:55:19 +0000 (08:55 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 22 Feb 2012 21:55:19 +0000 (08:55 +1100)
In addition remove attempt to print an error message if
write_init_super() fails, as this is handled in the various
write_init_super() functions. This avoids a segfault on error.

Reported by Jim Meyering in
https://bugzilla.redhat.com/show_bug.cgi?id=795461

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Create.c
super1.c

index 90ff3edd8dcc61c04081287f6a4891b0184653e2..e5c6b05e274e04cf3a6c0bfabb4ea794d4bcd823 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -924,9 +924,6 @@ int Create(struct supertype *st, char *mddev,
                        }
 
                        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_locked;
                        }
index a18952a71e93e45199f6ac1d0a0dc3dc96aa3e42..341ad5375c633bfafa819d130ec2442c9c31e959 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -1106,13 +1106,16 @@ static int write_init_super1(struct supertype *st)
                }
                free(refst);
 
-               if (!get_dev_size(di->fd, NULL, &dsize))
-                       return 1;
+               if (!get_dev_size(di->fd, NULL, &dsize)) {
+                       rv = 1;
+                       goto error_out;
+               }
                dsize >>= 9;
 
                if (dsize < 24) {
                        close(di->fd);
-                       return 2;
+                       rv = 2;
+                       goto error_out;
                }
 
 
@@ -1176,22 +1179,26 @@ static int write_init_super1(struct supertype *st)
                        sb->data_size = __cpu_to_le64(dsize - reserved);
                        break;
                default:
-                       return -EINVAL;
+                       fprintf(stderr, Name ": Failed to write invalid "
+                               "metadata format 1.%i to %s\n",
+                               st->minor_version, di->devname);
+                       rv = -EINVAL;
+                       goto out;
                }
 
 
                sb->sb_csum = calc_sb_1_csum(sb);
                rv = store_super1(st, di->fd);
-               if (rv)
-                       fprintf(stderr,
-                               Name ": failed to write superblock to %s\n",
-                               di->devname);
-
                if (rv == 0 && (__le32_to_cpu(sb->feature_map) & 1))
                        rv = st->ss->write_bitmap(st, di->fd);
                close(di->fd);
                di->fd = -1;
        }
+error_out:
+       if (rv)
+               fprintf(stderr, Name ": Failed to write metadata to %s\n",
+                       di->devname);
+out:
        return rv;
 }
 #endif