diff options
| -rw-r--r-- | fs/ext4/file.c | 48 |
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: | |||
| 258 | static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 258 | static 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 | } |
