static int
 memory_block_action(unsigned long phys_index, unsigned long action)
 {
-       unsigned long start_pfn, start_paddr;
+       unsigned long start_pfn;
        unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;
        struct page *first_page;
        int ret;
 
        first_page = pfn_to_page(phys_index << PFN_SECTION_SHIFT);
+       start_pfn = page_to_pfn(first_page);
 
        switch (action) {
                case MEM_ONLINE:
-                       start_pfn = page_to_pfn(first_page);
-
                        if (!pages_correctly_reserved(start_pfn, nr_pages))
                                return -EBUSY;
 
                        ret = online_pages(start_pfn, nr_pages);
                        break;
                case MEM_OFFLINE:
-                       start_paddr = page_to_pfn(first_page) << PAGE_SHIFT;
-                       ret = remove_memory(start_paddr,
-                                           nr_pages << PAGE_SHIFT);
+                       ret = offline_pages(start_pfn, nr_pages);
                        break;
                default:
                        WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: "
 
 extern int mem_online_node(int nid);
 extern int add_memory(int nid, u64 start, u64 size);
 extern int arch_add_memory(int nid, u64 start, u64 size);
+extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
 extern int remove_memory(u64 start, u64 size);
 extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
                                                                int nr_pages);
 
        return offlined;
 }
 
-static int __ref offline_pages(unsigned long start_pfn,
+static int __ref __offline_pages(unsigned long start_pfn,
                  unsigned long end_pfn, unsigned long timeout)
 {
        unsigned long pfn, nr_pages, expire;
        return ret;
 }
 
+int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
+{
+       return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ);
+}
+
 int remove_memory(u64 start, u64 size)
 {
        unsigned long start_pfn, end_pfn;
 
        start_pfn = PFN_DOWN(start);
        end_pfn = start_pfn + PFN_DOWN(size);
-       return offline_pages(start_pfn, end_pfn, 120 * HZ);
+       return __offline_pages(start_pfn, end_pfn, 120 * HZ);
 }
 #else
+int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
+{
+       return -EINVAL;
+}
 int remove_memory(u64 start, u64 size)
 {
        return -EINVAL;