diff options
author | Jan Kara <jack@suse.cz> | 2012-06-12 10:20:44 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-31 01:45:52 -0400 |
commit | 2c22b337b5bbb497c41b348b2357b7070ed5ba88 (patch) | |
tree | 781ca4825fe6383254a8b8528b23115fd389c48e /fs/nilfs2/file.c | |
parent | fbf8fb76505a9e5bbb47e91d964105b6ea59b0ec (diff) |
nilfs2: Convert to new freezing mechanism
We change nilfs_page_mkwrite() to provide proper freeze protection for
writeable page faults (we must wait for frozen filesystem even if the
page is fully mapped).
We remove all vfs_check_frozen() checks since they are now handled by
the generic code.
CC: linux-nilfs@vger.kernel.org
CC: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/nilfs2/file.c')
-rw-r--r-- | fs/nilfs2/file.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index 62cebc8e1a1f..a4d56ac02e6c 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c | |||
@@ -69,16 +69,18 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
69 | struct page *page = vmf->page; | 69 | struct page *page = vmf->page; |
70 | struct inode *inode = vma->vm_file->f_dentry->d_inode; | 70 | struct inode *inode = vma->vm_file->f_dentry->d_inode; |
71 | struct nilfs_transaction_info ti; | 71 | struct nilfs_transaction_info ti; |
72 | int ret; | 72 | int ret = 0; |
73 | 73 | ||
74 | if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info))) | 74 | if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info))) |
75 | return VM_FAULT_SIGBUS; /* -ENOSPC */ | 75 | return VM_FAULT_SIGBUS; /* -ENOSPC */ |
76 | 76 | ||
77 | sb_start_pagefault(inode->i_sb); | ||
77 | lock_page(page); | 78 | lock_page(page); |
78 | if (page->mapping != inode->i_mapping || | 79 | if (page->mapping != inode->i_mapping || |
79 | page_offset(page) >= i_size_read(inode) || !PageUptodate(page)) { | 80 | page_offset(page) >= i_size_read(inode) || !PageUptodate(page)) { |
80 | unlock_page(page); | 81 | unlock_page(page); |
81 | return VM_FAULT_NOPAGE; /* make the VM retry the fault */ | 82 | ret = -EFAULT; /* make the VM retry the fault */ |
83 | goto out; | ||
82 | } | 84 | } |
83 | 85 | ||
84 | /* | 86 | /* |
@@ -112,19 +114,21 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
112 | ret = nilfs_transaction_begin(inode->i_sb, &ti, 1); | 114 | ret = nilfs_transaction_begin(inode->i_sb, &ti, 1); |
113 | /* never returns -ENOMEM, but may return -ENOSPC */ | 115 | /* never returns -ENOMEM, but may return -ENOSPC */ |
114 | if (unlikely(ret)) | 116 | if (unlikely(ret)) |
115 | return VM_FAULT_SIGBUS; | 117 | goto out; |
116 | 118 | ||
117 | ret = block_page_mkwrite(vma, vmf, nilfs_get_block); | 119 | ret = __block_page_mkwrite(vma, vmf, nilfs_get_block); |
118 | if (ret != VM_FAULT_LOCKED) { | 120 | if (ret) { |
119 | nilfs_transaction_abort(inode->i_sb); | 121 | nilfs_transaction_abort(inode->i_sb); |
120 | return ret; | 122 | goto out; |
121 | } | 123 | } |
122 | nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits)); | 124 | nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits)); |
123 | nilfs_transaction_commit(inode->i_sb); | 125 | nilfs_transaction_commit(inode->i_sb); |
124 | 126 | ||
125 | mapped: | 127 | mapped: |
126 | wait_on_page_writeback(page); | 128 | wait_on_page_writeback(page); |
127 | return VM_FAULT_LOCKED; | 129 | out: |
130 | sb_end_pagefault(inode->i_sb); | ||
131 | return block_page_mkwrite_return(ret); | ||
128 | } | 132 | } |
129 | 133 | ||
130 | static const struct vm_operations_struct nilfs_file_vm_ops = { | 134 | static const struct vm_operations_struct nilfs_file_vm_ops = { |