Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[firefly-linux-kernel-4.4.55.git] / fs / nilfs2 / file.c
index 93589fccdd9744c59d6783931eca235b727d5432..397e73258631aaf546ae34a80bbd2a07b0da548b 100644 (file)
@@ -72,10 +72,9 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        /*
         * check to see if the page is mapped already (no holes)
         */
-       if (PageMappedToDisk(page)) {
-               unlock_page(page);
+       if (PageMappedToDisk(page))
                goto mapped;
-       }
+
        if (page_has_buffers(page)) {
                struct buffer_head *bh, *head;
                int fully_mapped = 1;
@@ -90,7 +89,6 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
 
                if (fully_mapped) {
                        SetPageMappedToDisk(page);
-                       unlock_page(page);
                        goto mapped;
                }
        }
@@ -105,16 +103,17 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
                return VM_FAULT_SIGBUS;
 
        ret = block_page_mkwrite(vma, vmf, nilfs_get_block);
-       if (unlikely(ret)) {
+       if (ret != VM_FAULT_LOCKED) {
                nilfs_transaction_abort(inode->i_sb);
                return ret;
        }
+       nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits));
        nilfs_transaction_commit(inode->i_sb);
 
  mapped:
        SetPageChecked(page);
        wait_on_page_writeback(page);
-       return 0;
+       return VM_FAULT_LOCKED;
 }
 
 static const struct vm_operations_struct nilfs_file_vm_ops = {