When obtaining resv_map from vma, it is necessary to simultaneously determine the flag HPAGE_RESV_OWNER of vm_private_data. Only when they are met simultaneously, resv_map is valid. Reported-and-tested-by: syzbot+6ada951e7c0f7bc8a71e@xxxxxxxxxxxxxxxxxxxxxxxxx Fixes: bf4916922c60 ("hugetlbfs: extend hugetlb_vma_lock to private VMAs") Signed-off-by: Edward Adam Davis <eadavis@xxxxxx> --- include/linux/hugetlb.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 47d25a5e1933..1a3ec1aee1a3 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -1265,9 +1265,11 @@ static inline bool __vma_shareable_lock(struct vm_area_struct *vma) return (vma->vm_flags & VM_MAYSHARE) && vma->vm_private_data; } +#define HPAGE_RESV_OWNER (1UL << 0) static inline bool __vma_private_lock(struct vm_area_struct *vma) { - return (!(vma->vm_flags & VM_MAYSHARE)) && vma->vm_private_data; + return (!(vma->vm_flags & VM_MAYSHARE)) && vma->vm_private_data && + ((unsigned long)vma->vm_private_data & HPAGE_RESV_OWNER); } /* -- 2.25.1