Add 'discard' request handling
[linux-2.6.git] / arch / sparc / mm / generic.c
index 20ccb957fb7795118b5f06b21d7c5649423e72b4..a289261da9fdb35e06d074de83c106e9a7ab6193 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: generic.c,v 1.14 2001/12/21 04:56:15 davem Exp $
+/*
  * generic.c: Generic Sparc mm routines that are not dependent upon
  *            MMU type but are Sparc specific.
  *
@@ -32,9 +32,7 @@ static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte, unsigne
        if (end > PMD_SIZE)
                end = PMD_SIZE;
        do {
-               pte_t oldpage = *pte;
-               pte_clear(mm, address, pte);
-               set_pte(pte, mk_pte_io(offset, prot, space));
+               set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space));
                address += PAGE_SIZE;
                offset += PAGE_SIZE;
                pte++;
@@ -63,7 +61,7 @@ static inline int io_remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned
 }
 
 int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
-                       unsigned long pfn, unsigned long size, pgprot_t prot)
+                      unsigned long pfn, unsigned long size, pgprot_t prot)
 {
        int error = 0;
        pgd_t * dir;
@@ -73,14 +71,17 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
        int space = GET_IOSPACE(pfn);
        unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
 
-       prot = __pgprot(pg_iobits);
+       /* See comment in mm/memory.c remap_pfn_range */
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
+       vma->vm_pgoff = (offset >> PAGE_SHIFT) |
+               ((unsigned long)space << 28UL);
+
        offset -= from;
        dir = pgd_offset(mm, from);
        flush_cache_range(vma, beg, end);
 
-       spin_lock(&mm->page_table_lock);
        while (from < end) {
-               pmd_t *pmd = pmd_alloc(current->mm, dir, from);
+               pmd_t *pmd = pmd_alloc(mm, dir, from);
                error = -ENOMEM;
                if (!pmd)
                        break;
@@ -90,7 +91,6 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
                from = (from + PGDIR_SIZE) & PGDIR_MASK;
                dir++;
        }
-       spin_unlock(&mm->page_table_lock);
 
        flush_tlb_range(vma, beg, end);
        return error;