aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/file.c48
1 files changed, 10 insertions, 38 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index b5f184493c57..d663d3d7c81c 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -258,7 +258,6 @@ out:
258static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 258static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
259{ 259{
260 int result; 260 int result;
261 handle_t *handle = NULL;
262 struct inode *inode = file_inode(vma->vm_file); 261 struct inode *inode = file_inode(vma->vm_file);
263 struct super_block *sb = inode->i_sb; 262 struct super_block *sb = inode->i_sb;
264 bool write = vmf->flags & FAULT_FLAG_WRITE; 263 bool write = vmf->flags & FAULT_FLAG_WRITE;
@@ -266,24 +265,12 @@ static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
266 if (write) { 265 if (write) {
267 sb_start_pagefault(sb); 266 sb_start_pagefault(sb);
268 file_update_time(vma->vm_file); 267 file_update_time(vma->vm_file);
269 down_read(&EXT4_I(inode)->i_mmap_sem); 268 }
270 handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE, 269 down_read(&EXT4_I(inode)->i_mmap_sem);
271 EXT4_DATA_TRANS_BLOCKS(sb)); 270 result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops);
272 } else 271 up_read(&EXT4_I(inode)->i_mmap_sem);
273 down_read(&EXT4_I(inode)->i_mmap_sem); 272 if (write)
274
275 if (IS_ERR(handle))
276 result = VM_FAULT_SIGBUS;
277 else
278 result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops);
279
280 if (write) {
281 if (!IS_ERR(handle))
282 ext4_journal_stop(handle);
283 up_read(&EXT4_I(inode)->i_mmap_sem);
284 sb_end_pagefault(sb); 273 sb_end_pagefault(sb);
285 } else
286 up_read(&EXT4_I(inode)->i_mmap_sem);
287 274
288 return result; 275 return result;
289} 276}
@@ -292,7 +279,6 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
292 pmd_t *pmd, unsigned int flags) 279 pmd_t *pmd, unsigned int flags)
293{ 280{
294 int result; 281 int result;
295 handle_t *handle = NULL;
296 struct inode *inode = file_inode(vma->vm_file); 282 struct inode *inode = file_inode(vma->vm_file);
297 struct super_block *sb = inode->i_sb; 283 struct super_block *sb = inode->i_sb;
298 bool write = flags & FAULT_FLAG_WRITE; 284 bool write = flags & FAULT_FLAG_WRITE;
@@ -300,27 +286,13 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
300 if (write) { 286 if (write) {
301 sb_start_pagefault(sb); 287 sb_start_pagefault(sb);
302 file_update_time(vma->vm_file); 288 file_update_time(vma->vm_file);
303 down_read(&EXT4_I(inode)->i_mmap_sem);
304 handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE,
305 ext4_chunk_trans_blocks(inode,
306 PMD_SIZE / PAGE_SIZE));
307 } else
308 down_read(&EXT4_I(inode)->i_mmap_sem);
309
310 if (IS_ERR(handle))
311 result = VM_FAULT_SIGBUS;
312 else {
313 result = dax_iomap_pmd_fault(vma, addr, pmd, flags,
314 &ext4_iomap_ops);
315 } 289 }
316 290 down_read(&EXT4_I(inode)->i_mmap_sem);
317 if (write) { 291 result = dax_iomap_pmd_fault(vma, addr, pmd, flags,
318 if (!IS_ERR(handle)) 292 &ext4_iomap_ops);
319 ext4_journal_stop(handle); 293 up_read(&EXT4_I(inode)->i_mmap_sem);
320 up_read(&EXT4_I(inode)->i_mmap_sem); 294 if (write)
321 sb_end_pagefault(sb); 295 sb_end_pagefault(sb);
322 } else
323 up_read(&EXT4_I(inode)->i_mmap_sem);
324 296
325 return result; 297 return result;
326} 298}