The patch titled
     ocfs2: release page lock before calling ->page_mkwrite
has been added to the -mm tree.  Its filename is
     ocfs2-release-page-lock-before-calling-page_mkwrite.patch

*** Remember to use Documentation/SubmitChecklist when testing your code ***

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: ocfs2: release page lock before calling ->page_mkwrite
From: Mark Fasheh <[EMAIL PROTECTED]>

__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: Mark Fasheh <[EMAIL PROTECTED]>
Cc: Nick Piggin <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 mm/memory.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff -puN mm/memory.c~ocfs2-release-page-lock-before-calling-page_mkwrite 
mm/memory.c
--- a/mm/memory.c~ocfs2-release-page-lock-before-calling-page_mkwrite
+++ a/mm/memory.c
@@ -2377,11 +2377,14 @@ static int __do_fault(struct mm_struct *
                         * address space wants to know that the page is about
                         * to become writable
                         */
-                       if (vma->vm_ops->page_mkwrite &&
-                           vma->vm_ops->page_mkwrite(vma, page) < 0) {
-                               fdata.type = VM_FAULT_SIGBUS;
-                               anon = 1; /* no anon but release faulted_page */
-                               goto out;
+                       if (vma->vm_ops->page_mkwrite) {
+                               unlock_page(page);
+                               if (vma->vm_ops->page_mkwrite(vma, page) < 0) {
+                                       fdata.type = VM_FAULT_SIGBUS;
+                                       anon = 1; /* no anon but release 
faulted_page */
+                                       goto out_unlocked;
+                               }
+                               lock_page(page);
                        }
                }
 
@@ -2433,6 +2436,7 @@ static int __do_fault(struct mm_struct *
 
 out:
        unlock_page(faulted_page);
+out_unlocked:
        if (anon)
                page_cache_release(faulted_page);
        else if (dirty_page) {
_

Patches currently in -mm which might be from [EMAIL PROTECTED] are

ocfs2-release-page-lock-before-calling-page_mkwrite.patch
fs-introduce-write_begin-write_end-and-perform_write-aops.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to