mm: add a field to store names for private anonymous memory
[sfrench/cifs-2.6.git] / fs / userfaultfd.c
index 003f0d31743eb3cd95de8c8da21a4d0d731daf73..5b2af7b8277633db409dde2213d36bb50afa199e 100644 (file)
@@ -877,7 +877,7 @@ static int userfaultfd_release(struct inode *inode, struct file *file)
                                 new_flags, vma->anon_vma,
                                 vma->vm_file, vma->vm_pgoff,
                                 vma_policy(vma),
-                                NULL_VM_UFFD_CTX);
+                                NULL_VM_UFFD_CTX, vma_anon_name(vma));
                if (prev)
                        vma = prev;
                else
@@ -1436,7 +1436,8 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx,
                prev = vma_merge(mm, prev, start, vma_end, new_flags,
                                 vma->anon_vma, vma->vm_file, vma->vm_pgoff,
                                 vma_policy(vma),
-                                ((struct vm_userfaultfd_ctx){ ctx }));
+                                ((struct vm_userfaultfd_ctx){ ctx }),
+                                vma_anon_name(vma));
                if (prev) {
                        vma = prev;
                        goto next;
@@ -1613,7 +1614,7 @@ static int userfaultfd_unregister(struct userfaultfd_ctx *ctx,
                prev = vma_merge(mm, prev, start, vma_end, new_flags,
                                 vma->anon_vma, vma->vm_file, vma->vm_pgoff,
                                 vma_policy(vma),
-                                NULL_VM_UFFD_CTX);
+                                NULL_VM_UFFD_CTX, vma_anon_name(vma));
                if (prev) {
                        vma = prev;
                        goto next;
@@ -1827,9 +1828,15 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx,
        if (mode_wp && mode_dontwake)
                return -EINVAL;
 
-       ret = mwriteprotect_range(ctx->mm, uffdio_wp.range.start,
-                                 uffdio_wp.range.len, mode_wp,
-                                 &ctx->mmap_changing);
+       if (mmget_not_zero(ctx->mm)) {
+               ret = mwriteprotect_range(ctx->mm, uffdio_wp.range.start,
+                                         uffdio_wp.range.len, mode_wp,
+                                         &ctx->mmap_changing);
+               mmput(ctx->mm);
+       } else {
+               return -ESRCH;
+       }
+
        if (ret)
                return ret;