Commit f7616782 authored by Zhang Yi's avatar Zhang Yi
Browse files

ext4: implement mmap iomap path

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9DN5Z


CVE: NA

--------------------------------

Add ext4_iomap_page_mkwrite() for the mmap iomap path. It dirty folio
and map blocks, almost all work have been done in iomap_page_mkwrite(),
so call it directly.

Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
parent 7f6416dc
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -6514,6 +6514,26 @@ static int ext4_bh_unmapped(handle_t *handle, struct inode *inode,
	return !buffer_mapped(bh);
}

static vm_fault_t ext4_iomap_page_mkwrite(struct vm_fault *vmf)
{
	struct inode *inode = file_inode(vmf->vma->vm_file);
	const struct iomap_ops *iomap_ops;

	/*
	 * ext4_nonda_switch() could writeback this folio, so have to
	 * call it before lock folio.
	 *
	 * TODO: drop ext4_nonda_switch() after reserving enough sapce
	 * for metadata and merge delalloc and nodelalloc operations.
	 */
	if (test_opt(inode->i_sb, DELALLOC) && !ext4_nonda_switch(inode->i_sb))
		iomap_ops = &ext4_iomap_buffered_da_write_ops;
	else
		iomap_ops = &ext4_iomap_buffered_write_ops;

	return iomap_page_mkwrite(vmf, iomap_ops);
}

vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
{
	struct vm_area_struct *vma = vmf->vma;
@@ -6537,6 +6557,11 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)

	filemap_invalidate_lock_shared(mapping);

	if (ext4_test_inode_state(inode, EXT4_STATE_BUFFERED_IOMAP)) {
		ret = ext4_iomap_page_mkwrite(vmf);
		goto out;
	}

	err = ext4_convert_inline_data(inode);
	if (err)
		goto out_ret;