From 3771808d648b012d9cda6f04abd6624644ce5b8c Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Sun, 30 Oct 2022 02:45:01 +0000 Subject: [PATCH] FROMLIST: mm/mmap: move VMA locking before vma_adjust_trans_huge call vma_adjust_trans_huge() modifies the VMA and such modifications should be done after VMA is marked as being written. Therefore move VMA flag modifications before vma_adjust_trans_huge() so that VMA is marked before all these modifications. Signed-off-by: Suren Baghdasaryan Link: https://lore.kernel.org/all/20230216051750.3125598-15-surenb@google.com/ [surenb: using older v3 of patchset due to missing __vma_adjust() refactoring in 6.2-rc4 which introduced vma_prepare()] Bug: 161210518 Change-Id: I650162fd85fabee00a8a05ddb32318e654270cb1 Signed-off-by: Suren Baghdasaryan --- mm/mmap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/mmap.c b/mm/mmap.c index d4fc786b4927..3520c39304ba 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2987,13 +2987,14 @@ static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *vma, if (mas_preallocate(mas, vma, GFP_KERNEL)) return -ENOMEM; + /* Set flags first to implicitly lock the VMA before updates */ + vm_flags_set(vma, VM_SOFTDIRTY); vma_adjust_trans_huge(vma, vma->vm_start, addr + len, 0); if (vma->anon_vma) { anon_vma_lock_write(vma->anon_vma); anon_vma_interval_tree_pre_update_vma(vma); } vma->vm_end = addr + len; - vm_flags_set(vma, VM_SOFTDIRTY); mas_store_prealloc(mas, vma); if (vma->anon_vma) {