]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/mremap: Replace can_modify_mm with can_modify_vma
authorPedro Falcato <pedro.falcato@gmail.com>
Sat, 17 Aug 2024 00:18:31 +0000 (01:18 +0100)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Mon, 19 Aug 2024 20:11:54 +0000 (16:11 -0400)
Delegate all can_modify checks to the proper places. Unmap checks are
done in do_unmap (et al). The source VMA check is done purposefully
before unmapping, to keep the original mseal semantics.

Signed-off-by: Pedro Falcato <pedro.falcato@gmail.com>
mm/mremap.c

index e7ae140fc6409bff946cf1c0e7f77b74d02f5ec7..24712f8dbb6b5c6564f85ccc5316be3904ba4c80 100644 (file)
@@ -902,19 +902,6 @@ static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
        if ((mm->map_count + 2) >= sysctl_max_map_count - 3)
                return -ENOMEM;
 
-       /*
-        * In mremap_to().
-        * Move a VMA to another location, check if src addr is sealed.
-        *
-        * Place can_modify_mm here because mremap_to()
-        * does its own checking for address range, and we only
-        * check the sealing after passing those checks.
-        *
-        * can_modify_mm assumes we have acquired the lock on MM.
-        */
-       if (unlikely(!can_modify_mm(mm, addr, addr + old_len)))
-               return -EPERM;
-
        if (flags & MREMAP_FIXED) {
                /*
                 * In mremap_to().
@@ -1052,6 +1039,12 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
                goto out;
        }
 
+       /* Don't allow remapping vmas when they have already been sealed */
+       if (!can_modify_vma(vma)) {
+               ret = -EPERM;
+               goto out;
+       }
+
        if (is_vm_hugetlb_page(vma)) {
                struct hstate *h __maybe_unused = hstate_vma(vma);
 
@@ -1079,19 +1072,6 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
                goto out;
        }
 
-       /*
-        * Below is shrink/expand case (not mremap_to())
-        * Check if src address is sealed, if so, reject.
-        * In other words, prevent shrinking or expanding a sealed VMA.
-        *
-        * Place can_modify_mm here so we can keep the logic related to
-        * shrink/expand together.
-        */
-       if (unlikely(!can_modify_mm(mm, addr, addr + old_len))) {
-               ret = -EPERM;
-               goto out;
-       }
-
        /*
         * Always allow a shrinking remap: that just unmaps
         * the unnecessary pages..