Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp1050920pxb; Wed, 6 Apr 2022 07:34:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJymo3DOU0jaBCbiHuQ/6AyMl8/yNriBclgx2rDqrpVpY+CR19HmaZGMowN5Ju+9Ha7MGezy X-Received: by 2002:a05:6a02:20c:b0:381:f276:98d6 with SMTP id bh12-20020a056a02020c00b00381f27698d6mr7181851pgb.39.1649255671113; Wed, 06 Apr 2022 07:34:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649255671; cv=none; d=google.com; s=arc-20160816; b=O11UQRvlclypbHoPr5KZApcU6R2gYkkGiTd4ucb3atTXCGvFeh0LE94l8rm64Kbzee YT7qLXyfbJndilOFe/7M9DArp6LlyLclhMaBvI0MIpPaCKxMw51TZWJUyX1eCsz736kb jMrlMU2NGSGqb1c9eZEk+1pS09HeegY/tu+PXrIqLreNGeMfWx5i8QAswMxV84d3bEOZ 6bqDxgqH2KrnB+fTUgIRGM3ed8+ww5I1lcRAAukYwyu8nJ299FpuBci6T33YZQQMckWk hQHzpafEqR9h8w4ptTXYlM8RzjKR/nacJs2YaBFYsWWAZQXBGjvhLIPkT2CcGD3Ivmu5 AqmA== 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=qP53zvMEjFItgELHF9ndvNCKbE5bP1kI0xs6LeQ976c=; b=TX0tlhR9Fj8XMyuCkQtu1qtmgFGGoiRUrTOK4PQ3GEg8gQqQvChJd01mrMgSClc/M/ XpLD7j+hdaATwS6e7fIcn28jyMoIjq83h3TjScUHAzIm6ugirNLIMFYjLvweVKajtPpK HdLvqAp890HCepSnNFzb+9WQNYHnFKVTCrpmIJ+laCbd5Im2h493fbuwWhYP90xu25EQ 2D/HKXew/w1C7deKiIjLDxq2H2kUL5xETeqnM0rJpgmKzqWC83v92uqE5Y4Yxksun5J3 gomBtSuGEoPVFz2C6R/PlgtmYnZj/Rt9LLoayxt7hE32j9Tc+5MKkrdndGGh0JkSjyjT VheA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1: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 lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id 35-20020a630b23000000b003993452dea5si8011982pgl.757.2022.04.06.07.34.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Apr 2022 07:34:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1: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: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 924A050D271; Wed, 6 Apr 2022 05:16:18 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232463AbiDFMPv (ORCPT + 99 others); Wed, 6 Apr 2022 08:15:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50690 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231508AbiDFMOW (ORCPT ); Wed, 6 Apr 2022 08:14:22 -0400 Received: from out199-16.us.a.mail.aliyun.com (out199-16.us.a.mail.aliyun.com [47.90.199.16]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A88D425E01; Wed, 6 Apr 2022 00:56:34 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R351e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04426;MF=jefflexu@linux.alibaba.com;NM=1;PH=DS;RN=18;SR=0;TI=SMTPD_---0V9Ko7Ui_1649231788; Received: from localhost(mailfrom:jefflexu@linux.alibaba.com fp:SMTPD_---0V9Ko7Ui_1649231788) by smtp.aliyun-inc.com(127.0.0.1); Wed, 06 Apr 2022 15:56:29 +0800 From: Jeffle Xu To: dhowells@redhat.com, linux-cachefs@redhat.com, xiang@kernel.org, chao@kernel.org, linux-erofs@lists.ozlabs.org Cc: torvalds@linux-foundation.org, gregkh@linuxfoundation.org, willy@infradead.org, 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, luodaowen.backend@bytedance.com, tianzichen@kuaishou.com, fannaihao@baidu.com Subject: [PATCH v8 10/20] erofs: register fscache volume Date: Wed, 6 Apr 2022 15:56:02 +0800 Message-Id: <20220406075612.60298-11-jefflexu@linux.alibaba.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220406075612.60298-1-jefflexu@linux.alibaba.com> References: <20220406075612.60298-1-jefflexu@linux.alibaba.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A new fscache based mode is going to be introduced for erofs, in which case on-demand read semantics is implemented through fscache. As the first step, register fscache volume for each erofs filesystem. That means, data blobs can not be shared among erofs filesystems. In the following iteration, we are going to introduce the domain semantics, in which case several erofs filesystems can belong to one domain, and data blobs can be shared among these erofs filesystems of one domain. Signed-off-by: Jeffle Xu --- fs/erofs/Kconfig | 10 ++++++++++ fs/erofs/Makefile | 1 + fs/erofs/fscache.c | 37 +++++++++++++++++++++++++++++++++++++ fs/erofs/internal.h | 13 +++++++++++++ fs/erofs/super.c | 7 +++++++ 5 files changed, 68 insertions(+) create mode 100644 fs/erofs/fscache.c diff --git a/fs/erofs/Kconfig b/fs/erofs/Kconfig index f57255ab88ed..3d05265e3e8e 100644 --- a/fs/erofs/Kconfig +++ b/fs/erofs/Kconfig @@ -98,3 +98,13 @@ config EROFS_FS_ZIP_LZMA systems will be readable without selecting this option. If unsure, say N. + +config EROFS_FS_ONDEMAND + bool "EROFS fscache-based ondemand-read" + depends on CACHEFILES_ONDEMAND && (EROFS_FS=m && FSCACHE || EROFS_FS=y && FSCACHE=y) + default n + help + EROFS is mounted from data blobs and on-demand read semantics is + implemented through fscache. + + If unsure, say N. diff --git a/fs/erofs/Makefile b/fs/erofs/Makefile index 8a3317e38e5a..99bbc597a3e9 100644 --- a/fs/erofs/Makefile +++ b/fs/erofs/Makefile @@ -5,3 +5,4 @@ erofs-objs := super.o inode.o data.o namei.o dir.o utils.o pcpubuf.o sysfs.o erofs-$(CONFIG_EROFS_FS_XATTR) += xattr.o erofs-$(CONFIG_EROFS_FS_ZIP) += decompressor.o zmap.o zdata.o erofs-$(CONFIG_EROFS_FS_ZIP_LZMA) += decompressor_lzma.o +erofs-$(CONFIG_EROFS_FS_ONDEMAND) += fscache.o diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c new file mode 100644 index 000000000000..7a6d0239ebb1 --- /dev/null +++ b/fs/erofs/fscache.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2022, Alibaba Cloud + */ +#include +#include "internal.h" + +int erofs_fscache_register_fs(struct super_block *sb) +{ + struct erofs_sb_info *sbi = EROFS_SB(sb); + struct fscache_volume *volume; + char *name; + int ret = 0; + + name = kasprintf(GFP_KERNEL, "erofs,%s", sbi->opt.fsid); + if (!name) + return -ENOMEM; + + volume = fscache_acquire_volume(name, NULL, NULL, 0); + if (IS_ERR_OR_NULL(volume)) { + erofs_err(sb, "failed to register volume for %s", name); + ret = volume ? PTR_ERR(volume) : -EOPNOTSUPP; + volume = NULL; + } + + sbi->volume = volume; + kfree(name); + return ret; +} + +void erofs_fscache_unregister_fs(struct super_block *sb) +{ + struct erofs_sb_info *sbi = EROFS_SB(sb); + + fscache_relinquish_volume(sbi->volume, NULL, false); + sbi->volume = NULL; +} diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 05a97533b1e9..952a2f483f94 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -74,6 +74,7 @@ struct erofs_mount_opts { unsigned int max_sync_decompress_pages; #endif unsigned int mount_opt; + char *fsid; }; struct erofs_dev_context { @@ -146,6 +147,9 @@ struct erofs_sb_info { /* sysfs support */ struct kobject s_kobj; /* /sys/fs/erofs/ */ struct completion s_kobj_unregister; + + /* fscache support */ + struct fscache_volume *volume; }; #define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info) @@ -618,6 +622,15 @@ static inline int z_erofs_load_lzma_config(struct super_block *sb, } #endif /* !CONFIG_EROFS_FS_ZIP */ +/* fscache.c */ +#ifdef CONFIG_EROFS_FS_ONDEMAND +int erofs_fscache_register_fs(struct super_block *sb); +void erofs_fscache_unregister_fs(struct super_block *sb); +#else +static inline int erofs_fscache_register_fs(struct super_block *sb) { return 0; } +static inline void erofs_fscache_unregister_fs(struct super_block *sb) {} +#endif + #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ #endif /* __EROFS_INTERNAL_H */ diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 0c4b41130c2f..6590ed1b7d3b 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -601,6 +601,12 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) sbi->devs = ctx->devs; ctx->devs = NULL; + if (erofs_is_fscache_mode(sb)) { + err = erofs_fscache_register_fs(sb); + if (err) + return err; + } + err = erofs_read_superblock(sb); if (err) return err; @@ -757,6 +763,7 @@ static void erofs_kill_sb(struct super_block *sb) erofs_free_dev_context(sbi->devs); fs_put_dax(sbi->dax_dev); + erofs_fscache_unregister_fs(sb); kfree(sbi); sb->s_fs_info = NULL; } -- 2.27.0