diff options
author | Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com> | 2017-04-10 21:07:07 +0530 |
---|---|---|
committer | Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com> | 2017-04-10 21:13:09 +0530 |
commit | 806226bf049e783813e2201b00aa080bf3563040 (patch) | |
tree | 5f0bcf3a1aa028ebf7f6e7c0af42285dd6efe85e | |
parent | 80c4a068544463b171a1682fb3758af62811e5a3 (diff) | |
download | occ-inband-sensors-806226bf049e783813e2201b00aa080bf3563040.tar.gz occ-inband-sensors-806226bf049e783813e2201b00aa080bf3563040.zip |
sensor: Cleanup exit paths on error
Signed-off-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
-rw-r--r-- | sensor.c | 45 |
1 files changed, 28 insertions, 17 deletions
@@ -24,7 +24,7 @@ typedef struct sensor { char name[30]; - char *unit; + const char *unit; u64 paddr; u64 vaddr; u32 size; @@ -322,6 +322,25 @@ out: return rc; } +void clear_chips(void) +{ + int i, j; + + kfree(system_attrs); + kfree(chip_attrs); + kfree(system_sensors); + for (i = 0; i < nr_chips; i++) { + kfree(chip_attr_group[i]); + kfree(chips[i].sensors); + kfree(chips[i].cores); + for (j = 0; j < chips[i].nr_cores; j++) + kfree(chips[i].cores[j].sensors); + } + kfree(chip_attr_group); + kfree(chips); + +} + static int sensor_init(void) { int rc, i; @@ -343,31 +362,23 @@ static int sensor_init(void) if (rc) { pr_info("Chip %d failed to create chip_attr_group\n", chips[i].id); - goto out; + goto out_clean_kobj; } } + + return rc; + +out_clean_kobj: + kobject_put(occ_sensor_kobj); out: + clear_chips(); return rc; } static void sensor_exit(void) { - int i, j; - kobject_put(occ_sensor_kobj); - - kfree(system_attrs); - kfree(chip_attrs); - kfree(system_sensors); - for (i = 0; i < nr_chips; i++) { - kfree(chip_attr_group[i]); - kfree(chips[i].sensors); - kfree(chips[i].cores); - for (j = 0; j < chips[i].nr_cores; j++) - kfree(chips[i].cores[j].sensors); - } - kfree(chip_attr_group); - kfree(chips); + clear_chips(); } module_init(sensor_init); |