patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / arch / ppc / mm / pgtable.c
index b1b93fc..04c1481 100644 (file)
@@ -86,9 +86,14 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
        extern int mem_init_done;
        extern void *early_get_page(void);
 
-       if (mem_init_done)
+       if (mem_init_done) {
                pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
-       else
+               if (pte) {
+                       struct page *ptepage = virt_to_page(pte);
+                       ptepage->mapping = (void *) mm;
+                       ptepage->index = address & PMD_MASK;
+               }
+       } else
                pte = (pte_t *)early_get_page();
        if (pte)
                clear_page(pte);
@@ -97,7 +102,7 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
 
 struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-       struct page *pte;
+       struct page *ptepage;
 
 #ifdef CONFIG_HIGHPTE
        int flags = GFP_KERNEL | __GFP_HIGHMEM | __GFP_REPEAT;
@@ -105,10 +110,13 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
        int flags = GFP_KERNEL | __GFP_REPEAT;
 #endif
 
-       pte = alloc_pages(flags, 0);
-       if (pte)
-               clear_highpage(pte);
-       return pte;
+       ptepage = alloc_pages(flags, 0);
+       if (ptepage) {
+               ptepage->mapping = (void *) mm;
+               ptepage->index = address & PMD_MASK;
+               clear_highpage(ptepage);
+       }
+       return ptepage;
 }
 
 void pte_free_kernel(pte_t *pte)
@@ -116,15 +124,17 @@ void pte_free_kernel(pte_t *pte)
 #ifdef CONFIG_SMP
        hash_page_sync();
 #endif
+       virt_to_page(pte)->mapping = NULL;
        free_page((unsigned long)pte);
 }
 
-void pte_free(struct page *pte)
+void pte_free(struct page *ptepage)
 {
 #ifdef CONFIG_SMP
        hash_page_sync();
 #endif
-       __free_page(pte);
+       ptepage->mapping = NULL;
+       __free_page(ptepage);
 }
 
 #ifndef CONFIG_44x