Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp5686934pxb; Thu, 20 Jan 2022 02:28:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJzTTIeOLXOn5Ip6X7Iv9XQOs3MswJL/SEg5VKc2VDrOnfgkWobweGROB5X8k0LU2EcHK5pl X-Received: by 2002:a17:90a:8409:: with SMTP id j9mr9958323pjn.218.1642674512812; Thu, 20 Jan 2022 02:28:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642674512; cv=none; d=google.com; s=arc-20160816; b=VQIDGUImFk/GGlXQ0usXISpBlaLzSPYXlG/g82ShOGcqutvm+SrklBKI7j/rzoJzxL aJtRb7J3C155YBG6u8S5Q8AiJ7hS5vh7c+VH/IfP9KtF9UO4oVIt0vRbuGt42xyR6SqY 8M5m2xoQ6SXfPGcqNhJRJzgeOSyAZH0r7oNaFaQdSc7U40orCs+KA9tV5kjVs+LXbbV6 NJnmzStM2dnqQSRSY6b2G6NyfyeF7lyropETRpcLRcDaEeEmcSK77aBzCD3H4r+LgNfH NHve+bi3PQnU+8ewmb6WDra4uzgrm2ICrHPOSgJ5/oPkhuGhbZJBSF6f2o1dOBXrbans iIsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=OupQD2lxwH9xxgamA+i8M95r8RojI3RVVWxe+Y1jFQY=; b=j4oeBnhxfqzBEPL0gXwJaqxBZU+r6lUaOJ4zKdPuGT9+EwYnsImTh0yoI+EzvnyYEm wa2TXh4lWhzSW1dCsrhHQSwq/Hwcj07JtDPZb1QWmIRhmvyOmK5/cCG6CJKMQsa/GbJl PY8J6bJxM5m3HVvZHYnI8U73wnfVrAxzUFK+Nqjee2ZM9gHkc7I2cSvdhWkbosv0MSRh gpbr7Vs53QuzOMJwB2IErhR9H6vZCju6UJ5BCSSw8k7LsqQek7yPVGTNGonSnWYeDN17 SdyvY86YixbtThARU2eDxQx9XHJNAfZESxiEkwTvC606IoWFcBqWuyuu1qjODw8BeCN4 u8AA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f13si2546778pfv.366.2022.01.20.02.28.01; Thu, 20 Jan 2022 02:28:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243013AbiARNMz (ORCPT + 99 others); Tue, 18 Jan 2022 08:12:55 -0500 Received: from out30-130.freemail.mail.aliyun.com ([115.124.30.130]:48942 "EHLO out30-130.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242548AbiARNMm (ORCPT ); Tue, 18 Jan 2022 08:12:42 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R621e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04423;MF=jefflexu@linux.alibaba.com;NM=1;PH=DS;RN=12;SR=0;TI=SMTPD_---0V2C5CpP_1642511559; Received: from localhost(mailfrom:jefflexu@linux.alibaba.com fp:SMTPD_---0V2C5CpP_1642511559) by smtp.aliyun-inc.com(127.0.0.1); Tue, 18 Jan 2022 21:12:40 +0800 From: Jeffle Xu To: dhowells@redhat.com, linux-cachefs@redhat.com, xiang@kernel.org, chao@kernel.org, linux-erofs@lists.ozlabs.org Cc: linux-fsdevel@vger.kernel.org, joseph.qi@linux.alibaba.com, bo.liu@linux.alibaba.com, tao.peng@linux.alibaba.com, gerry@linux.alibaba.com, eguan@linux.alibaba.com, linux-kernel@vger.kernel.org Subject: [PATCH v2 19/20] erofs: add 'uuid' mount option Date: Tue, 18 Jan 2022 21:12:15 +0800 Message-Id: <20220118131216.85338-20-jefflexu@linux.alibaba.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220118131216.85338-1-jefflexu@linux.alibaba.com> References: <20220118131216.85338-1-jefflexu@linux.alibaba.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Introduce 'uuid' mount option to enable the nodev mode, in which erofs could be mounted from blob files instead of blkdev. By then users could specify the path of bootstrap blob file containing the complete erofs image. Signed-off-by: Jeffle Xu --- fs/erofs/Kconfig | 2 +- fs/erofs/super.c | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/fs/erofs/Kconfig b/fs/erofs/Kconfig index f57255ab88ed..37a2cc82ecc2 100644 --- a/fs/erofs/Kconfig +++ b/fs/erofs/Kconfig @@ -2,7 +2,7 @@ config EROFS_FS tristate "EROFS filesystem support" - depends on BLOCK + depends on BLOCK && FSCACHE_ONDEMAND select FS_IOMAP select LIBCRC32C help diff --git a/fs/erofs/super.c b/fs/erofs/super.c index f058a04a00c7..3f8557bac786 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -400,6 +400,7 @@ enum { Opt_dax, Opt_dax_enum, Opt_device, + Opt_uuid, Opt_err }; @@ -424,6 +425,7 @@ static const struct fs_parameter_spec erofs_fs_parameters[] = { fsparam_flag("dax", Opt_dax), fsparam_enum("dax", Opt_dax_enum, erofs_dax_param_enums), fsparam_string("device", Opt_device), + fsparam_string("uuid", Opt_uuid), {} }; @@ -519,6 +521,12 @@ static int erofs_fc_parse_param(struct fs_context *fc, } ++ctx->devs->extra_devices; break; + case Opt_uuid: + kfree(ctx->opt.uuid); + ctx->opt.uuid = kstrdup(param->string, GFP_KERNEL); + if (!ctx->opt.uuid) + return -ENOMEM; + break; default: return -ENOPARAM; } @@ -593,9 +601,14 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) sb->s_magic = EROFS_SUPER_MAGIC; - if (!sb_set_blocksize(sb, EROFS_BLKSIZ)) { - erofs_err(sb, "failed to set erofs blksize"); - return -EINVAL; + if (erofs_bdev_mode(sb)) { + if (!sb_set_blocksize(sb, EROFS_BLKSIZ)) { + erofs_err(sb, "failed to set erofs blksize"); + return -EINVAL; + } + } else { + sb->s_blocksize = EROFS_BLKSIZ; + sb->s_blocksize_bits = LOG_BLOCK_SIZE; } sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); @@ -604,11 +617,12 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) sb->s_fs_info = sbi; sbi->opt = ctx->opt; - sbi->dax_dev = fs_dax_get_by_bdev(sb->s_bdev, &sbi->dax_part_off); sbi->devs = ctx->devs; ctx->devs = NULL; - if (!erofs_bdev_mode(sb)) { + if (erofs_bdev_mode(sb)) { + sbi->dax_dev = fs_dax_get_by_bdev(sb->s_bdev, &sbi->dax_part_off); + } else { struct erofs_fscache_context *bootstrap; bootstrap = erofs_fscache_get_ctx(sb, ctx->opt.uuid, true); @@ -616,6 +630,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) return PTR_ERR(bootstrap); sbi->bootstrap = bootstrap; + sbi->dax_dev = NULL; } err = erofs_read_superblock(sb); @@ -678,6 +693,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 (ctx->opt.uuid) + return get_tree_nodev(fc, erofs_fc_fill_super); + return get_tree_bdev(fc, erofs_fc_fill_super); } @@ -727,6 +747,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.uuid); kfree(ctx); } @@ -767,7 +788,10 @@ static void erofs_kill_sb(struct super_block *sb) WARN_ON(sb->s_magic != EROFS_SUPER_MAGIC); - kill_block_super(sb); + if (erofs_bdev_mode(sb)) + kill_block_super(sb); + else + generic_shutdown_super(sb); sbi = EROFS_SB(sb); if (!sbi) @@ -885,7 +909,12 @@ static int erofs_statfs(struct dentry *dentry, struct kstatfs *buf) { struct super_block *sb = dentry->d_sb; struct erofs_sb_info *sbi = EROFS_SB(sb); - u64 id = huge_encode_dev(sb->s_bdev->bd_dev); + u64 id; + + if (erofs_bdev_mode(sb)) + id = huge_encode_dev(sb->s_bdev->bd_dev); + else + id = 0; /* TODO */ buf->f_type = sb->s_magic; buf->f_bsize = EROFS_BLKSIZ; -- 2.27.0