Commit a383b68d authored by Yasuaki Ishimatsu's avatar Yasuaki Ishimatsu Committed by Rafael J. Wysocki

ACPI / scan: not cache _SUN value in struct acpi_device_pnp

The _SUN device indentification object is not guaranteed to return
the same value every time it is executed, so we should not cache its
return value, but rather execute it every time as needed.  If it is
cached, an incorrect stale value may be used in some situations.

This issue was exposed by commit 202317a5 (ACPI / scan: Add
acpi_device objects for all device nodes in the namespace).  Fix it
by avoiding to cache the return value of _SUN.

Fixes: 202317a5 (ACPI / scan: Add acpi_device objects for all device nodes in the namespace)
Signed-off-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: 3.14+ <stable@vger.kernel.org> # 3.14+
[ rjw: Changelog ]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 69e273c0
...@@ -667,8 +667,14 @@ static ssize_t ...@@ -667,8 +667,14 @@ static ssize_t
acpi_device_sun_show(struct device *dev, struct device_attribute *attr, acpi_device_sun_show(struct device *dev, struct device_attribute *attr,
char *buf) { char *buf) {
struct acpi_device *acpi_dev = to_acpi_device(dev); struct acpi_device *acpi_dev = to_acpi_device(dev);
acpi_status status;
unsigned long long sun;
status = acpi_evaluate_integer(acpi_dev->handle, "_SUN", NULL, &sun);
if (ACPI_FAILURE(status))
return -ENODEV;
return sprintf(buf, "%lu\n", acpi_dev->pnp.sun); return sprintf(buf, "%llu\n", sun);
} }
static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL); static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL);
...@@ -690,7 +696,6 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -690,7 +696,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
{ {
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
acpi_status status; acpi_status status;
unsigned long long sun;
int result = 0; int result = 0;
/* /*
...@@ -731,14 +736,10 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -731,14 +736,10 @@ static int acpi_device_setup_files(struct acpi_device *dev)
if (dev->pnp.unique_id) if (dev->pnp.unique_id)
result = device_create_file(&dev->dev, &dev_attr_uid); result = device_create_file(&dev->dev, &dev_attr_uid);
status = acpi_evaluate_integer(dev->handle, "_SUN", NULL, &sun); if (acpi_has_method(dev->handle, "_SUN")) {
if (ACPI_SUCCESS(status)) {
dev->pnp.sun = (unsigned long)sun;
result = device_create_file(&dev->dev, &dev_attr_sun); result = device_create_file(&dev->dev, &dev_attr_sun);
if (result) if (result)
goto end; goto end;
} else {
dev->pnp.sun = (unsigned long)-1;
} }
if (acpi_has_method(dev->handle, "_STA")) { if (acpi_has_method(dev->handle, "_STA")) {
......
...@@ -246,7 +246,6 @@ struct acpi_device_pnp { ...@@ -246,7 +246,6 @@ struct acpi_device_pnp {
acpi_device_name device_name; /* Driver-determined */ acpi_device_name device_name; /* Driver-determined */
acpi_device_class device_class; /* " */ acpi_device_class device_class; /* " */
union acpi_object *str_obj; /* unicode string for _STR method */ union acpi_object *str_obj; /* unicode string for _STR method */
unsigned long sun; /* _SUN */
}; };
#define acpi_device_bid(d) ((d)->pnp.bus_id) #define acpi_device_bid(d) ((d)->pnp.bus_id)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment