summaryrefslogtreecommitdiff
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-02-25 14:59:12 +1100
committerNeilBrown <neilb@suse.de>2014-02-25 14:59:12 +1100
commit9ee314dab91dc8479d2e981d0849ce777f7ea492 (patch)
tree2c744458b564cb68d3ba022d9fe24a15e0b0f5fa /Assemble.c
parentdf842e69a3cb7316a06ba45f8f04d7b9beb0170f (diff)
Assemble: re-arrange freeing of 'tst' in load_devices().
When we return in error, we need to free(tst), and ->free_super(tst); Sometimes we didn't. Also the final ->free_super(tst) should be followed by free(tst) but wasn't. Move that file free forward in the code a bit as we will want to use the tst there in the next patch. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/Assemble.c b/Assemble.c
index af02633c..658df91d 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -572,6 +572,7 @@ static int load_devices(struct devs *devices, char *devmap,
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) {
char *devname = tmpdev->devname;
struct stat stb;
+ struct supertype *tst;
int i;
if (tmpdev->used != 1)
@@ -582,7 +583,6 @@ static int load_devices(struct devs *devices, char *devmap,
int dfd;
/* prepare useful information in info structures */
struct stat stb2;
- struct supertype *tst;
int err;
fstat(mdfd, &stb2);
@@ -611,6 +611,8 @@ static int load_devices(struct devs *devices, char *devmap,
close(mdfd);
free(devices);
free(devmap);
+ tst->ss->free_super(tst);
+ free(tst);
*stp = st;
return -1;
}
@@ -660,15 +662,13 @@ static int load_devices(struct devs *devices, char *devmap,
else
bitmap_done = 1;
}
- tst->ss->free_super(tst);
} else
#endif
{
- struct supertype *tst = dup_super(st);
- int dfd;
- dfd = dev_open(devname,
- tmpdev->disposition == 'I'
- ? O_RDWR : (O_RDWR|O_EXCL));
+ int dfd = dev_open(devname,
+ tmpdev->disposition == 'I'
+ ? O_RDWR : (O_RDWR|O_EXCL));
+ tst = dup_super(st);
if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
pr_err("cannot re-read metadata from %s - aborting\n",
@@ -678,11 +678,12 @@ static int load_devices(struct devs *devices, char *devmap,
close(mdfd);
free(devices);
free(devmap);
+ tst->ss->free_super(tst);
+ free(tst);
*stp = st;
return -1;
}
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
- tst->ss->free_super(tst);
close(dfd);
}
@@ -705,6 +706,8 @@ static int load_devices(struct devs *devices, char *devmap,
> devices[most_recent].i.events)
most_recent = devcnt;
}
+ tst->ss->free_super(tst);
+ free(tst);
if (content->array.level == LEVEL_MULTIPATH)
/* with multipath, the raid_disk from the superblock is meaningless */