diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/hugetlbfs/inode.c | 19 |
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 | ||