int psize, int apsize,
                                       int ssize);
        long            (*hpte_remove)(unsigned long hpte_group);
-       void            (*hpte_removebolted)(unsigned long ea,
+       int             (*hpte_removebolted)(unsigned long ea,
                                             int psize, int ssize);
        void            (*flush_hash_range)(unsigned long number, int local);
        void            (*hugepage_invalidate)(unsigned long vsid,
 
 {
        unsigned long vaddr;
        unsigned int step, shift;
+       int rc;
+       int ret = 0;
 
        shift = mmu_psize_defs[psize].shift;
        step = 1 << shift;
        if (!ppc_md.hpte_removebolted)
                return -ENODEV;
 
-       for (vaddr = vstart; vaddr < vend; vaddr += step)
-               ppc_md.hpte_removebolted(vaddr, psize, ssize);
+       for (vaddr = vstart; vaddr < vend; vaddr += step) {
+               rc = ppc_md.hpte_removebolted(vaddr, psize, ssize);
+               if (rc == -ENOENT) {
+                       ret = -ENOENT;
+                       continue;
+               }
+               if (rc < 0)
+                       return rc;
+       }
 
-       return 0;
+       return ret;
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
 
 static void vmemmap_remove_mapping(unsigned long start,
                                   unsigned long page_size)
 {
-       int mapped = htab_remove_mapping(start, start + page_size,
-                                        mmu_vmemmap_psize,
-                                        mmu_kernel_ssize);
-       BUG_ON(mapped < 0);
+       int rc = htab_remove_mapping(start, start + page_size,
+                                    mmu_vmemmap_psize,
+                                    mmu_kernel_ssize);
+       BUG_ON((rc < 0) && (rc != -ENOENT));
+       WARN_ON(rc == -ENOENT);
 }
 #endif
 
 
 }
 #endif
 
-static void pSeries_lpar_hpte_removebolted(unsigned long ea,
-                                          int psize, int ssize)
+static int pSeries_lpar_hpte_removebolted(unsigned long ea,
+                                         int psize, int ssize)
 {
        unsigned long vpn;
        unsigned long slot, vsid;
        vpn = hpt_vpn(ea, vsid, ssize);
 
        slot = pSeries_lpar_hpte_find(vpn, psize, ssize);
-       BUG_ON(slot == -1);
+       if (slot == -1)
+               return -ENOENT;
+
        /*
         * lpar doesn't use the passed actual page size
         */
        pSeries_lpar_hpte_invalidate(slot, vpn, psize, 0, ssize, 0);
+       return 0;
 }
 
 /*