Commit 69676147 authored by Mark Fasheh's avatar Mark Fasheh Committed by Linus Torvalds

ocfs2: release page lock before calling ->page_mkwrite

__do_fault() was calling ->page_mkwrite() with the page lock held, which
violates the locking rules for that callback.  Release and retake the page
lock around the callback to avoid deadlocking file systems which manually
take it.
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 54cb8821
...@@ -2369,11 +2369,14 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2369,11 +2369,14 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma,
* address space wants to know that the page is about * address space wants to know that the page is about
* to become writable * to become writable
*/ */
if (vma->vm_ops->page_mkwrite && if (vma->vm_ops->page_mkwrite) {
vma->vm_ops->page_mkwrite(vma, page) < 0) { unlock_page(page);
if (vma->vm_ops->page_mkwrite(vma, page) < 0) {
fdata.type = VM_FAULT_SIGBUS; fdata.type = VM_FAULT_SIGBUS;
anon = 1; /* no anon but release faulted_page */ anon = 1; /* no anon but release faulted_page */
goto out; goto out_unlocked;
}
lock_page(page);
} }
} }
...@@ -2425,6 +2428,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2425,6 +2428,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma,
out: out:
unlock_page(faulted_page); unlock_page(faulted_page);
out_unlocked:
if (anon) if (anon)
page_cache_release(faulted_page); page_cache_release(faulted_page);
else if (dirty_page) { else if (dirty_page) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment