]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/ext4/inode.c
ext4: Take page lock before looking at attached buffer_heads flags
[mv-sheeva.git] / fs / ext4 / inode.c
index 17802a96af9f70e8214c89378bf748d3ebcd13a5..5c0d17066f4a6571021b073cbb1f03608f944f1a 100644 (file)
@@ -5286,12 +5286,21 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        else
                len = PAGE_CACHE_SIZE;
 
+       lock_page(page);
+       /*
+        * return if we have all the buffers mapped. This avoid
+        * the need to call write_begin/write_end which does a
+        * journal_start/journal_stop which can block and take
+        * long time
+        */
        if (page_has_buffers(page)) {
-               /* return if we have all the buffers mapped */
                if (!walk_page_buffers(NULL, page_buffers(page), 0, len, NULL,
-                                      ext4_bh_unmapped))
+                                       ext4_bh_unmapped)) {
+                       unlock_page(page);
                        goto out_unlock;
+               }
        }
+       unlock_page(page);
        /*
         * OK, we need to fill the hole... Do write_begin write_end
         * to do block allocation/reservation.We are not holding