vserver 1.9.3
[linux-2.6.git] / mm / swapfile.c
index 89bc19e..50c3a77 100644 (file)
@@ -523,14 +523,24 @@ static unsigned long unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
 }
 
 /* vma->vm_mm->page_table_lock is held */
-static unsigned long unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
+static unsigned long unuse_vma(struct vm_area_struct * vma,
        swp_entry_t entry, struct page *page)
 {
-       unsigned long start = vma->vm_start, end = vma->vm_end;
+       pgd_t *pgdir;
+       unsigned long start, end;
        unsigned long foundaddr;
 
-       if (start >= end)
-               BUG();
+       if (page->mapping) {
+               start = page_address_in_vma(page, vma);
+               if (start == -EFAULT)
+                       return 0;
+               else
+                       end = start + PAGE_SIZE;
+       } else {
+               start = vma->vm_start;
+               end = vma->vm_end;
+       }
+       pgdir = pgd_offset(vma->vm_mm, start);
        do {
                foundaddr = unuse_pgd(vma, pgdir, start, end - start,
                                                entry, page);
@@ -562,9 +572,8 @@ static int unuse_process(struct mm_struct * mm,
        }
        spin_lock(&mm->page_table_lock);
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
-               if (!is_vm_hugetlb_page(vma)) {
-                       pgd_t * pgd = pgd_offset(mm, vma->vm_start);
-                       foundaddr = unuse_vma(vma, pgd, entry, page);
+               if (vma->anon_vma) {
+                       foundaddr = unuse_vma(vma, entry, page);
                        if (foundaddr)
                                break;
                }
@@ -1602,8 +1611,8 @@ void si_swapinfo(struct sysinfo *val)
        val->freeswap = nr_swap_pages + nr_to_be_unused;
        val->totalswap = total_swap_pages + nr_to_be_unused;
        swap_list_unlock();
-        if (vx_flags(VXF_VIRT_MEM, 0))
-                vx_vsi_swapinfo(val);
+       if (vx_flags(VXF_VIRT_MEM, 0))
+               vx_vsi_swapinfo(val);
 }
 
 /*