ACPICA: Fix a long-standing bug in local cache
authorJung-uk Kim <jkim@FreeBSD.org>
Fri, 8 Mar 2013 09:21:02 +0000 (09:21 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 11 Mar 2013 23:45:04 +0000 (00:45 +0100)
 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>
drivers/acpi/acpica/utcache.c
include/acpi/actypes.h

index e0e8579deaacf19a0cc35997191bd79a0ea479c1..2de22fbacf4b5b99da87a91e78d2a65e5b83784e 100644 (file)
@@ -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--;
 
index 845e75f1ffd89eabcb06fb7f0431f3bc21495145..3fac1be2d8b469036ee26dc9f718cdea29120f36 100644 (file)
@@ -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