[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected. No action required from the submitter.
The upstream commit SHA1 provided is correct: e8e17ee90eaf650c855adb0a3e5e965fd6692ff1
WARNING: Author mismatch between patch and upstream commit: Backport author: Isaac J. Manjarres isaacmanjarres@google.com Commit author: Lorenzo Stoakes lstoakes@gmail.com
Status in newer kernel trees: 6.15.y | Present (exact SHA1) 6.12.y | Present (exact SHA1) 6.6.y | Not found 6.1.y | Not found
Note: The patch differs from the upstream commit: --- 1: e8e17ee90eaf ! 1: 9f7ea48b09ac mm: drop the assumption that VM_SHARED always implies writable @@ Metadata ## Commit message ## mm: drop the assumption that VM_SHARED always implies writable
+ [ Upstream commit e8e17ee90eaf650c855adb0a3e5e965fd6692ff1 ] + Patch series "permit write-sealed memfd read-only shared mappings", v4.
The man page for fcntl() describing memfd file seals states the following @@ Commit message [1]:https://lore.kernel.org/all/20230324133646.16101dfa666f253c4715d965@linux-fo... [2]:https://bugzilla.kernel.org/show_bug.cgi?id=217238
- This patch (of 3):
There is a general assumption that VMAs with the VM_SHARED flag set are @@ Commit message Cc: Mike Kravetz mike.kravetz@oracle.com Cc: Muchun Song muchun.song@linux.dev Signed-off-by: Andrew Morton akpm@linux-foundation.org + Cc: stable@vger.kernel.org + [isaacmanjarres: resolved merge conflicts due to + due to refactoring that happened in upstream commit + 5de195060b2e ("mm: resolve faulty mmap_region() error path behaviour")] + Signed-off-by: Isaac J. Manjarres isaacmanjarres@google.com
## include/linux/fs.h ## -@@ include/linux/fs.h: extern const struct address_space_operations empty_aops; +@@ include/linux/fs.h: int pagecache_write_end(struct file *, struct address_space *mapping, * It is also used to block modification of page cache contents through * memory mappings. * @gfp_mask: Memory allocation flags to use for allocating pages. @@ include/linux/mm.h: static inline bool vma_is_accessible(struct vm_area_struct * + return is_shared_maywrite(vma->vm_flags); +} + - static inline - struct vm_area_struct *vma_find(struct vma_iterator *vmi, unsigned long max) - { + #ifdef CONFIG_SHMEM + /* + * The vma_is_shmem is not inline because it is used only by slow
## kernel/fork.c ## @@ kernel/fork.c: static __latent_entropy int dup_mmap(struct mm_struct *mm, @@ mm/mmap.c: void vma_set_page_prot(struct vm_area_struct *vma) mapping_unmap_writable(mapping);
flush_dcache_mmap_lock(mapping); -@@ mm/mmap.c: static unsigned long count_vma_pages_range(struct mm_struct *mm, - static void __vma_link_file(struct vm_area_struct *vma, - struct address_space *mapping) - { -- if (vma->vm_flags & VM_SHARED) -+ if (vma_is_shared_maywrite(vma)) - mapping_allow_writable(mapping); - - flush_dcache_mmap_lock(mapping); -@@ mm/mmap.c: unsigned long mmap_region(struct file *file, unsigned long addr, - vma->vm_pgoff = pgoff; - +@@ mm/mmap.c: static void __vma_link_file(struct vm_area_struct *vma) if (file) { -- if (vm_flags & VM_SHARED) { -+ if (is_shared_maywrite(vm_flags)) { - error = mapping_map_writable(file->f_mapping); - if (error) - goto free_vma; -@@ mm/mmap.c: unsigned long mmap_region(struct file *file, unsigned long addr, - mm->map_count++; - if (vma->vm_file) { - i_mmap_lock_write(vma->vm_file->f_mapping); + struct address_space *mapping = file->f_mapping; + - if (vma->vm_flags & VM_SHARED) + if (vma_is_shared_maywrite(vma)) - mapping_allow_writable(vma->vm_file->f_mapping); + mapping_allow_writable(mapping);
- flush_dcache_mmap_lock(vma->vm_file->f_mapping); + flush_dcache_mmap_lock(mapping); @@ mm/mmap.c: unsigned long mmap_region(struct file *file, unsigned long addr, + return -EINVAL;
- /* Once vma denies write, undo our temporary denial count */ - unmap_writable: -- if (file && vm_flags & VM_SHARED) -+ if (file && is_shared_maywrite(vm_flags)) - mapping_unmap_writable(file->f_mapping); - file = vma->vm_file; - ksm_add_vma(vma); -@@ mm/mmap.c: unsigned long mmap_region(struct file *file, unsigned long addr, - unmap_region(mm, &vmi.mas, vma, prev, next, vma->vm_start, - vma->vm_end, vma->vm_end, true); - } -- if (file && (vm_flags & VM_SHARED)) -+ if (file && is_shared_maywrite(vm_flags)) - mapping_unmap_writable(file->f_mapping); - free_vma: - vm_area_free(vma); + /* Map writable and ensure this isn't a sealed memfd. */ +- if (file && (vm_flags & VM_SHARED)) { ++ if (file && is_shared_maywrite(vm_flags)) { + int error = mapping_map_writable(file->f_mapping); + + if (error)
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | 5.15 | Success | Success |