patch-2.4.26 linux-2.4.26/drivers/acpi/namespace/nseval.c
Next file: linux-2.4.26/drivers/acpi/namespace/nssearch.c
Previous file: linux-2.4.26/drivers/acpi/namespace/nsdump.c
Back to the patch index
Back to the overall index
- Lines: 78
- Date:
2004-04-14 06:05:28.000000000 -0700
- Orig file:
linux-2.4.25/drivers/acpi/namespace/nseval.c
- Orig date:
2004-02-18 05:36:31.000000000 -0800
diff -urN linux-2.4.25/drivers/acpi/namespace/nseval.c linux-2.4.26/drivers/acpi/namespace/nseval.c
@@ -82,11 +82,11 @@
union acpi_operand_object **params,
union acpi_operand_object **return_object)
{
- struct acpi_namespace_node *prefix_node;
acpi_status status;
+ struct acpi_namespace_node *prefix_node;
struct acpi_namespace_node *node = NULL;
+ union acpi_generic_state *scope_info;
char *internal_path = NULL;
- union acpi_generic_state scope_info;
ACPI_FUNCTION_TRACE ("ns_evaluate_relative");
@@ -106,11 +106,16 @@
return_ACPI_STATUS (status);
}
+ scope_info = acpi_ut_create_generic_state ();
+ if (!scope_info) {
+ goto cleanup1;
+ }
+
/* Get the prefix handle and Node */
status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) {
- return_ACPI_STATUS (status);
+ goto cleanup;
}
prefix_node = acpi_ns_map_handle_to_node (handle);
@@ -122,8 +127,8 @@
/* Lookup the name in the namespace */
- scope_info.scope.node = prefix_node;
- status = acpi_ns_lookup (&scope_info, internal_path, ACPI_TYPE_ANY,
+ scope_info->scope.node = prefix_node;
+ status = acpi_ns_lookup (scope_info, internal_path, ACPI_TYPE_ANY,
ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL,
&node);
@@ -148,7 +153,9 @@
pathname));
cleanup:
+ acpi_ut_delete_generic_state (scope_info);
+cleanup1:
ACPI_MEM_FREE (internal_path);
return_ACPI_STATUS (status);
}
@@ -197,7 +204,7 @@
status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) {
- return_ACPI_STATUS (status);
+ goto cleanup;
}
/* Lookup the name in the namespace */
@@ -304,6 +311,15 @@
}
/*
+ * For a method alias, we must grab the actual method node
+ * so that proper scoping context will be established
+ * before execution.
+ */
+ if (acpi_ns_get_type (node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) {
+ node = ACPI_CAST_PTR (struct acpi_namespace_node, node->object);
+ }
+
+ /*
* Two major cases here:
* 1) The object is an actual control method -- execute it.
* 2) The object is not a method -- just return it's current
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)