ext4: Simplify DAX fault path

Now that dax_iomap_fault() calls ->iomap_begin() without entry lock, we
can use transaction starting in ext4_iomap_begin() and thus simplify
ext4_dax_fault(). It also provides us proper retries in case of ENOSPC.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>

authored by Jan Kara and committed by Dan Williams 1db17542 9f141d6e

Changed files
+10 -38
fs
ext4
+10 -38
fs/ext4/file.c
··· 258 258 static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 259 259 { 260 260 int result; 261 - handle_t *handle = NULL; 262 261 struct inode *inode = file_inode(vma->vm_file); 263 262 struct super_block *sb = inode->i_sb; 264 263 bool write = vmf->flags & FAULT_FLAG_WRITE; ··· 265 266 if (write) { 266 267 sb_start_pagefault(sb); 267 268 file_update_time(vma->vm_file); 268 - down_read(&EXT4_I(inode)->i_mmap_sem); 269 - handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE, 270 - EXT4_DATA_TRANS_BLOCKS(sb)); 271 - } else 272 - down_read(&EXT4_I(inode)->i_mmap_sem); 273 - 274 - if (IS_ERR(handle)) 275 - result = VM_FAULT_SIGBUS; 276 - else 277 - result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops); 278 - 279 - if (write) { 280 - if (!IS_ERR(handle)) 281 - ext4_journal_stop(handle); 282 - up_read(&EXT4_I(inode)->i_mmap_sem); 269 + } 270 + down_read(&EXT4_I(inode)->i_mmap_sem); 271 + result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops); 272 + up_read(&EXT4_I(inode)->i_mmap_sem); 273 + if (write) 283 274 sb_end_pagefault(sb); 284 - } else 285 - up_read(&EXT4_I(inode)->i_mmap_sem); 286 275 287 276 return result; 288 277 } ··· 279 292 pmd_t *pmd, unsigned int flags) 280 293 { 281 294 int result; 282 - handle_t *handle = NULL; 283 295 struct inode *inode = file_inode(vma->vm_file); 284 296 struct super_block *sb = inode->i_sb; 285 297 bool write = flags & FAULT_FLAG_WRITE; ··· 286 300 if (write) { 287 301 sb_start_pagefault(sb); 288 302 file_update_time(vma->vm_file); 289 - down_read(&EXT4_I(inode)->i_mmap_sem); 290 - handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE, 291 - ext4_chunk_trans_blocks(inode, 292 - PMD_SIZE / PAGE_SIZE)); 293 - } else 294 - down_read(&EXT4_I(inode)->i_mmap_sem); 295 - 296 - if (IS_ERR(handle)) 297 - result = VM_FAULT_SIGBUS; 298 - else { 299 - result = dax_iomap_pmd_fault(vma, addr, pmd, flags, 300 - &ext4_iomap_ops); 301 303 } 302 - 303 - if (write) { 304 - if (!IS_ERR(handle)) 305 - ext4_journal_stop(handle); 306 - up_read(&EXT4_I(inode)->i_mmap_sem); 304 + down_read(&EXT4_I(inode)->i_mmap_sem); 305 + result = dax_iomap_pmd_fault(vma, addr, pmd, flags, 306 + &ext4_iomap_ops); 307 + up_read(&EXT4_I(inode)->i_mmap_sem); 308 + if (write) 307 309 sb_end_pagefault(sb); 308 - } else 309 - up_read(&EXT4_I(inode)->i_mmap_sem); 310 310 311 311 return result; 312 312 }