ACPI: convert acpi_device_lock spinlock to mutex
Convert acpi_device_lock to a mutex to avoid a potential race upon access to /proc/acpi/wakeup Delete the lock entirely in wakeup.c since it is not necessary (and can not sleep) Found-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
+4
-9
@@ -343,9 +343,6 @@ acpi_system_write_alarm(struct file *file,
|
||||
}
|
||||
#endif /* HAVE_ACPI_LEGACY_ALARM */
|
||||
|
||||
extern struct list_head acpi_wakeup_device_list;
|
||||
extern spinlock_t acpi_device_lock;
|
||||
|
||||
static int
|
||||
acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
@@ -353,7 +350,7 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||
|
||||
seq_printf(seq, "Device\tS-state\t Status Sysfs node\n");
|
||||
|
||||
spin_lock(&acpi_device_lock);
|
||||
mutex_lock(&acpi_device_lock);
|
||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
||||
struct acpi_device *dev =
|
||||
container_of(node, struct acpi_device, wakeup_list);
|
||||
@@ -361,7 +358,6 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||
|
||||
if (!dev->wakeup.flags.valid)
|
||||
continue;
|
||||
spin_unlock(&acpi_device_lock);
|
||||
|
||||
ldev = acpi_get_physical_device(dev->handle);
|
||||
seq_printf(seq, "%s\t S%d\t%c%-8s ",
|
||||
@@ -376,9 +372,8 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||
seq_printf(seq, "\n");
|
||||
put_device(ldev);
|
||||
|
||||
spin_lock(&acpi_device_lock);
|
||||
}
|
||||
spin_unlock(&acpi_device_lock);
|
||||
mutex_unlock(&acpi_device_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -409,7 +404,7 @@ acpi_system_write_wakeup_device(struct file *file,
|
||||
strbuf[len] = '\0';
|
||||
sscanf(strbuf, "%s", str);
|
||||
|
||||
spin_lock(&acpi_device_lock);
|
||||
mutex_lock(&acpi_device_lock);
|
||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
||||
struct acpi_device *dev =
|
||||
container_of(node, struct acpi_device, wakeup_list);
|
||||
@@ -446,7 +441,7 @@ acpi_system_write_wakeup_device(struct file *file,
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&acpi_device_lock);
|
||||
mutex_unlock(&acpi_device_lock);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user