|
@@ -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 = {
|