*/
 static void free_more_memory(void)
 {
-       struct zone **zones;
+       struct zonelist *zonelist;
        pg_data_t *pgdat;
 
        wakeup_pdflush(1024);
        yield();
 
        for_each_online_pgdat(pgdat) {
-               zones = pgdat->node_zonelists[gfp_zone(GFP_NOFS)].zones;
-               if (*zones)
-                       try_to_free_pages(zones, 0, GFP_NOFS);
+               zonelist = &pgdat->node_zonelists[gfp_zone(GFP_NOFS)];
+               if (zonelist->zones[0])
+                       try_to_free_pages(zonelist, 0, GFP_NOFS);
        }
 }
 
 
  * If a zone is deemed to be full of pinned pages then just give it a light
  * scan then give up on it.
  */
-static unsigned long shrink_zones(int priority, struct zone **zones,
+static unsigned long shrink_zones(int priority, struct zonelist *zonelist,
                                        struct scan_control *sc)
 {
        unsigned long nr_reclaimed = 0;
+       struct zone **zones = zonelist->zones;
        int i;
 
 
  * holds filesystem locks which prevent writeout this might not work, and the
  * allocation attempt will fail.
  */
-static unsigned long do_try_to_free_pages(struct zone **zones, gfp_t gfp_mask,
-                                         struct scan_control *sc)
+static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
+                                       gfp_t gfp_mask, struct scan_control *sc)
 {
        int priority;
        int ret = 0;
        unsigned long nr_reclaimed = 0;
        struct reclaim_state *reclaim_state = current->reclaim_state;
        unsigned long lru_pages = 0;
+       struct zone **zones = zonelist->zones;
        int i;
 
        if (scan_global_lru(sc))
                sc->nr_scanned = 0;
                if (!priority)
                        disable_swap_token();
-               nr_reclaimed += shrink_zones(priority, zones, sc);
+               nr_reclaimed += shrink_zones(priority, zonelist, sc);
                /*
                 * Don't shrink slabs when reclaiming memory from
                 * over limit cgroups
        return ret;
 }
 
-unsigned long try_to_free_pages(struct zone **zones, int order, gfp_t gfp_mask)
+unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
+                                                               gfp_t gfp_mask)
 {
        struct scan_control sc = {
                .gfp_mask = gfp_mask,
                .isolate_pages = isolate_pages_global,
        };
 
-       return do_try_to_free_pages(zones, gfp_mask, &sc);
+       return do_try_to_free_pages(zonelist, gfp_mask, &sc);
 }
 
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR
                .mem_cgroup = mem_cont,
                .isolate_pages = mem_cgroup_isolate_pages,
        };
-       struct zone **zones;
+       struct zonelist *zonelist;
        int target_zone = gfp_zone(GFP_HIGHUSER_MOVABLE);
 
-       zones = NODE_DATA(numa_node_id())->node_zonelists[target_zone].zones;
-       if (do_try_to_free_pages(zones, sc.gfp_mask, &sc))
+       zonelist = &NODE_DATA(numa_node_id())->node_zonelists[target_zone];
+       if (do_try_to_free_pages(zonelist, sc.gfp_mask, &sc))
                return 1;
        return 0;
 }