inotify: report both events on parent and child with single callback
[linux-2.6-microblaze.git] / mm / mremap.c
index 6aa6ea6..5dd572d 100644 (file)
@@ -146,7 +146,7 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd,
 
        /*
         * We don't have to worry about the ordering of src and dst
-        * pte locks because exclusive mmap_sem prevents deadlock.
+        * pte locks because exclusive mmap_lock prevents deadlock.
         */
        old_pte = pte_offset_map_lock(mm, old_pmd, old_addr, &old_ptl);
        new_pte = pte_offset_map(new_pmd, new_addr);
@@ -213,7 +213,7 @@ static bool move_normal_pmd(struct vm_area_struct *vma, unsigned long old_addr,
 
        /*
         * We don't have to worry about the ordering of src and dst
-        * ptlocks because exclusive mmap_sem prevents deadlock.
+        * ptlocks because exclusive mmap_lock prevents deadlock.
         */
        old_ptl = pmd_lock(vma->vm_mm, old_pmd);
        new_ptl = pmd_lockptr(mm, new_pmd);
@@ -266,7 +266,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
                new_pmd = alloc_new_pmd(vma->vm_mm, vma, new_addr);
                if (!new_pmd)
                        break;
-               if (is_swap_pmd(*old_pmd) || pmd_trans_huge(*old_pmd)) {
+               if (is_swap_pmd(*old_pmd) || pmd_trans_huge(*old_pmd) || pmd_devmap(*old_pmd)) {
                        if (extent == HPAGE_PMD_SIZE) {
                                bool moved;
                                /* See comment in move_ptes() */
@@ -696,7 +696,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
        if (!new_len)
                return ret;
 
-       if (down_write_killable(&current->mm->mmap_sem))
+       if (mmap_write_lock_killable(current->mm))
                return -EINTR;
 
        if (flags & (MREMAP_FIXED | MREMAP_DONTUNMAP)) {
@@ -710,7 +710,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
         * Always allow a shrinking remap: that just unmaps
         * the unnecessary pages..
         * __do_munmap does all the needed commit accounting, and
-        * downgrades mmap_sem to read if so directed.
+        * downgrades mmap_lock to read if so directed.
         */
        if (old_len >= new_len) {
                int retval;
@@ -720,7 +720,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
                if (retval < 0 && old_len != new_len) {
                        ret = retval;
                        goto out;
-               /* Returning 1 indicates mmap_sem is downgraded to read. */
+               /* Returning 1 indicates mmap_lock is downgraded to read. */
                } else if (retval == 1)
                        downgraded = true;
                ret = addr;
@@ -785,12 +785,12 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
 out:
        if (offset_in_page(ret)) {
                vm_unacct_memory(charged);
-               locked = 0;
+               locked = false;
        }
        if (downgraded)
-               up_read(&current->mm->mmap_sem);
+               mmap_read_unlock(current->mm);
        else
-               up_write(&current->mm->mmap_sem);
+               mmap_write_unlock(current->mm);
        if (locked && new_len > old_len)
                mm_populate(new_addr + old_len, new_len - old_len);
        userfaultfd_unmap_complete(mm, &uf_unmap_early);