diff options
author | Bob Moore <robert.moore@intel.com> | 2007-02-02 11:48:20 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-02-02 21:14:25 -0500 |
commit | 13b572a35ed904ae1e162f8ee89ca7fd6992b44c (patch) | |
tree | 16cd017aa6e4808c0b880ef853b8e896c85b7834 /drivers | |
parent | ea5d8ebcbb7ca3bcb35a2133805571295f3f06e8 (diff) |
ACPICA: Report error if method creates 2 objects with the same name
Fixed a regression where an error was no
longer emitted if a control method attempts to create 2
objects of the same name. This previously and now returns
AE_ALREADY_EXISTS. When this exception occurs, it invokes
the mechanism that will dynamically serialize the control
method to possible prevent future errors. (BZ 440)
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/dispatcher/dswload.c | 15 | ||||
-rw-r--r-- | drivers/acpi/parser/psparse.c | 5 |
2 files changed, 17 insertions, 3 deletions
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c index d60d0625b11c..565d4557d0e0 100644 --- a/drivers/acpi/dispatcher/dswload.c +++ b/drivers/acpi/dispatcher/dswload.c | |||
@@ -547,6 +547,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | |||
547 | acpi_status status; | 547 | acpi_status status; |
548 | acpi_object_type object_type; | 548 | acpi_object_type object_type; |
549 | char *buffer_ptr; | 549 | char *buffer_ptr; |
550 | u32 flags; | ||
550 | 551 | ||
551 | ACPI_FUNCTION_TRACE(ds_load2_begin_op); | 552 | ACPI_FUNCTION_TRACE(ds_load2_begin_op); |
552 | 553 | ||
@@ -752,12 +753,20 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | |||
752 | break; | 753 | break; |
753 | } | 754 | } |
754 | 755 | ||
755 | /* Add new entry into namespace */ | 756 | flags = ACPI_NS_NO_UPSEARCH; |
757 | if (walk_state->pass_number == 3) { | ||
758 | |||
759 | /* Execution mode, node cannot already exist */ | ||
760 | |||
761 | flags |= ACPI_NS_ERROR_IF_FOUND; | ||
762 | } | ||
763 | |||
764 | /* Add new entry or lookup existing entry */ | ||
756 | 765 | ||
757 | status = | 766 | status = |
758 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, | 767 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, |
759 | object_type, ACPI_IMODE_LOAD_PASS2, | 768 | object_type, ACPI_IMODE_LOAD_PASS2, flags, |
760 | ACPI_NS_NO_UPSEARCH, walk_state, &(node)); | 769 | walk_state, &node); |
761 | break; | 770 | break; |
762 | } | 771 | } |
763 | 772 | ||
diff --git a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c index a02aa62fe1e5..6e875cea17a9 100644 --- a/drivers/acpi/parser/psparse.c +++ b/drivers/acpi/parser/psparse.c | |||
@@ -540,6 +540,11 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state) | |||
540 | 540 | ||
541 | if ((status == AE_ALREADY_EXISTS) && | 541 | if ((status == AE_ALREADY_EXISTS) && |
542 | (!walk_state->method_desc->method.mutex)) { | 542 | (!walk_state->method_desc->method.mutex)) { |
543 | ACPI_INFO((AE_INFO, | ||
544 | "Marking method %4.4s as Serialized", | ||
545 | walk_state->method_node->name. | ||
546 | ascii)); | ||
547 | |||
543 | /* | 548 | /* |
544 | * Method tried to create an object twice. The probable cause is | 549 | * Method tried to create an object twice. The probable cause is |
545 | * that the method cannot handle reentrancy. | 550 | * that the method cannot handle reentrancy. |