summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2013-03-08 09:21:02 +0000
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-03-12 00:45:04 +0100
commit3cf24497f45d61ed3c3290b5b03f3baeb8401f04 (patch)
tree32e5886ac23ccfd419694b33f83f518a9df45770
parent98b5c9934ccdf6c04413e0d03c1ddeb32592d8c6 (diff)
downloadlinux-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.c20
-rw-r--r--include/acpi/actypes.h1
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