Skip to content

Commit

Permalink
cpufreq: fix missing unlocks in cpufreq_add_dev error paths.
Browse files Browse the repository at this point in the history
Ingo hit some BUG_ONs that were probably caused by these missing unlocks
causing an unbalance.  He couldn't reproduce the bug reliably, so it's
unknown that it's definitly fixing the problem he hit, but it's a fairly
good chance, and this fixes an obvious bug.

[ Dave: "Ingo followed up that he hit some lockdep related output with
         this applied, so it may not be right.  I'll look at it after
         xmas if no-one has it figured out before then."
  Akpm: "It looks pretty correct to me though." ]

Signed-off-by: Dave Jones <davej@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Dave Jones authored and Linus Torvalds committed Dec 18, 2007
1 parent 9548b20 commit bd6cba5
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions drivers/cpufreq/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -841,19 +841,25 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
drv_attr = cpufreq_driver->attr;
while ((drv_attr) && (*drv_attr)) {
ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
if (ret)
if (ret) {
unlock_policy_rwsem_write(cpu);
goto err_out_driver_exit;
}
drv_attr++;
}
if (cpufreq_driver->get){
ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
if (ret)
if (ret) {
unlock_policy_rwsem_write(cpu);
goto err_out_driver_exit;
}
}
if (cpufreq_driver->target){
ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
if (ret)
if (ret) {
unlock_policy_rwsem_write(cpu);
goto err_out_driver_exit;
}
}

spin_lock_irqsave(&cpufreq_driver_lock, flags);
Expand Down

0 comments on commit bd6cba5

Please sign in to comment.