diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index c03273807182..2697806746d0 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2380,8 +2380,11 @@ retry_avoidcopy: | |||
2380 | * When the original hugepage is shared one, it does not have | 2380 | * When the original hugepage is shared one, it does not have |
2381 | * anon_vma prepared. | 2381 | * anon_vma prepared. |
2382 | */ | 2382 | */ |
2383 | if (unlikely(anon_vma_prepare(vma))) | 2383 | if (unlikely(anon_vma_prepare(vma))) { |
2384 | /* Caller expects lock to be held */ | ||
2385 | spin_lock(&mm->page_table_lock); | ||
2384 | return VM_FAULT_OOM; | 2386 | return VM_FAULT_OOM; |
2387 | } | ||
2385 | 2388 | ||
2386 | copy_huge_page(new_page, old_page, address, vma); | 2389 | copy_huge_page(new_page, old_page, address, vma); |
2387 | __SetPageUptodate(new_page); | 2390 | __SetPageUptodate(new_page); |
@@ -2665,7 +2668,8 @@ out_page_table_lock: | |||
2665 | unlock_page(pagecache_page); | 2668 | unlock_page(pagecache_page); |
2666 | put_page(pagecache_page); | 2669 | put_page(pagecache_page); |
2667 | } | 2670 | } |
2668 | unlock_page(page); | 2671 | if (page != pagecache_page) |
2672 | unlock_page(page); | ||
2669 | 2673 | ||
2670 | out_mutex: | 2674 | out_mutex: |
2671 | mutex_unlock(&hugetlb_instantiation_mutex); | 2675 | mutex_unlock(&hugetlb_instantiation_mutex); |