X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=mm%2Fhugetlb.c;h=85855240933d7cf195ce1548faa75d8120c21478;hb=909ea96468096b07fbb41aaf69be060d92bd9271;hp=96991ded82fe90f46d564e97da0544889a575bf7;hpb=f1ebdd60cc73ed36fd977f7e719ce70d2f5cd1c0;p=~andy%2Flinux diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 96991ded82f..85855240933 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -2448,8 +2448,11 @@ retry_avoidcopy: * When the original hugepage is shared one, it does not have * anon_vma prepared. */ - if (unlikely(anon_vma_prepare(vma))) + if (unlikely(anon_vma_prepare(vma))) { + /* Caller expects lock to be held */ + spin_lock(&mm->page_table_lock); return VM_FAULT_OOM; + } copy_user_huge_page(new_page, old_page, address, vma); __SetPageUptodate(new_page); @@ -2735,7 +2738,8 @@ out_page_table_lock: unlock_page(pagecache_page); put_page(pagecache_page); } - unlock_page(page); + if (page != pagecache_page) + unlock_page(page); out_mutex: mutex_unlock(&hugetlb_instantiation_mutex);