Skip to content

Commit 1db1754

Browse files
jankaradjbw
authored andcommitted
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 <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent 9f141d6 commit 1db1754

File tree

1 file changed

+10
-38
lines changed

1 file changed

+10
-38
lines changed

fs/ext4/file.c

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -258,32 +258,19 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
258258
static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
259259
{
260260
int result;
261-
handle_t *handle = NULL;
262261
struct inode *inode = file_inode(vma->vm_file);
263262
struct super_block *sb = inode->i_sb;
264263
bool write = vmf->flags & FAULT_FLAG_WRITE;
265264

266265
if (write) {
267266
sb_start_pagefault(sb);
268267
file_update_time(vma->vm_file);
269-
down_read(&EXT4_I(inode)->i_mmap_sem);
270-
handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE,
271-
EXT4_DATA_TRANS_BLOCKS(sb));
272-
} else
273-
down_read(&EXT4_I(inode)->i_mmap_sem);
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);
268+
}
269+
down_read(&EXT4_I(inode)->i_mmap_sem);
270+
result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops);
271+
up_read(&EXT4_I(inode)->i_mmap_sem);
272+
if (write)
284273
sb_end_pagefault(sb);
285-
} else
286-
up_read(&EXT4_I(inode)->i_mmap_sem);
287274

288275
return result;
289276
}
@@ -292,35 +279,20 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
292279
pmd_t *pmd, unsigned int flags)
293280
{
294281
int result;
295-
handle_t *handle = NULL;
296282
struct inode *inode = file_inode(vma->vm_file);
297283
struct super_block *sb = inode->i_sb;
298284
bool write = flags & FAULT_FLAG_WRITE;
299285

300286
if (write) {
301287
sb_start_pagefault(sb);
302288
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);
315289
}
316-
317-
if (write) {
318-
if (!IS_ERR(handle))
319-
ext4_journal_stop(handle);
320-
up_read(&EXT4_I(inode)->i_mmap_sem);
290+
down_read(&EXT4_I(inode)->i_mmap_sem);
291+
result = dax_iomap_pmd_fault(vma, addr, pmd, flags,
292+
&ext4_iomap_ops);
293+
up_read(&EXT4_I(inode)->i_mmap_sem);
294+
if (write)
321295
sb_end_pagefault(sb);
322-
} else
323-
up_read(&EXT4_I(inode)->i_mmap_sem);
324296

325297
return result;
326298
}

0 commit comments

Comments
 (0)