Added some debug printk's for shares_write problems that Steve is seeing
[linux-2.6.git] / mm / swapfile.c
index cf99236..89bc19e 100644 (file)
@@ -112,7 +112,7 @@ static inline int scan_swap_map(struct swap_info_struct *si)
  check_next_cluster:
        if (offset+SWAPFILE_CLUSTER-1 <= si->highest_bit)
        {
-               int nr;
+               unsigned long nr;
                for (nr = offset; nr < offset+SWAPFILE_CLUSTER; nr++)
                        if (si->swap_map[nr])
                        {
@@ -551,7 +551,15 @@ static int unuse_process(struct mm_struct * mm,
        /*
         * Go through process' page directory.
         */
-       down_read(&mm->mmap_sem);
+       if (!down_read_trylock(&mm->mmap_sem)) {
+               /*
+                * Our reference to the page stops try_to_unmap_one from
+                * unmapping its ptes, so swapoff can make progress.
+                */
+               unlock_page(page);
+               down_read(&mm->mmap_sem);
+               lock_page(page);
+       }
        spin_lock(&mm->page_table_lock);
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
                if (!is_vm_hugetlb_page(vma)) {