From patchwork Fri Nov 17 21:15:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 13459389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71922C54FB9 for ; Fri, 17 Nov 2023 21:16:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1B5328D001F; Fri, 17 Nov 2023 16:16:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 167EE8D001C; Fri, 17 Nov 2023 16:16:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EAAFC8D001F; Fri, 17 Nov 2023 16:16:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id D83868D001C for ; Fri, 17 Nov 2023 16:16:56 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 9F91840DD7 for ; Fri, 17 Nov 2023 21:16:56 +0000 (UTC) X-FDA: 81468706032.28.B59C0AB Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf14.hostedemail.com (Postfix) with ESMTP id E6F39100015 for ; Fri, 17 Nov 2023 21:16:54 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=NrCeMI6m; spf=pass (imf14.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700255815; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=fsCXZYi8G6brqu2iwUxtHCsIIj0ZKZC/tTA2dXo92P0=; b=LtrgiHttPvuJvUbpqac0gfC26BNxb/HNAWUcbMB0gRlNPQSe7VCYazOM9mVjZ7031mW/VY 9Q2vbwZV5P0hUCQm3fexEyumDtR5Bxc+aMLQSFxjFaUaZAcSPNoZqK7kwKfHKzcqqOKo5f ieygFxR9JqCBQaBm2S4PJNUJRjTkURY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700255815; a=rsa-sha256; cv=none; b=0eyD4a0AxFGXtu7354Hc354Cddcr54OmPM3YfB1bUVsptQo4c2Pnd4cNEZ3+cW16kcx6f7 /zlvFO7egoZ+COTW1R2+zyew1XY0oaqRzRbOAxButXLO0SbkzEK+VDoe7n/oFWcMU9OCtL 8X4e4yjplmsamveXbPqhqPmEbANsMP0= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=NrCeMI6m; spf=pass (imf14.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com; dmarc=pass (policy=none) header.from=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1700255814; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fsCXZYi8G6brqu2iwUxtHCsIIj0ZKZC/tTA2dXo92P0=; b=NrCeMI6mHo7HsSXRcCk/ajKaC+RQqyxNidxmYd10xifKPXmciCLDlSJcvdvyNJGViauw1k sfjp3UXgUESt+kynGpA1dfqGufvrpDmz0hVW/5SmOeI9x/Yhynk8+3kcROTOq3wDQS2XYI 3kOs+2p7oPbd75WzDoruI5ghXnVq8QA= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-330-flao8ClKNU-_2gpvXRsFBA-1; Fri, 17 Nov 2023 16:16:51 -0500 X-MC-Unique: flao8ClKNU-_2gpvXRsFBA-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E0E3028040C0; Fri, 17 Nov 2023 21:16:49 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.16]) by smtp.corp.redhat.com (Postfix) with ESMTP id 44D6B492BE0; Fri, 17 Nov 2023 21:16:47 +0000 (UTC) From: David Howells To: Jeff Layton , Steve French Cc: David Howells , Matthew Wilcox , Marc Dionne , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Dominique Martinet , Ilya Dryomov , Christian Brauner , linux-cachefs@redhat.com, linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org, ceph-devel@vger.kernel.org, v9fs@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 18/51] fscache: Add a function to begin an cache op from a netfslib request Date: Fri, 17 Nov 2023 21:15:10 +0000 Message-ID: <20231117211544.1740466-19-dhowells@redhat.com> In-Reply-To: <20231117211544.1740466-1-dhowells@redhat.com> References: <20231117211544.1740466-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 X-Rspamd-Queue-Id: E6F39100015 X-Rspam-User: X-Stat-Signature: 45sqzi3ruz4hnm7up3ur8u6zzxgd38m3 X-Rspamd-Server: rspam03 X-HE-Tag: 1700255814-9787 X-HE-Meta: U2FsdGVkX19wE9aOtH1X0pbTsyoYyuYkU2kSEmZNPhl3Zl+u2Y7vrayiYApoQph+0C+D3q8H2eQZ4zoVCgCokH6ca47x0pXIr2GuQDcHRyQkxv1xTUmDcJSN2nGuOh57g0IOeK6wLRD89srHhHX2uKUX0R+xThEQledXMNqnis8MKIR5aW9JQJp3VYFk+IH2EVvmImAfWW18uA8vr44usRykEzmkClP9ADyLJ/XVfX259g2AQLpaX/y6OiQNTQDoRKAMIdtS+f1yqPfHIbvpeHN7tJZS+SaO2fPEsOWhiHYDPZBAbNXEJmspvgOjSmWTHot5m/gkz+t/Qqf1SctfkxJYU4p8+2s717YafYR0ho/sn1fFgho2vMAN4YB7TrvddSDmE4jleRrSh4HPe0tg51ScgQCtGv3BvqtobPXx2h4gd02AD2HUNsGM2Jy64Y3FPLBDB8g/w+2FVMxmvA/djWA14Uf/3cDDavKlYVIZdEbH1iwQWd+WfE80Jd8Tdobwaho0pXRb/Z2Eleddd9Yok4FnDr4d1iuvN2u83Nk2cIYfrt7COQJYvVwMD+jcg8Qa4g3GZJ1C/PLJZKTNkITN71eMYEk7EW5cZ/vbumcKwY9uiSP+6eXzaFsyFsxh2ogIRfqaGphH78tUxXtoOfVFKGq0wkkBgc28+LM93J99od4t4hO3ItFc+yxkc4T7Gx7w6YtisocWceYPYty906HAaLochxJW72KcXxSvZhhT+VyWeCkh02Nbgev9h6OKTcXYlPtO+o/3690r5jrA2kQW5AHJAF4lo1yEF/1TPsrQTBRKgHqX5bc5+rECEyOBR0EttfJCLYLH+z5N7Vg5MCfObYKOQR03pQf/KILnEKGuT7y0dNAI3qmoviOrCU/XPz+2zYzjW3pUw/0FxlUPyuHRixeJXEckGXEVHdyw6rom4w7u5RnFHFMM4bGgjarKRgCLyx10ccxSYnnTHo8iHo+ njRBXg/d Jo58867OUpby9tTYzMcRy/jPBF5Y4fakY7ftFDCzpvFufHdNEmnkAH7ZRce6N6VFK2t6R/HVYZjnJfJgmB5hApaY4XSl9ZAuucIXjF5xxYjUp7L6mISLe5IioK1SDm5Z29iM7PF2Ut3NSlE5mRHEXYzat4u73gVdsYs9kAHDqPZP6QafqxF+I8rc+osiBTIuuj91VMnEPx3hAveQR9k222kfyuwDe1FON0kpec/U1JWoKPQCcttdH5JeDG39ML6u6h5FJR4pcJwFX81czd0GlLwwVwbCkSWulBi6OsisygZ5YJR+fR1ClAQrEPcQXYc9STIHsjgJ6tCIshSC8dm4J9t5eW89wwslVugu871HOeTxSz/U= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Add a function to begin an cache read or write operation from a netfslib I/O request. This function can then be pointed to directly by the network filesystem's netfs_request_ops::begin_cache_operation op pointer. Ideally, netfslib would just call into fscache directly, but that would cause dependency cycles as fscache calls into netfslib directly. Signed-off-by: David Howells cc: Jeff Layton cc: linux-cachefs@redhat.com cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/9p/vfs_addr.c | 18 ++---------------- fs/afs/file.c | 14 +------------- fs/ceph/addr.c | 2 +- fs/ceph/cache.h | 12 ------------ fs/fscache/io.c | 42 +++++++++++++++++++++++++++++++++++++++++ include/linux/fscache.h | 6 ++++++ 6 files changed, 52 insertions(+), 42 deletions(-) diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 18a666c43e4a..516572bad412 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -82,25 +83,10 @@ static void v9fs_free_request(struct netfs_io_request *rreq) p9_fid_put(fid); } -/** - * v9fs_begin_cache_operation - Begin a cache operation for a read - * @rreq: The read request - */ -static int v9fs_begin_cache_operation(struct netfs_io_request *rreq) -{ -#ifdef CONFIG_9P_FSCACHE - struct fscache_cookie *cookie = v9fs_inode_cookie(V9FS_I(rreq->inode)); - - return fscache_begin_read_operation(&rreq->cache_resources, cookie); -#else - return -ENOBUFS; -#endif -} - const struct netfs_request_ops v9fs_req_ops = { .init_request = v9fs_init_request, .free_request = v9fs_free_request, - .begin_cache_operation = v9fs_begin_cache_operation, + .begin_cache_operation = fscache_begin_cache_operation, .issue_read = v9fs_issue_read, }; diff --git a/fs/afs/file.c b/fs/afs/file.c index a7658fb2d7dc..490dbccf1710 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -359,18 +359,6 @@ static int afs_init_request(struct netfs_io_request *rreq, struct file *file) return 0; } -static int afs_begin_cache_operation(struct netfs_io_request *rreq) -{ -#ifdef CONFIG_AFS_FSCACHE - struct afs_vnode *vnode = AFS_FS_I(rreq->inode); - - return fscache_begin_read_operation(&rreq->cache_resources, - afs_vnode_cache(vnode)); -#else - return -ENOBUFS; -#endif -} - static int afs_check_write_begin(struct file *file, loff_t pos, unsigned len, struct folio **foliop, void **_fsdata) { @@ -387,7 +375,7 @@ static void afs_free_request(struct netfs_io_request *rreq) const struct netfs_request_ops afs_req_ops = { .init_request = afs_init_request, .free_request = afs_free_request, - .begin_cache_operation = afs_begin_cache_operation, + .begin_cache_operation = fscache_begin_cache_operation, .check_write_begin = afs_check_write_begin, .issue_read = afs_issue_read, }; diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 03feb4dc6352..595bd774f046 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -489,7 +489,7 @@ static void ceph_netfs_free_request(struct netfs_io_request *rreq) const struct netfs_request_ops ceph_netfs_ops = { .init_request = ceph_init_request, .free_request = ceph_netfs_free_request, - .begin_cache_operation = ceph_begin_cache_operation, + .begin_cache_operation = fscache_begin_cache_operation, .issue_read = ceph_netfs_issue_read, .expand_readahead = ceph_netfs_expand_readahead, .clamp_length = ceph_netfs_clamp_length, diff --git a/fs/ceph/cache.h b/fs/ceph/cache.h index dc502daac49a..b804f1094764 100644 --- a/fs/ceph/cache.h +++ b/fs/ceph/cache.h @@ -57,13 +57,6 @@ static inline int ceph_fscache_dirty_folio(struct address_space *mapping, return fscache_dirty_folio(mapping, folio, ceph_fscache_cookie(ci)); } -static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq) -{ - struct fscache_cookie *cookie = ceph_fscache_cookie(ceph_inode(rreq->inode)); - - return fscache_begin_read_operation(&rreq->cache_resources, cookie); -} - static inline bool ceph_is_cache_enabled(struct inode *inode) { return fscache_cookie_enabled(ceph_fscache_cookie(ceph_inode(inode))); @@ -135,11 +128,6 @@ static inline bool ceph_is_cache_enabled(struct inode *inode) return false; } -static inline int ceph_begin_cache_operation(struct netfs_io_request *rreq) -{ - return -ENOBUFS; -} - static inline void ceph_fscache_note_page_release(struct inode *inode) { } diff --git a/fs/fscache/io.c b/fs/fscache/io.c index 0d2b8dec8f82..cb602dd651e6 100644 --- a/fs/fscache/io.c +++ b/fs/fscache/io.c @@ -158,6 +158,48 @@ int __fscache_begin_write_operation(struct netfs_cache_resources *cres, } EXPORT_SYMBOL(__fscache_begin_write_operation); +/** + * fscache_begin_cache_operation - Begin a cache op for netfslib + * @rreq: The netfs request that wants to access the cache. + * + * Begin an I/O operation on behalf of the netfs helper library, read or write. + * @rreq indicates the netfs operation that wishes to access the cache. + * + * This is intended to be pointed to directly by the ->begin_cache_operation() + * netfs lib operation for the network filesystem. + * + * @cres->inval_counter is set from @cookie->inval_counter for comparison at + * the end of the operation. This allows invalidation during the operation to + * be detected by the caller. + * + * Returns: + * * 0 - Success + * * -ENOBUFS - No caching available + * * Other error code from the cache, such as -ENOMEM. + */ +int fscache_begin_cache_operation(struct netfs_io_request *rreq) +{ + struct netfs_inode *ctx = netfs_inode(rreq->inode); + + switch (rreq->origin) { + case NETFS_READAHEAD: + case NETFS_READPAGE: + case NETFS_READ_FOR_WRITE: + return fscache_begin_operation(&rreq->cache_resources, + netfs_i_cookie(ctx), + FSCACHE_WANT_PARAMS, + fscache_access_io_read); + case NETFS_WRITEBACK: + return fscache_begin_operation(&rreq->cache_resources, + netfs_i_cookie(ctx), + FSCACHE_WANT_PARAMS, + fscache_access_io_write); + default: + return -ENOBUFS; + } +} +EXPORT_SYMBOL(fscache_begin_cache_operation); + /** * fscache_dirty_folio - Mark folio dirty and pin a cache object for writeback * @mapping: The mapping the folio belongs to. diff --git a/include/linux/fscache.h b/include/linux/fscache.h index 8e312c8323a8..9c389adaf286 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h @@ -177,6 +177,12 @@ extern void __fscache_write_to_cache(struct fscache_cookie *, struct address_spa bool); extern void __fscache_clear_page_bits(struct address_space *, loff_t, size_t); +#if __fscache_available +extern int fscache_begin_cache_operation(struct netfs_io_request *rreq); +#else +#define fscache_begin_cache_operation NULL +#endif + /** * fscache_acquire_volume - Register a volume as desiring caching services * @volume_key: An identification string for the volume