summaryrefslogtreecommitdiffstats
path: root/Manage.c
diff options
context:
space:
mode:
authorJes Sorensen <Jes.Sorensen@redhat.com>2011-11-01 16:09:28 +0100
committerNeilBrown <neilb@suse.de>2011-11-02 10:48:53 +1100
commit093d918759b2a3fa70691bdb5cb3e0c9c8ad4935 (patch)
tree545e61de3b2f081010fe46bd603b20d71390b481 /Manage.c
parentaabe020dd2465c9a4df6e72f35f7a986bd7c5327 (diff)
downloadmdadm-093d918759b2a3fa70691bdb5cb3e0c9c8ad4935.tar.gz
Manage_subdevs(): avoid leaking super
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Manage.c')
-rw-r--r--Manage.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/Manage.c b/Manage.c
index 613a5497..170af571 100644
--- a/Manage.c
+++ b/Manage.c
@@ -623,10 +623,12 @@ int Manage_subdevs(char *devname, int fd,
if (add_dev == dv->devname) {
if (!get_dev_size(tfd, dv->devname, &ldsize)) {
+ st->ss->free_super(st);
close(tfd);
return 1;
}
} else if (!get_dev_size(tfd, NULL, &ldsize)) {
+ st->ss->free_super(st);
close(tfd);
tfd = -1;
continue;
@@ -643,6 +645,7 @@ int Manage_subdevs(char *devname, int fd,
" Add --force is you "
"really wan to add this device.\n",
add_dev, devname);
+ st->ss->free_super(st);
close(tfd);
return 1;
}
@@ -657,6 +660,7 @@ int Manage_subdevs(char *devname, int fd,
array.major_version == 0 &&
md_get_version(fd)%100 < 2) {
close(tfd);
+ st->ss->free_super(st);
tfd = -1;
if (ioctl(fd, HOT_ADD_DISK,
(unsigned long)stb.st_rdev)==0) {
@@ -707,6 +711,7 @@ int Manage_subdevs(char *devname, int fd,
/* FIXME this is a bad test to be using */
if (!tst->sb) {
close(tfd);
+ st->ss->free_super(st);
fprintf(stderr, Name ": cannot load array metadata from %s\n", devname);
return 1;
}
@@ -716,6 +721,7 @@ int Manage_subdevs(char *devname, int fd,
array_size) {
close(tfd);
tfd = -1;
+ st->ss->free_super(st);
if (add_dev != dv->devname)
continue;
fprintf(stderr, Name ": %s not large enough to join array\n",
@@ -768,6 +774,7 @@ int Manage_subdevs(char *devname, int fd,
if (tfd < 0) {
fprintf(stderr, Name ": failed to open %s for"
" superblock update during re-add\n", dv->devname);
+ st->ss->free_super(st);
return 1;
}
@@ -790,6 +797,7 @@ int Manage_subdevs(char *devname, int fd,
if (rv != 0) {
fprintf(stderr, Name ": failed to update"
" superblock during re-add\n");
+ st->ss->free_super(st);
return 1;
}
}
@@ -799,11 +807,13 @@ int Manage_subdevs(char *devname, int fd,
if (verbose >= 0)
fprintf(stderr, Name ": re-added %s\n", add_dev);
count++;
+ st->ss->free_super(st);
continue;
}
if (errno == ENOMEM || errno == EROFS) {
fprintf(stderr, Name ": add new device failed for %s: %s\n",
add_dev, strerror(errno));
+ st->ss->free_super(st);
if (add_dev != dv->devname)
continue;
return 1;