diff options
Diffstat (limited to 'drivers/acpi/acpica/nsalloc.c')
| -rw-r--r-- | drivers/acpi/acpica/nsalloc.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c index 243737363fb8..fd1ff54cda19 100644 --- a/drivers/acpi/acpica/nsalloc.c +++ b/drivers/acpi/acpica/nsalloc.c @@ -106,6 +106,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name)  void acpi_ns_delete_node(struct acpi_namespace_node *node)  {  	union acpi_operand_object *obj_desc; +	union acpi_operand_object *next_desc;  	ACPI_FUNCTION_NAME(ns_delete_node); @@ -114,12 +115,13 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)  	acpi_ns_detach_object(node);  	/* -	 * Delete an attached data object if present (an object that was created -	 * and attached via acpi_attach_data). Note: After any normal object is -	 * detached above, the only possible remaining object is a data object. +	 * Delete an attached data object list if present (objects that were +	 * attached via acpi_attach_data). Note: After any normal object is +	 * detached above, the only possible remaining object(s) are data +	 * objects, in a linked list.  	 */  	obj_desc = node->object; -	if (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { +	while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {  		/* Invoke the attached data deletion handler if present */ @@ -127,7 +129,15 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)  			obj_desc->data.handler(node, obj_desc->data.pointer);  		} +		next_desc = obj_desc->common.next_object;  		acpi_ut_remove_reference(obj_desc); +		obj_desc = next_desc; +	} + +	/* Special case for the statically allocated root node */ + +	if (node == acpi_gbl_root_node) { +		return;  	}  	/* Now we can delete the node */  | 
