Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp4864902iob; Mon, 9 May 2022 03:32:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxygOeLwaAuUwePHrS5FOC7x7q8IuVXawxpl+qSL0BfD/435KzXbiqmXinwPel2VZveQ3A0 X-Received: by 2002:a62:15c7:0:b0:50d:388d:916a with SMTP id 190-20020a6215c7000000b0050d388d916amr15389479pfv.8.1652092341872; Mon, 09 May 2022 03:32:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652092341; cv=none; d=google.com; s=arc-20160816; b=tk4kbiF7/7wMyVAWm9+QfgoOiXhREhZaCieNHBTOhtoV0Sz352y9zeFB1P7P49YyuH yEd4/SMcZxY97R0r/UkPFBBHZEIIADojIHo5ppLISEgBKLpDCzXtyyAai4K8dcAkOdsf exwBkEJAigXAxO+oLA/z1VjYzQvtiSiPh7jLyfZFeFvxpodmr6usVpYHUrQwI/0hXXgv LyDs4OdKa2qF8lQKNjmk88iHvRbaGVrDrJmsx5Lh6Ofoj3DdEm7Z9jFx7gKch941nSDG 0YaXtYYvOQ9a1cMC6mEvachWS/+qG6TQDK35oi9pUaZx2lLKMW4NFrTN2mVdRD5M7D8z 8R0w== 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=8oE0chQrZFJSAltRwUQvCrvACeJvrNPtKgH7I1bTkcs=; b=XB3ZrYPkFsAq9/LaZnUAq5sRS8Oe4ymFRCqDJXIrXWgnkTDWWKdmKsbnCZ3OC/nnPb QOPd2fP+4TopYzE2PZmiNWlmdEn0Pb7X3xy8Pl3e0HmW70/soIVWGXdQ9a017eKeuHe1 aucAC4DiRvQjdy+PZ5+ebywLK2p89hl5ilFUMCgzneQ9/XWJ8nD72pz8JrxXNzJUwGV0 3uZPDGZqiTyUActhh4u4Lk5HWYqChYDA8V3Q6mH3EELHOGGy3FQwlnqs8+GYZmTe5VFJ uq3osk+b1jOnuUKaMT9QuUoLkuXTGtPEyV/S2ZHoM2SbE3qdiHG6VHh7tpT+k2ftRKfs U8Ng== ARC-Authentication-Results: i=1; mx.google.com; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 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. [23.128.96.19]) by mx.google.com with ESMTPS id c1-20020a056a00248100b0050e0a5aa240si15080694pfv.6.2022.05.09.03.32.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 May 2022 03:32:21 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 087281F8F10; Mon, 9 May 2022 03:02:27 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236711AbiEIHxt (ORCPT + 99 others); Mon, 9 May 2022 03:53:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59274 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235762AbiEIHo7 (ORCPT ); Mon, 9 May 2022 03:44:59 -0400 Received: from out30-57.freemail.mail.aliyun.com (out30-57.freemail.mail.aliyun.com [115.124.30.57]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6DA918E23; Mon, 9 May 2022 00:41:04 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R431e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e01424;MF=jefflexu@linux.alibaba.com;NM=1;PH=DS;RN=20;SR=0;TI=SMTPD_---0VCgwzCt_1652082051; Received: from localhost(mailfrom:jefflexu@linux.alibaba.com fp:SMTPD_---0VCgwzCt_1652082051) by smtp.aliyun-inc.com(127.0.0.1); Mon, 09 May 2022 15:40:52 +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, yinxin.x@bytedance.com, zhangjiachen.jaycee@bytedance.com, zhujia.zj@bytedance.com Subject: [PATCH v11 14/22] erofs: add erofs_fscache_read_folios() helper Date: Mon, 9 May 2022 15:40:20 +0800 Message-Id: <20220509074028.74954-15-jefflexu@linux.alibaba.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220509074028.74954-1-jefflexu@linux.alibaba.com> References: <20220509074028.74954-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 Add erofs_fscache_read_folios() helper reading from fscache. It supports on-demand read semantics. That is, it will make the backend prepare for the data when cache miss. Once data ready, it will read from the cache. This helper can then be used to implement .readpage()/.readahead() of on-demand read semantics. Signed-off-by: Jeffle Xu Reviewed-by: Gao Xiang --- fs/erofs/fscache.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c index 26f038d9c4e1..ac02af8cce3e 100644 --- a/fs/erofs/fscache.c +++ b/fs/erofs/fscache.c @@ -5,6 +5,60 @@ #include #include "internal.h" +/* + * Read data from fscache and fill the read data into page cache described by + * @start/len, which shall be both aligned with PAGE_SIZE. @pstart describes + * the start physical address in the cache file. + */ +static int erofs_fscache_read_folios(struct fscache_cookie *cookie, + struct address_space *mapping, + loff_t start, size_t len, + loff_t pstart) +{ + enum netfs_io_source source; + struct netfs_io_request rreq = {}; + struct netfs_io_subrequest subreq = { .rreq = &rreq, }; + struct netfs_cache_resources *cres = &rreq.cache_resources; + struct super_block *sb = mapping->host->i_sb; + struct iov_iter iter; + size_t done = 0; + int ret; + + ret = fscache_begin_read_operation(cres, cookie); + if (ret) + return ret; + + while (done < len) { + subreq.start = pstart + done; + subreq.len = len - done; + subreq.flags = 1 << NETFS_SREQ_ONDEMAND; + + source = cres->ops->prepare_read(&subreq, LLONG_MAX); + if (WARN_ON(subreq.len == 0)) + source = NETFS_INVALID_READ; + if (source != NETFS_READ_FROM_CACHE) { + erofs_err(sb, "failed to fscache prepare_read (source %d)", + source); + ret = -EIO; + goto out; + } + + iov_iter_xarray(&iter, READ, &mapping->i_pages, + start + done, subreq.len); + ret = fscache_read(cres, subreq.start, &iter, + NETFS_READ_HOLE_FAIL, NULL, NULL); + if (ret) { + erofs_err(sb, "failed to fscache_read (ret %d)", ret); + goto out; + } + + done += subreq.len; + } +out: + fscache_end_operation(cres); + return ret; +} + static const struct address_space_operations erofs_fscache_meta_aops = { }; -- 2.27.0