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

ext4: add mount option for buffered IO iomap path

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


CVE: NA

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

Add buffered_io_iomap mount option to enable buffered IO iomap path for
regular file, this option is disabled by default now.

Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
parent 7f5cd470
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1255,6 +1255,7 @@ struct ext4_inode_info {
						    * scanning in mballoc
						    */
#define EXT4_MOUNT2_ABORT		0x00000100 /* Abort filesystem */
#define EXT4_MOUNT2_BUFFERED_IOMAP	0x00000200 /* Use iomap for buffered IO */

#define clear_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt &= \
						~EXT4_MOUNT_##opt
+2 −0
Original line number Diff line number Diff line
@@ -5151,6 +5151,8 @@ bool ext4_should_use_buffered_iomap(struct inode *inode)
{
	struct super_block *sb = inode->i_sb;

	if (!test_opt2(sb, BUFFERED_IOMAP))
		return false;
	if (ext4_has_feature_inline_data(sb))
		return false;
	if (ext4_has_feature_verity(sb))
+15 −1
Original line number Diff line number Diff line
@@ -1738,7 +1738,7 @@ enum {
	Opt_dioread_nolock, Opt_dioread_lock,
	Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
	Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache,
	Opt_no_prefetch_block_bitmaps, Opt_mb_optimize_scan,
	Opt_no_prefetch_block_bitmaps, Opt_mb_optimize_scan, Opt_buffered_iomap,
	Opt_errors, Opt_data, Opt_data_err, Opt_jqfmt, Opt_dax_type,
#ifdef CONFIG_EXT4_DEBUG
	Opt_fc_debug_max_replay, Opt_fc_debug_force
@@ -1881,6 +1881,7 @@ static const struct fs_parameter_spec ext4_param_specs[] = {
	fsparam_flag	("no_prefetch_block_bitmaps",
						Opt_no_prefetch_block_bitmaps),
	fsparam_s32	("mb_optimize_scan",	Opt_mb_optimize_scan),
	fsparam_flag	("buffered_iomap",	Opt_buffered_iomap),
	fsparam_string	("check",		Opt_removed),	/* mount option from ext2/3 */
	fsparam_flag	("nocheck",		Opt_removed),	/* mount option from ext2/3 */
	fsparam_flag	("reservation",		Opt_removed),	/* mount option from ext2/3 */
@@ -1975,6 +1976,8 @@ static const struct mount_opts {
	{Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET},
	{Opt_no_prefetch_block_bitmaps, EXT4_MOUNT_NO_PREFETCH_BLOCK_BITMAPS,
	 MOPT_SET},
	{Opt_buffered_iomap, EXT4_MOUNT2_BUFFERED_IOMAP,
	 MOPT_SET | MOPT_2 | MOPT_EXT4_ONLY},
#ifdef CONFIG_EXT4_DEBUG
	{Opt_fc_debug_force, EXT4_MOUNT2_JOURNAL_FAST_COMMIT,
	 MOPT_SET | MOPT_2 | MOPT_EXT4_ONLY},
@@ -2461,6 +2464,11 @@ static int ext4_parse_param(struct fs_context *fc, struct fs_parameter *param)
			return -EINVAL;
		}
		return 0;
	case Opt_buffered_iomap:
		ext4_msg(NULL, KERN_WARNING,
			 "iomap for buffered enabled. Warning: EXPERIMENTAL, use at your own risk");
		ctx_set_mount_opt2(ctx, EXT4_MOUNT2_BUFFERED_IOMAP);
		return 0;
	}

	/*
@@ -2900,6 +2908,12 @@ static int ext4_check_opt_consistency(struct fs_context *fc,
			    !(sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_INODE))) {
			goto fail_dax_change_remount;
		}

		if (ctx_test_mount_opt2(ctx, EXT4_MOUNT2_BUFFERED_IOMAP) &&
		    !test_opt2(sb, BUFFERED_IOMAP)) {
			ext4_msg(NULL, KERN_ERR, "can't enable iomap for buffered IO on remount");
			return -EINVAL;
		}
	}

	return ext4_check_quota_consistency(fc, sb);