From 4011421332681ba733a2fc90de7ac94da8593418 Mon Sep 17 00:00:00 2001 From: Jes Sorensen Date: Thu, 23 Feb 2012 08:55:19 +1100 Subject: [PATCH] Print error message if failing to write super for 1.x metadata 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 Signed-off-by: NeilBrown --- Create.c | 3 --- super1.c | 25 ++++++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Create.c b/Create.c index 90ff3edd..e5c6b05e 100644 --- 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; } diff --git a/super1.c b/super1.c index a18952a7..341ad537 100644 --- 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 -- 2.47.2