From: Gao Xiang hsiangkao@linux.alibaba.com
anolis inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IB5UKT
Reference: https://gitee.com/anolis/cloud-kernel/commit/15a330a92f9f
--------------------------------
ANBZ: #1666
commit 9c0cc9c729657446ed001a99488a9d82f5124af4 upstream.
Introduce 'fsid' mount option to enable on-demand read sementics, in which case, erofs will be mounted from data blobs. Users could specify the name of primary data blob by this mount option.
Signed-off-by: Jeffle Xu jefflexu@linux.alibaba.com Reviewed-by: Gao Xiang hsiangkao@linux.alibaba.com Link: https://lore.kernel.org/r/20220425122143.56815-22-jefflexu@linux.alibaba.com Acked-by: Chao Yu chao@kernel.org Tested-by: Zichen Tian tianzichen@kuaishou.com Tested-by: Jia Zhu zhujia.zj@bytedance.com Tested-by: Yan Song yansong.ys@antgroup.com Signed-off-by: Gao Xiang hsiangkao@linux.alibaba.com Signed-off-by: Huang Jianan jnhuang@linux.alibaba.com Reviewed-by: Jeffle Xu jefflexu@linux.alibaba.com Signed-off-by: Baokun Li libaokun1@huawei.com --- fs/erofs/super.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 037369ff7081..5529c83d5d83 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -281,6 +281,7 @@ enum { Opt_acl, Opt_cache_strategy, Opt_device, + Opt_fsid, Opt_err };
@@ -297,6 +298,7 @@ static const struct fs_parameter_spec erofs_fs_parameters[] = { fsparam_enum("cache_strategy", Opt_cache_strategy, erofs_param_cache_strategy), fsparam_string("device", Opt_device), + fsparam_string("fsid", Opt_fsid), {} };
@@ -359,6 +361,17 @@ static int erofs_fc_parse_param(struct fs_context *fc, } ++ctx->devs->extra_devices; break; + case Opt_fsid: +#ifdef CONFIG_EROFS_FS_ONDEMAND + kfree(ctx->opt.fsid); + ctx->opt.fsid = kstrdup(param->string, GFP_KERNEL); + if (!ctx->opt.fsid) + return -ENOMEM; +#else + errorfc(fc, "fsid option not supported"); + return -EINVAL; +#endif + break; default: return -ENOPARAM; } @@ -442,6 +455,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_fs_info = sbi; sbi->opt = ctx->opt; + ctx->opt.fsid = NULL; sbi->devs = ctx->devs; ctx->devs = NULL;
@@ -507,6 +521,11 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
static int erofs_fc_get_tree(struct fs_context *fc) { + struct erofs_fs_context *ctx = fc->fs_private; + + if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && ctx->opt.fsid) + return get_tree_nodev(fc, erofs_fc_fill_super); + return get_tree_bdev(fc, erofs_fc_fill_super); }
@@ -555,6 +574,7 @@ static void erofs_fc_free(struct fs_context *fc) struct erofs_fs_context *ctx = fc->fs_private;
erofs_free_dev_context(ctx->devs); + kfree(ctx->opt.fsid); kfree(ctx); }
@@ -595,7 +615,10 @@ static void erofs_kill_sb(struct super_block *sb)
WARN_ON(sb->s_magic != EROFS_SUPER_MAGIC);
- kill_block_super(sb); + if (erofs_is_fscache_mode(sb)) + generic_shutdown_super(sb); + else + kill_block_super(sb);
sbi = EROFS_SB(sb); if (!sbi) @@ -603,6 +626,7 @@ static void erofs_kill_sb(struct super_block *sb) erofs_free_dev_context(sbi->devs); erofs_fscache_unregister_cookie(&sbi->s_fscache); erofs_fscache_unregister_fs(sb); + kfree(sbi->opt.fsid); kfree(sbi); sb->s_fs_info = NULL; } @@ -736,6 +760,10 @@ static int erofs_show_options(struct seq_file *seq, struct dentry *root) seq_puts(seq, ",cache_strategy=readahead"); else if (opt->cache_strategy == EROFS_ZIP_CACHE_READAROUND) seq_puts(seq, ",cache_strategy=readaround"); +#endif +#ifdef CONFIG_EROFS_FS_ONDEMAND + if (sbi->opt.fsid) + seq_printf(seq, ",fsid=%s", sbi->opt.fsid); #endif return 0; }