diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2013-03-08 09:21:02 +0000 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-03-12 00:45:04 +0100 |
commit | 3cf24497f45d61ed3c3290b5b03f3baeb8401f04 (patch) | |
tree | 32e5886ac23ccfd419694b33f83f518a9df45770 | |
parent | 98b5c9934ccdf6c04413e0d03c1ddeb32592d8c6 (diff) | |
download | linux-stable-3cf24497f45d61ed3c3290b5b03f3baeb8401f04.tar.gz linux-stable-3cf24497f45d61ed3c3290b5b03f3baeb8401f04.tar.bz2 linux-stable-3cf24497f45d61ed3c3290b5b03f3baeb8401f04.zip |
ACPICA: Fix a long-standing bug in local cache
Since 20060317, the pointer to next object is the first element in
its common header. Remove bogus LinkOffset from ACPI_MEMORY_LIST
and directly use NextObject.
Signed-off-by: Jung-uk Kim <jkim@FreeBSD.org>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/acpi/acpica/utcache.c | 20 | ||||
-rw-r--r-- | include/acpi/actypes.h | 1 |
2 files changed, 7 insertions, 14 deletions
diff --git a/drivers/acpi/acpica/utcache.c b/drivers/acpi/acpica/utcache.c index e0e8579deaac..2de22fbacf4b 100644 --- a/drivers/acpi/acpica/utcache.c +++ b/drivers/acpi/acpica/utcache.c @@ -85,7 +85,6 @@ acpi_os_create_cache(char *cache_name, /* Populate the cache object and return it */ ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list)); - cache->link_offset = 8; cache->list_name = cache_name; cache->object_size = object_size; cache->max_depth = max_depth; @@ -108,7 +107,7 @@ acpi_os_create_cache(char *cache_name, acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache) { - char *next; + void *next; acpi_status status; ACPI_FUNCTION_ENTRY(); @@ -128,10 +127,9 @@ acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache) /* Delete and unlink one cached state object */ - next = *(ACPI_CAST_INDIRECT_PTR(char, - &(((char *)cache-> - list_head)[cache-> - link_offset]))); + next = + ((struct acpi_object_common *)cache->list_head)-> + next_object; ACPI_FREE(cache->list_head); cache->list_head = next; @@ -221,9 +219,7 @@ acpi_os_release_object(struct acpi_memory_list * cache, void *object) /* Put the object at the head of the cache list */ - *(ACPI_CAST_INDIRECT_PTR(char, - &(((char *)object)[cache-> - link_offset]))) = + ((struct acpi_object_common *)object)->next_object = cache->list_head; cache->list_head = object; cache->current_depth++; @@ -272,10 +268,8 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache) /* There is an object available, use it */ object = cache->list_head; - cache->list_head = *(ACPI_CAST_INDIRECT_PTR(char, - &(((char *) - object)[cache-> - link_offset]))); + cache->list_head = + ((struct acpi_object_common *)object)->next_object; cache->current_depth--; diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 845e75f1ffd8..3fac1be2d8b4 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -1128,7 +1128,6 @@ struct acpi_memory_list { u16 object_size; u16 max_depth; u16 current_depth; - u16 link_offset; #ifdef ACPI_DBG_TRACK_ALLOCATIONS |