aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/hugetlbfs/inode.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index bbc333b01ca3..9c07d2d754c9 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -463,6 +463,7 @@ hugetlb_vmdelete_list(struct rb_root *root, pgoff_t start, pgoff_t end)
463 */ 463 */
464 vma_interval_tree_foreach(vma, root, start, end ? end : ULONG_MAX) { 464 vma_interval_tree_foreach(vma, root, start, end ? end : ULONG_MAX) {
465 unsigned long v_offset; 465 unsigned long v_offset;
466 unsigned long v_end;
466 467
467 /* 468 /*
468 * Can the expression below overflow on 32-bit arches? 469 * Can the expression below overflow on 32-bit arches?
@@ -475,15 +476,17 @@ hugetlb_vmdelete_list(struct rb_root *root, pgoff_t start, pgoff_t end)
475 else 476 else
476 v_offset = 0; 477 v_offset = 0;
477 478
478 if (end) { 479 if (!end)
479 end = ((end - start) << PAGE_SHIFT) + 480 v_end = vma->vm_end;
480 vma->vm_start + v_offset; 481 else {
481 if (end > vma->vm_end) 482 v_end = ((end - vma->vm_pgoff) << PAGE_SHIFT)
482 end = vma->vm_end; 483 + vma->vm_start;
483 } else 484 if (v_end > vma->vm_end)
484 end = vma->vm_end; 485 v_end = vma->vm_end;
486 }
485 487
486 unmap_hugepage_range(vma, vma->vm_start + v_offset, end, NULL); 488 unmap_hugepage_range(vma, vma->vm_start + v_offset, v_end,
489 NULL);
487 } 490 }
488} 491}
489 492