]> err.no Git - linux-2.6/blobdiff - mm/memory.c
ocfs2: release page lock before calling ->page_mkwrite
[linux-2.6] / mm / memory.c
index eee7fec3ab549448f7b0741234d66ff0aac00b45..7abd3899848bf9ff4f032fda6a48ad86e1f92d18 100644 (file)
@@ -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
                         * 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);
                        }
                }
 
@@ -2425,6 +2428,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma,
 
 out:
        unlock_page(faulted_page);
+out_unlocked:
        if (anon)
                page_cache_release(faulted_page);
        else if (dirty_page) {