diff options
author | Jes Sorensen <Jes.Sorensen@redhat.com> | 2011-11-01 16:09:31 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-11-02 00:48:53 +0100 |
commit | bccd8153faaf34dc53455d598a61e13ce8a986e9 (patch) | |
tree | 57eed8f7f9a9fd61895731c436d8a3b9082cca3f /Manage.c | |
parent | Managa_ro(): free() mdi before exiting (diff) | |
download | mdadm-bccd8153faaf34dc53455d598a61e13ce8a986e9.tar.xz mdadm-bccd8153faaf34dc53455d598a61e13ce8a986e9.zip |
Manage_runstop(): Avoid memory leak
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.c | 22 |
1 files changed, 13 insertions, 9 deletions
@@ -183,6 +183,7 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) * quiet < 0 means we will try again if it fails. */ mdu_param_t param; /* unused */ + int rv = 0; if (runstop == -1 && md_get_version(fd) < 9000) { if (ioctl(fd, STOP_MD, 0)) { @@ -261,7 +262,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) fprintf(stderr, Name ": failed to stop array %s: %s\n", devname, strerror(errno)); - return 1; + rv = 1; + goto out; } /* Give monitor a chance to act */ @@ -273,7 +275,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) ": failed to completely stop %s" ": Device is busy\n", devname); - return 1; + rv = 1; + goto out; } } else if (mdi && mdi->array.major_version == -1 && @@ -301,9 +304,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) "member %s still active\n", devname, m->dev); free_mdstat(mds); - if (mdi) - sysfs_free(mdi); - return 1; + rv = 1; + goto out; } } @@ -328,9 +330,8 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) "process, mounted filesystem " "or active volume group?\n"); } - if (mdi) - sysfs_free(mdi); - return 1; + rv = 1; + goto out; } /* prior to 2.6.28, KOBJ_CHANGE was not sent when an md array * was stopped, so We'll do it here just to be sure. Drop any @@ -355,8 +356,11 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet) map_lock(&map); map_remove(&map, devnum); map_unlock(&map); + out: + if (mdi) + sysfs_free(mdi); } - return 0; + return rv; } int Manage_resize(char *devname, int fd, long long size, int raid_disks) |