+10
-38
fs/ext4/file.c
+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
}