diff options
author | Igor Mammedov <imammedo@redhat.com> | 2013-05-14 10:46:06 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-21 13:14:40 -0400 |
commit | c055da9fbad4b63bb3169f2b1a8b7ad429270bd0 (patch) | |
tree | 5a861955edf614619a237e671a0d8a65c674612b /drivers/base/cpu.c | |
parent | a4e2400a63f0e4fb6af5083a24d80b6fa4c41ccd (diff) |
cpu: fix "crash_notes" and "crash_notes_size" leaks in register_cpu()
"crash_notes" and "crash_notes_size" are dynamically created
with device_create_file() but aren't deleted anywhere.
Define "crash_notes" and "crash_notes_size" statically via
attribute groups so that device_register would create them
automatically and files would be destroyed when CPU is destroyed.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base/cpu.c')
-rw-r--r-- | drivers/base/cpu.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 3d48fc887ef4..8f9e264220d2 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c | |||
@@ -164,7 +164,24 @@ static ssize_t show_crash_notes_size(struct device *dev, | |||
164 | return rc; | 164 | return rc; |
165 | } | 165 | } |
166 | static DEVICE_ATTR(crash_notes_size, 0400, show_crash_notes_size, NULL); | 166 | static DEVICE_ATTR(crash_notes_size, 0400, show_crash_notes_size, NULL); |
167 | |||
168 | static struct attribute *crash_note_cpu_attrs[] = { | ||
169 | &dev_attr_crash_notes.attr, | ||
170 | &dev_attr_crash_notes_size.attr, | ||
171 | NULL | ||
172 | }; | ||
173 | |||
174 | static struct attribute_group crash_note_cpu_attr_group = { | ||
175 | .attrs = crash_note_cpu_attrs, | ||
176 | }; | ||
177 | #endif | ||
178 | |||
179 | static const struct attribute_group *common_cpu_attr_groups[] = { | ||
180 | #ifdef CONFIG_KEXEC | ||
181 | &crash_note_cpu_attr_group, | ||
167 | #endif | 182 | #endif |
183 | NULL | ||
184 | }; | ||
168 | 185 | ||
169 | /* | 186 | /* |
170 | * Print cpu online, possible, present, and system maps | 187 | * Print cpu online, possible, present, and system maps |
@@ -280,6 +297,7 @@ int __cpuinit register_cpu(struct cpu *cpu, int num) | |||
280 | #ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE | 297 | #ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE |
281 | cpu->dev.bus->uevent = arch_cpu_uevent; | 298 | cpu->dev.bus->uevent = arch_cpu_uevent; |
282 | #endif | 299 | #endif |
300 | cpu->dev.groups = common_cpu_attr_groups; | ||
283 | error = device_register(&cpu->dev); | 301 | error = device_register(&cpu->dev); |
284 | if (!error && cpu->hotpluggable) | 302 | if (!error && cpu->hotpluggable) |
285 | register_cpu_control(cpu); | 303 | register_cpu_control(cpu); |
@@ -288,13 +306,6 @@ int __cpuinit register_cpu(struct cpu *cpu, int num) | |||
288 | if (!error) | 306 | if (!error) |
289 | register_cpu_under_node(num, cpu_to_node(num)); | 307 | register_cpu_under_node(num, cpu_to_node(num)); |
290 | 308 | ||
291 | #ifdef CONFIG_KEXEC | ||
292 | if (!error) | ||
293 | error = device_create_file(&cpu->dev, &dev_attr_crash_notes); | ||
294 | if (!error) | ||
295 | error = device_create_file(&cpu->dev, | ||
296 | &dev_attr_crash_notes_size); | ||
297 | #endif | ||
298 | return error; | 309 | return error; |
299 | } | 310 | } |
300 | 311 | ||