(map_ops[i].host_addr & ~PAGE_MASK));
                        mfn = pte_mfn(*pte);
                } else {
-                       /* If you really wanted to do this:
-                        * mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
-                        *
-                        * The reason we do not implement it is b/c on the
-                        * unmap path (gnttab_unmap_refs) we have no means of
-                        * checking whether the page is !GNTMAP_contains_pte.
-                        *
-                        * That is without some extra data-structure to carry
-                        * the struct page, bool clear_pte, and list_head next
-                        * tuples and deal with allocation/delallocation, etc.
-                        *
-                        * The users of this API set the GNTMAP_contains_pte
-                        * flag so lets just return not supported until it
-                        * becomes neccessary to implement.
-                        */
-                       return -EOPNOTSUPP;
+                       mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
                }
-               ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]);
+               ret = m2p_add_override(mfn, pages[i], kmap_ops ?
+                                      &kmap_ops[i] : NULL);
                if (ret)
                        return ret;
        }
 EXPORT_SYMBOL_GPL(gnttab_map_refs);
 
 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
-                     struct page **pages, unsigned int count)
+                     struct page **pages, unsigned int count, bool clear_pte)
 {
        int i, ret;
 
                return ret;
 
        for (i = 0; i < count; i++) {
-               ret = m2p_remove_override(pages[i], true /* clear the PTE */);
+               ret = m2p_remove_override(pages[i], clear_pte);
                if (ret)
                        return ret;
        }
 
                    struct gnttab_map_grant_ref *kmap_ops,
                    struct page **pages, unsigned int count);
 int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
-                     struct page **pages, unsigned int count);
+                     struct page **pages, unsigned int count, bool clear_pte);
 
 #endif /* __ASM_GNTTAB_H__ */