fast_isolate_around(struct compact_control *cc, unsigned long pfn, unsigned long nr_isolated)
 {
        unsigned long start_pfn, end_pfn;
-       struct page *page = pfn_to_page(pfn);
+       struct page *page;
 
        /* Do not search around if there are enough pages already */
        if (cc->nr_freepages >= cc->nr_migratepages)
                return;
 
        /* Pageblock boundaries */
-       start_pfn = pageblock_start_pfn(pfn);
-       end_pfn = min(pageblock_end_pfn(pfn), zone_end_pfn(cc->zone)) - 1;
+       start_pfn = max(pageblock_start_pfn(pfn), cc->zone->zone_start_pfn);
+       end_pfn = min(pageblock_end_pfn(pfn), zone_end_pfn(cc->zone));
+
+       page = pageblock_pfn_to_page(start_pfn, end_pfn, cc->zone);
+       if (!page)
+               return;
 
        /* Scan before */
        if (start_pfn != pfn) {
                        pfn = page_to_pfn(freepage);
 
                        if (pfn >= highest)
-                               highest = pageblock_start_pfn(pfn);
+                               highest = max(pageblock_start_pfn(pfn),
+                                             cc->zone->zone_start_pfn);
 
                        if (pfn >= low_pfn) {
                                cc->fast_search_fail = 0;
                        } else {
                                if (cc->direct_compaction && pfn_valid(min_pfn)) {
                                        page = pageblock_pfn_to_page(min_pfn,
-                                               pageblock_end_pfn(min_pfn),
+                                               min(pageblock_end_pfn(min_pfn),
+                                                   zone_end_pfn(cc->zone)),
                                                cc->zone);
                                        cc->free_pfn = min_pfn;
                                }