Commit 1627a303 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

f2fs: expand scalability of f2fs mount option



opt field in structure f2fs_mount_info and opt_mask field in structure
f2fs_fs_context is 32-bits variable, now we're running out of available
bits in them, let's expand them to 64-bits for better scalability.

Signed-off-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent d31e0de8
Loading
Loading
Loading
Loading
+45 −40
Original line number Diff line number Diff line
@@ -96,47 +96,52 @@ extern const char *f2fs_fault_name[FAULT_MAX];
/*
 * For mount options
 */
#define F2FS_MOUNT_DISABLE_ROLL_FORWARD	0x00000001
#define F2FS_MOUNT_DISCARD		0x00000002
#define F2FS_MOUNT_NOHEAP		0x00000004
#define F2FS_MOUNT_XATTR_USER		0x00000008
#define F2FS_MOUNT_POSIX_ACL		0x00000010
#define F2FS_MOUNT_DISABLE_EXT_IDENTIFY	0x00000020
#define F2FS_MOUNT_INLINE_XATTR		0x00000040
#define F2FS_MOUNT_INLINE_DATA		0x00000080
#define F2FS_MOUNT_INLINE_DENTRY	0x00000100
#define F2FS_MOUNT_FLUSH_MERGE		0x00000200
#define F2FS_MOUNT_NOBARRIER		0x00000400
#define F2FS_MOUNT_FASTBOOT		0x00000800
#define F2FS_MOUNT_READ_EXTENT_CACHE	0x00001000
#define F2FS_MOUNT_DATA_FLUSH		0x00002000
#define F2FS_MOUNT_FAULT_INJECTION	0x00004000
#define F2FS_MOUNT_USRQUOTA		0x00008000
#define F2FS_MOUNT_GRPQUOTA		0x00010000
#define F2FS_MOUNT_PRJQUOTA		0x00020000
#define F2FS_MOUNT_QUOTA		0x00040000
#define F2FS_MOUNT_INLINE_XATTR_SIZE	0x00080000
#define F2FS_MOUNT_RESERVE_ROOT		0x00100000
#define F2FS_MOUNT_DISABLE_CHECKPOINT	0x00200000
#define F2FS_MOUNT_NORECOVERY		0x00400000
#define F2FS_MOUNT_ATGC			0x00800000
#define F2FS_MOUNT_MERGE_CHECKPOINT	0x01000000
#define	F2FS_MOUNT_GC_MERGE		0x02000000
#define F2FS_MOUNT_COMPRESS_CACHE	0x04000000
#define F2FS_MOUNT_AGE_EXTENT_CACHE	0x08000000
#define F2FS_MOUNT_NAT_BITS		0x10000000
#define F2FS_MOUNT_INLINECRYPT		0x20000000
enum f2fs_mount_opt {
	F2FS_MOUNT_DISABLE_ROLL_FORWARD,
	F2FS_MOUNT_DISCARD,
	F2FS_MOUNT_NOHEAP,
	F2FS_MOUNT_XATTR_USER,
	F2FS_MOUNT_POSIX_ACL,
	F2FS_MOUNT_DISABLE_EXT_IDENTIFY,
	F2FS_MOUNT_INLINE_XATTR,
	F2FS_MOUNT_INLINE_DATA,
	F2FS_MOUNT_INLINE_DENTRY,
	F2FS_MOUNT_FLUSH_MERGE,
	F2FS_MOUNT_NOBARRIER,
	F2FS_MOUNT_FASTBOOT,
	F2FS_MOUNT_READ_EXTENT_CACHE,
	F2FS_MOUNT_DATA_FLUSH,
	F2FS_MOUNT_FAULT_INJECTION,
	F2FS_MOUNT_USRQUOTA,
	F2FS_MOUNT_GRPQUOTA,
	F2FS_MOUNT_PRJQUOTA,
	F2FS_MOUNT_QUOTA,
	F2FS_MOUNT_INLINE_XATTR_SIZE,
	F2FS_MOUNT_RESERVE_ROOT,
	F2FS_MOUNT_DISABLE_CHECKPOINT,
	F2FS_MOUNT_NORECOVERY,
	F2FS_MOUNT_ATGC,
	F2FS_MOUNT_MERGE_CHECKPOINT,
	F2FS_MOUNT_GC_MERGE,
	F2FS_MOUNT_COMPRESS_CACHE,
	F2FS_MOUNT_AGE_EXTENT_CACHE,
	F2FS_MOUNT_NAT_BITS,
	F2FS_MOUNT_INLINECRYPT,
	/*
	 * Some f2fs environments expect to be able to pass the "lazytime" option
	 * string rather than using the MS_LAZYTIME flag, so this must remain.
	 */
#define F2FS_MOUNT_LAZYTIME		0x40000000
#define F2FS_MOUNT_RESERVE_NODE		0x80000000
	F2FS_MOUNT_LAZYTIME,
	F2FS_MOUNT_RESERVE_NODE,
};

#define F2FS_OPTION(sbi)	((sbi)->mount_opt)
#define clear_opt(sbi, option)	(F2FS_OPTION(sbi).opt &= ~F2FS_MOUNT_##option)
#define set_opt(sbi, option)	(F2FS_OPTION(sbi).opt |= F2FS_MOUNT_##option)
#define test_opt(sbi, option)	(F2FS_OPTION(sbi).opt & F2FS_MOUNT_##option)
#define clear_opt(sbi, option)		\
	(F2FS_OPTION(sbi).opt &= ~BIT(F2FS_MOUNT_##option))
#define set_opt(sbi, option)		\
	(F2FS_OPTION(sbi).opt |= BIT(F2FS_MOUNT_##option))
#define test_opt(sbi, option)		\
	(F2FS_OPTION(sbi).opt & BIT(F2FS_MOUNT_##option))

#define ver_after(a, b)	(typecheck(unsigned long long, a) &&		\
		typecheck(unsigned long long, b) &&			\
@@ -183,7 +188,7 @@ struct f2fs_rwsem {
};

struct f2fs_mount_info {
	unsigned int opt;
	unsigned long long opt;
	block_t root_reserved_blocks;	/* root reserved blocks */
	block_t root_reserved_nodes;	/* root reserved nodes */
	kuid_t s_resuid;		/* reserved blocks for uid */
+18 −18
Original line number Diff line number Diff line
@@ -352,7 +352,7 @@ static match_table_t f2fs_checkpoint_tokens = {

struct f2fs_fs_context {
	struct f2fs_mount_info info;
	unsigned int	opt_mask;	/* Bits changed */
	unsigned long long opt_mask;	/* Bits changed */
	unsigned int	spec_mask;
	unsigned short	qname_mask;
};
@@ -360,23 +360,23 @@ struct f2fs_fs_context {
#define F2FS_CTX_INFO(ctx)	((ctx)->info)

static inline void ctx_set_opt(struct f2fs_fs_context *ctx,
			       unsigned int flag)
			       enum f2fs_mount_opt flag)
{
	ctx->info.opt |= flag;
	ctx->opt_mask |= flag;
	ctx->info.opt |= BIT(flag);
	ctx->opt_mask |= BIT(flag);
}

static inline void ctx_clear_opt(struct f2fs_fs_context *ctx,
				 unsigned int flag)
				 enum f2fs_mount_opt flag)
{
	ctx->info.opt &= ~flag;
	ctx->opt_mask |= flag;
	ctx->info.opt &= ~BIT(flag);
	ctx->opt_mask |= BIT(flag);
}

static inline bool ctx_test_opt(struct f2fs_fs_context *ctx,
				unsigned int flag)
				enum f2fs_mount_opt flag)
{
	return ctx->info.opt & flag;
	return ctx->info.opt & BIT(flag);
}

void f2fs_printk(struct f2fs_sb_info *sbi, bool limit_rate,
@@ -1371,7 +1371,7 @@ static int f2fs_check_compression(struct fs_context *fc,
			ctx_test_opt(ctx, F2FS_MOUNT_COMPRESS_CACHE))
			f2fs_info(sbi, "Image doesn't support compression");
		clear_compression_spec(ctx);
		ctx->opt_mask &= ~F2FS_MOUNT_COMPRESS_CACHE;
		ctx->opt_mask &= ~BIT(F2FS_MOUNT_COMPRESS_CACHE);
		return 0;
	}
	if (ctx->spec_mask & F2FS_SPEC_compress_extension) {
@@ -1439,42 +1439,42 @@ static int f2fs_check_opt_consistency(struct fs_context *fc,
		return -EINVAL;

	if (f2fs_hw_should_discard(sbi) &&
			(ctx->opt_mask & F2FS_MOUNT_DISCARD) &&
			(ctx->opt_mask & BIT(F2FS_MOUNT_DISCARD)) &&
			!ctx_test_opt(ctx, F2FS_MOUNT_DISCARD)) {
		f2fs_warn(sbi, "discard is required for zoned block devices");
		return -EINVAL;
	}

	if (!f2fs_hw_support_discard(sbi) &&
			(ctx->opt_mask & F2FS_MOUNT_DISCARD) &&
			(ctx->opt_mask & BIT(F2FS_MOUNT_DISCARD)) &&
			ctx_test_opt(ctx, F2FS_MOUNT_DISCARD)) {
		f2fs_warn(sbi, "device does not support discard");
		ctx_clear_opt(ctx, F2FS_MOUNT_DISCARD);
		ctx->opt_mask &= ~F2FS_MOUNT_DISCARD;
		ctx->opt_mask &= ~BIT(F2FS_MOUNT_DISCARD);
	}

	if (f2fs_sb_has_device_alias(sbi) &&
			(ctx->opt_mask & F2FS_MOUNT_READ_EXTENT_CACHE) &&
			(ctx->opt_mask & BIT(F2FS_MOUNT_READ_EXTENT_CACHE)) &&
			!ctx_test_opt(ctx, F2FS_MOUNT_READ_EXTENT_CACHE)) {
		f2fs_err(sbi, "device aliasing requires extent cache");
		return -EINVAL;
	}

	if (test_opt(sbi, RESERVE_ROOT) &&
			(ctx->opt_mask & F2FS_MOUNT_RESERVE_ROOT) &&
			(ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_ROOT)) &&
			ctx_test_opt(ctx, F2FS_MOUNT_RESERVE_ROOT)) {
		f2fs_info(sbi, "Preserve previous reserve_root=%u",
			F2FS_OPTION(sbi).root_reserved_blocks);
		ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_ROOT);
		ctx->opt_mask &= ~F2FS_MOUNT_RESERVE_ROOT;
		ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_ROOT);
	}
	if (test_opt(sbi, RESERVE_NODE) &&
			(ctx->opt_mask & F2FS_MOUNT_RESERVE_NODE) &&
			(ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_NODE)) &&
			ctx_test_opt(ctx, F2FS_MOUNT_RESERVE_NODE)) {
		f2fs_info(sbi, "Preserve previous reserve_node=%u",
			F2FS_OPTION(sbi).root_reserved_nodes);
		ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_NODE);
		ctx->opt_mask &= ~F2FS_MOUNT_RESERVE_NODE;
		ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_NODE);
	}

	err = f2fs_check_test_dummy_encryption(fc, sb);