]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/mempolicy.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / mm / mempolicy.c
index b19569137529221163e6b51bd96e3a161805a97f..88f9422b92e73afc2be25161f20a7957d4a54160 100644 (file)
@@ -607,27 +607,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
        return first;
 }
 
-/* Apply policy to a single VMA */
-static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new)
-{
-       int err = 0;
-       struct mempolicy *old = vma->vm_policy;
-
-       pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
-                vma->vm_start, vma->vm_end, vma->vm_pgoff,
-                vma->vm_ops, vma->vm_file,
-                vma->vm_ops ? vma->vm_ops->set_policy : NULL);
-
-       if (vma->vm_ops && vma->vm_ops->set_policy)
-               err = vma->vm_ops->set_policy(vma, new);
-       if (!err) {
-               mpol_get(new);
-               vma->vm_policy = new;
-               mpol_put(old);
-       }
-       return err;
-}
-
 /* Step 2: apply policy to a range and do splits. */
 static int mbind_range(struct mm_struct *mm, unsigned long start,
                       unsigned long end, struct mempolicy *new_pol)
@@ -676,9 +655,23 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
                        if (err)
                                goto out;
                }
-               err = policy_vma(vma, new_pol);
-               if (err)
-                       goto out;
+
+               /*
+                * Apply policy to a single VMA. The reference counting of
+                * policy for vma_policy linkages has already been handled by
+                * vma_merge and split_vma as necessary. If this is a shared
+                * policy then ->set_policy will increment the reference count
+                * for an sp node.
+                */
+               pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
+                       vma->vm_start, vma->vm_end, vma->vm_pgoff,
+                       vma->vm_ops, vma->vm_file,
+                       vma->vm_ops ? vma->vm_ops->set_policy : NULL);
+               if (vma->vm_ops && vma->vm_ops->set_policy) {
+                       err = vma->vm_ops->set_policy(vma, new_pol);
+                       if (err)
+                               goto out;
+               }
        }
 
  out:
@@ -1334,8 +1327,8 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
         * userid as the target process.
         */
        tcred = __task_cred(task);
-       if (cred->euid != tcred->suid && cred->euid != tcred->uid &&
-           cred->uid  != tcred->suid && cred->uid  != tcred->uid &&
+       if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
+           !uid_eq(cred->uid,  tcred->suid) && !uid_eq(cred->uid,  tcred->uid) &&
            !capable(CAP_SYS_NICE)) {
                rcu_read_unlock();
                err = -EPERM;