Message ID | 20231213152350.431591-1-dhowells@redhat.com |
---|---|
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:3b04:b0:fb:cd0c:d3e with SMTP id c4csp7853195dys; Wed, 13 Dec 2023 07:24:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IHu2WZOSmhY/zKZkh3OGp9GKnIw57YnYwmv98AJ/Jb6y3g22RXArTfHh92GAl0lzABWNj// X-Received: by 2002:a05:6a20:9694:b0:18f:97c:826c with SMTP id hp20-20020a056a20969400b0018f097c826cmr3848124pzc.118.1702481055735; Wed, 13 Dec 2023 07:24:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702481055; cv=none; d=google.com; s=arc-20160816; b=Ga36NSYQJxV9onQtsJXr6CN+Im/9tSVbLoqybTtAb5PDFvb4cp25jF8U5c0CtZy0SZ O2mx515W5upx44m18YDyxC0LcgYnAWg2nF8wFWQOfrPZIVrEIYdfZ4HIwHMhaMOzQU7W I8q6+Ri6jdaqL6xsgWa/yAYzkIBDUrCAHDwWslHbdffQrIbTkvtdzj71Tb/6MptUxW8b fOCRAlzPiyt6TIBdYLAHuvyrjC2cai4H2pnoykOsFnnnofy1D/VLcr+rsFlP8mI3zQQA aJ+BtCM58R1htRhppD+w5aB+iLy78i90PTIA/mFNQFEhO4br4NeIqHxLucoh9W5jEa1q Ex4A== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=nElvBfJsqrTBHn7ca9kS/IDQA0m2TnErz3scXuPoO1A=; fh=ib4gl95HfLmZdfX9QIMf3rTepWCH9JlNymcDKJTPhJg=; b=nRXgDrL42c9EN8pzEq9wJsPkLelF8kWdGAFXrfkMCGpdiHtOr/Z57KSN99T6RnhI+j dHBp1QP6odikinY8XXssv3PINfmojXLVIyPhT88zGwWnKrI9pElunEvxPJrWRZEG8oGD 6ftFJL6wIS6srXx4vAXxLa96tqzEWsFhdqzmHf8Ebht7LjmOv46vSRoTes+jkiSsKOQq VMx38YjolYo2+9D98CQQHmErXk7undSdORBuitFaXzbFlSR/rJqDHjeEO4LztGjZB4Of g/GbNA8ygwXRmSg7ErDwla0VQBq4qDCg+ahg6E9YSAU6ykXJh/tnOuGzDOG8gLQds1mI xQwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XGIQNLvE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id bw32-20020a056a0204a000b005c663eae37fsi9784731pgb.295.2023.12.13.07.24.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 07:24:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XGIQNLvE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 1048080BCF4A; Wed, 13 Dec 2023 07:24:07 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1442490AbjLMPX5 (ORCPT <rfc822;dexuan.linux@gmail.com> + 99 others); Wed, 13 Dec 2023 10:23:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44102 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1442472AbjLMPX4 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 13 Dec 2023 10:23:56 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F919F4 for <linux-kernel@vger.kernel.org>; Wed, 13 Dec 2023 07:24:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1702481040; 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; bh=nElvBfJsqrTBHn7ca9kS/IDQA0m2TnErz3scXuPoO1A=; b=XGIQNLvEWQaVpKybd6AxvYfgG2HjXUkXPuPArQ0JycyDxRITHxwmuQ1Q5kEpOw4i8ghbFo 13EkKv8R2GJvuU7TfWxH2GqDQ81893uodY8cz5HI4hcRVNPmVCupTZK26HarEHldGKEdrz 2/JGCtqyuSk1ajo7y8NoQu5pePDWgXI= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-83-bNT4a_5wMzSOH84dTC7R4A-1; Wed, 13 Dec 2023 10:23:57 -0500 X-MC-Unique: bNT4a_5wMzSOH84dTC7R4A-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (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 D3D8C86301A; Wed, 13 Dec 2023 15:23:55 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.2]) by smtp.corp.redhat.com (Postfix) with ESMTP id B84EDC1596E; Wed, 13 Dec 2023 15:23:52 +0000 (UTC) From: David Howells <dhowells@redhat.com> To: Jeff Layton <jlayton@kernel.org>, Steve French <smfrench@gmail.com> Cc: David Howells <dhowells@redhat.com>, Matthew Wilcox <willy@infradead.org>, Marc Dionne <marc.dionne@auristor.com>, Paulo Alcantara <pc@manguebit.com>, Shyam Prasad N <sprasad@microsoft.com>, Tom Talpey <tom@talpey.com>, Dominique Martinet <asmadeus@codewreck.org>, Eric Van Hensbergen <ericvh@kernel.org>, Ilya Dryomov <idryomov@gmail.com>, Christian Brauner <christian@brauner.io>, 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 v4 00/39] netfs, afs, 9p: Delegate high-level I/O to netfslib Date: Wed, 13 Dec 2023 15:23:10 +0000 Message-ID: <20231213152350.431591-1-dhowells@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Wed, 13 Dec 2023 07:24:07 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785180775418831839 X-GMAIL-MSGID: 1785180775418831839 |
Series |
netfs, afs, 9p: Delegate high-level I/O to netfslib
|
|
Message
David Howells
Dec. 13, 2023, 3:23 p.m. UTC
Hi Jeff, Steve, Dominique, I have been working on my netfslib helpers to the point that I can run xfstests on AFS to completion (both with write-back buffering and, with a small patch, write-through buffering in the pagecache). I have a patch for 9P, but am currently unable to test it. The patches remove a little over 800 lines from AFS, 300 from 9P, albeit with around 3000 lines added to netfs. Hopefully, I will be able to remove a bunch of lines from Ceph too. I've split the CIFS patches out to a separate branch, cifs-netfs, where a further 2000+ lines are removed. I can run a certain amount of xfstests on CIFS, though I'm running into ksmbd issues and not all the tests work correctly because of issues between fallocate and what the SMB protocol actually supports. I've also dropped the content-crypto patches out for the moment as they're only usable by the ceph changes which I'm still working on. The patch to use PG_writeback instead of PG_fscache for writing to the cache has also been deferred, pending 9p, afs, ceph and cifs all being converted. The main aims of these patches are to get high-level I/O and knowledge of the pagecache out of the filesystem drivers as much as possible and to get rid, as much of possible, of the knowledge that pages/folios exist. Further, I would like to see ->write_begin, ->write_end and ->launder_folio go away. Features that are added by these patches to that which is already there in netfslib: (1) NFS-style (and Ceph-style) locking around DIO vs buffered I/O calls to prevent these from happening at the same time. mmap'd I/O can, of necessity, happen at any time ignoring these locks. (2) Support for unbuffered I/O. The data is kept in the bounce buffer and the pagecache is not used. This can be turned on with an inode flag. (3) Support for direct I/O. This is basically unbuffered I/O with some extra restrictions and no RMW. (4) Support for using a bounce buffer in an operation. The bounce buffer may be bigger than the target data/buffer, allowing for crypto rounding. (5) ->write_begin() and ->write_end() are ignored in favour of merging all of that into one function, netfs_perform_write(), thereby avoiding the function pointer traversals. (6) Support for write-through caching in the pagecache. netfs_perform_write() adds the pages is modifies to an I/O operation as it goes and directly marks them writeback rather than dirty. When writing back from write-through, it limits the range written back. This should allow CIFS to deal with byte-range mandatory locks correctly. (7) O_*SYNC and RWF_*SYNC writes use write-through rather than writing to the pagecache and then flushing afterwards. An AIO O_*SYNC write will notify of completion when the sub-writes all complete. (8) Support for write-streaming where modifed data is held in !uptodate folios, with a private struct attached indicating the range that is valid. (9) Support for write grouping, multiplexing a pointer to a group in the folio private data with the write-streaming data. The writepages algorithm only writes stuff back that's in the nominated group. This is intended for use by Ceph to write is snaps in order. (10) Skipping reads for which we know the server could only supply zeros or EOF (for instance if we've done a local write that leaves a hole in the file and extends the local inode size). General notes: (1) The fscache module is merged into the netfslib module to avoid cyclic exported symbol usage that prevents either module from being loaded. (2) Some helpers from fscache are reassigned to netfslib by name. (3) netfslib now makes use of folio->private, which means the filesystem can't use it. (4) The filesystem provides wrappers to call the write helpers, allowing it to do pre-validation, oplock/capability fetching and the passing in of write group info. (5) I want to try flushing the data when tearing down an inode before invalidating it to try and render launder_folio unnecessary. (6) Write-through caching will generate and dispatch write subrequests as it gathers enough data to hit wsize and has whole pages that at least span that size. This needs to be a bit more flexible, allowing for a filesystem such as CIFS to have a variable wsize. (7) The filesystem driver is just given read and write calls with an iov_iter describing the data/buffer to use. Ideally, they don't see pages or folios at all. A function, extract_iter_to_sg(), is already available to decant part of an iterator into a scatterlist for crypto purposes. 9P notes: (1) I haven't managed to test this as I haven't been able to get Ganesha to work correctly with 9P. (2) Writes should now occur in larger-than-page-sized chunks. (3) It should be possible to turn on multipage folio support in 9P now. Changes ======= ver #4) - Slimmed down the branch: - Split the cifs-related patches off to a separate branch (cifs-netfs) - Deferred the content-encryption to the in-progress ceph changes. - Deferred the use-PG_writeback rather than PG_fscache patch - Rebased on a later linux-next with afs-rotation patches. ver #3) - Moved the fscache module into netfslib to avoid export cycles. - Fixed a bunch of bugs. - Got CIFS to pass as much of xfstests as possible. - Added a patch to make 9P use all the helpers. - Added a patch to stop using PG_fscache, but rather dirty pages on reading and have writepages write to the cache. ver #2) - Folded the addition of NETFS_RREQ_NONBLOCK/BLOCKED into first patch that uses them. - Folded addition of rsize member into first user. - Don't set rsize in ceph (yet) and set it in kafs to 256KiB. cifs sets it dynamically. - Moved direct_bv next to direct_bv_count in struct netfs_io_request and labelled it with a __counted_by(). - Passed flags into netfs_xa_store_and_mark() rather than two bools. - Removed netfs_set_up_buffer() as it wasn't used. David Link: https://lore.kernel.org/r/20231013160423.2218093-1-dhowells@redhat.com/ # v1 Link: https://lore.kernel.org/r/20231117211544.1740466-1-dhowells@redhat.com/ # v2 David Howells (39): netfs, fscache: Move fs/fscache/* into fs/netfs/ netfs, fscache: Combine fscache with netfs netfs, fscache: Remove ->begin_cache_operation netfs, fscache: Move /proc/fs/fscache to /proc/fs/netfs and put in a symlink netfs: Move pinning-for-writeback from fscache to netfs netfs: Add a procfile to list in-progress requests netfs: Allow the netfs to make the io (sub)request alloc larger netfs: Add a ->free_subrequest() op afs: Don't use folio->private to record partial modification netfs: Provide invalidate_folio and release_folio calls netfs: Implement unbuffered/DIO vs buffered I/O locking netfs: Add iov_iters to (sub)requests to describe various buffers netfs: Add support for DIO buffering netfs: Provide tools to create a buffer in an xarray netfs: Add bounce buffering support netfs: Add func to calculate pagecount/size-limited span of an iterator netfs: Limit subrequest by size or number of segments netfs: Export netfs_put_subrequest() and some tracepoints netfs: Extend the netfs_io_*request structs to handle writes netfs: Add a hook to allow tell the netfs to update its i_size netfs: Make netfs_put_request() handle a NULL pointer netfs: Make the refcounting of netfs_begin_read() easier to use netfs: Prep to use folio->private for write grouping and streaming write netfs: Dispatch write requests to process a writeback slice netfs: Provide func to copy data to pagecache for buffered write netfs: Make netfs_read_folio() handle streaming-write pages netfs: Allocate multipage folios in the writepath netfs: Implement support for unbuffered/DIO read netfs: Implement unbuffered/DIO write support netfs: Implement buffered write API netfs: Allow buffered shared-writeable mmap through netfs_page_mkwrite() netfs: Provide netfs_file_read_iter() netfs, cachefiles: Pass upper bound length to allow expansion netfs: Provide a writepages implementation netfs: Provide a launder_folio implementation netfs: Implement a write-through caching option netfs: Optimise away reads above the point at which there can be no data afs: Use the netfs write helpers 9p: Use netfslib read/write_iter Documentation/filesystems/netfs_library.rst | 23 +- MAINTAINERS | 2 +- fs/9p/vfs_addr.c | 352 +---- fs/9p/vfs_file.c | 89 +- fs/9p/vfs_inode.c | 5 +- fs/9p/vfs_super.c | 14 +- fs/Kconfig | 1 - fs/Makefile | 1 - fs/afs/file.c | 213 +-- fs/afs/inode.c | 26 +- fs/afs/internal.h | 72 +- fs/afs/super.c | 2 +- fs/afs/write.c | 826 +---------- fs/cachefiles/internal.h | 2 +- fs/cachefiles/io.c | 10 +- fs/cachefiles/ondemand.c | 2 +- fs/ceph/addr.c | 25 +- fs/ceph/cache.h | 35 +- fs/ceph/inode.c | 2 +- fs/fs-writeback.c | 10 +- fs/fscache/Kconfig | 40 - fs/fscache/Makefile | 16 - fs/fscache/internal.h | 277 ---- fs/netfs/Kconfig | 39 + fs/netfs/Makefile | 22 +- fs/netfs/buffered_read.c | 229 ++- fs/netfs/buffered_write.c | 1247 +++++++++++++++++ fs/netfs/direct_read.c | 252 ++++ fs/netfs/direct_write.c | 170 +++ fs/{fscache/cache.c => netfs/fscache_cache.c} | 0 .../cookie.c => netfs/fscache_cookie.c} | 0 fs/netfs/fscache_internal.h | 14 + fs/{fscache/io.c => netfs/fscache_io.c} | 42 +- fs/{fscache/main.c => netfs/fscache_main.c} | 25 +- fs/{fscache/proc.c => netfs/fscache_proc.c} | 23 +- fs/{fscache/stats.c => netfs/fscache_stats.c} | 4 +- .../volume.c => netfs/fscache_volume.c} | 0 fs/netfs/internal.h | 288 ++++ fs/netfs/io.c | 214 ++- fs/netfs/iterator.c | 97 ++ fs/netfs/locking.c | 215 +++ fs/netfs/main.c | 110 ++ fs/netfs/misc.c | 260 ++++ fs/netfs/objects.c | 63 +- fs/netfs/output.c | 478 +++++++ fs/netfs/stats.c | 31 +- fs/nfs/Kconfig | 4 +- fs/nfs/fscache.c | 7 - fs/smb/client/cifsfs.c | 9 +- fs/smb/client/file.c | 18 +- fs/smb/client/fscache.c | 2 +- include/linux/fs.h | 2 +- include/linux/fscache.h | 45 - include/linux/netfs.h | 176 ++- include/linux/writeback.h | 2 +- include/trace/events/afs.h | 31 - include/trace/events/netfs.h | 155 +- mm/filemap.c | 1 + 58 files changed, 4197 insertions(+), 2123 deletions(-) delete mode 100644 fs/fscache/Kconfig delete mode 100644 fs/fscache/Makefile delete mode 100644 fs/fscache/internal.h create mode 100644 fs/netfs/buffered_write.c create mode 100644 fs/netfs/direct_read.c create mode 100644 fs/netfs/direct_write.c rename fs/{fscache/cache.c => netfs/fscache_cache.c} (100%) rename fs/{fscache/cookie.c => netfs/fscache_cookie.c} (100%) create mode 100644 fs/netfs/fscache_internal.h rename fs/{fscache/io.c => netfs/fscache_io.c} (86%) rename fs/{fscache/main.c => netfs/fscache_main.c} (84%) rename fs/{fscache/proc.c => netfs/fscache_proc.c} (58%) rename fs/{fscache/stats.c => netfs/fscache_stats.c} (97%) rename fs/{fscache/volume.c => netfs/fscache_volume.c} (100%) create mode 100644 fs/netfs/locking.c create mode 100644 fs/netfs/misc.c create mode 100644 fs/netfs/output.c
Comments
On Wed, 2023-12-13 at 15:23 +0000, David Howells wrote: > Hi Jeff, Steve, Dominique, > > I have been working on my netfslib helpers to the point that I can run > xfstests on AFS to completion (both with write-back buffering and, with a > small patch, write-through buffering in the pagecache). I have a patch for > 9P, but am currently unable to test it. > > The patches remove a little over 800 lines from AFS, 300 from 9P, albeit with > around 3000 lines added to netfs. Hopefully, I will be able to remove a bunch > of lines from Ceph too. > > I've split the CIFS patches out to a separate branch, cifs-netfs, where a > further 2000+ lines are removed. I can run a certain amount of xfstests on > CIFS, though I'm running into ksmbd issues and not all the tests work > correctly because of issues between fallocate and what the SMB protocol > actually supports. > > I've also dropped the content-crypto patches out for the moment as they're > only usable by the ceph changes which I'm still working on. > > The patch to use PG_writeback instead of PG_fscache for writing to the > cache has also been deferred, pending 9p, afs, ceph and cifs all being > converted. > > The main aims of these patches are to get high-level I/O and knowledge of > the pagecache out of the filesystem drivers as much as possible and to get > rid, as much of possible, of the knowledge that pages/folios exist. > > Further, I would like to see ->write_begin, ->write_end and ->launder_folio > go away. > > Features that are added by these patches to that which is already there in > netfslib: > > (1) NFS-style (and Ceph-style) locking around DIO vs buffered I/O calls to > prevent these from happening at the same time. mmap'd I/O can, of > necessity, happen at any time ignoring these locks. > > (2) Support for unbuffered I/O. The data is kept in the bounce buffer and > the pagecache is not used. This can be turned on with an inode flag. > > (3) Support for direct I/O. This is basically unbuffered I/O with some > extra restrictions and no RMW. > > (4) Support for using a bounce buffer in an operation. The bounce buffer > may be bigger than the target data/buffer, allowing for crypto > rounding. > > (5) ->write_begin() and ->write_end() are ignored in favour of merging all > of that into one function, netfs_perform_write(), thereby avoiding the > function pointer traversals. > > (6) Support for write-through caching in the pagecache. > netfs_perform_write() adds the pages is modifies to an I/O operation > as it goes and directly marks them writeback rather than dirty. When > writing back from write-through, it limits the range written back. > This should allow CIFS to deal with byte-range mandatory locks > correctly. > > (7) O_*SYNC and RWF_*SYNC writes use write-through rather than writing to > the pagecache and then flushing afterwards. An AIO O_*SYNC write will > notify of completion when the sub-writes all complete. > > (8) Support for write-streaming where modifed data is held in !uptodate > folios, with a private struct attached indicating the range that is > valid. > > (9) Support for write grouping, multiplexing a pointer to a group in the > folio private data with the write-streaming data. The writepages > algorithm only writes stuff back that's in the nominated group. This > is intended for use by Ceph to write is snaps in order. > > (10) Skipping reads for which we know the server could only supply zeros or > EOF (for instance if we've done a local write that leaves a hole in > the file and extends the local inode size). > > General notes: > > (1) The fscache module is merged into the netfslib module to avoid cyclic > exported symbol usage that prevents either module from being loaded. > > (2) Some helpers from fscache are reassigned to netfslib by name. > > (3) netfslib now makes use of folio->private, which means the filesystem > can't use it. > > (4) The filesystem provides wrappers to call the write helpers, allowing > it to do pre-validation, oplock/capability fetching and the passing in > of write group info. > > (5) I want to try flushing the data when tearing down an inode before > invalidating it to try and render launder_folio unnecessary. > > (6) Write-through caching will generate and dispatch write subrequests as > it gathers enough data to hit wsize and has whole pages that at least > span that size. This needs to be a bit more flexible, allowing for a > filesystem such as CIFS to have a variable wsize. > > (7) The filesystem driver is just given read and write calls with an > iov_iter describing the data/buffer to use. Ideally, they don't see > pages or folios at all. A function, extract_iter_to_sg(), is already > available to decant part of an iterator into a scatterlist for crypto > purposes. > > > 9P notes: > > (1) I haven't managed to test this as I haven't been able to get Ganesha > to work correctly with 9P. > > (2) Writes should now occur in larger-than-page-sized chunks. > > (3) It should be possible to turn on multipage folio support in 9P now. > > > Changes > ======= > ver #4) > - Slimmed down the branch: > - Split the cifs-related patches off to a separate branch (cifs-netfs) > - Deferred the content-encryption to the in-progress ceph changes. > - Deferred the use-PG_writeback rather than PG_fscache patch > - Rebased on a later linux-next with afs-rotation patches. > > ver #3) > - Moved the fscache module into netfslib to avoid export cycles. > - Fixed a bunch of bugs. > - Got CIFS to pass as much of xfstests as possible. > - Added a patch to make 9P use all the helpers. > - Added a patch to stop using PG_fscache, but rather dirty pages on > reading and have writepages write to the cache. > > ver #2) > - Folded the addition of NETFS_RREQ_NONBLOCK/BLOCKED into first patch that > uses them. > - Folded addition of rsize member into first user. > - Don't set rsize in ceph (yet) and set it in kafs to 256KiB. cifs sets > it dynamically. > - Moved direct_bv next to direct_bv_count in struct netfs_io_request and > labelled it with a __counted_by(). > - Passed flags into netfs_xa_store_and_mark() rather than two bools. > - Removed netfs_set_up_buffer() as it wasn't used. > > David > > Link: https://lore.kernel.org/r/20231013160423.2218093-1-dhowells@redhat.com/ # v1 > Link: https://lore.kernel.org/r/20231117211544.1740466-1-dhowells@redhat.com/ # v2 > > David Howells (39): > netfs, fscache: Move fs/fscache/* into fs/netfs/ > netfs, fscache: Combine fscache with netfs > netfs, fscache: Remove ->begin_cache_operation > netfs, fscache: Move /proc/fs/fscache to /proc/fs/netfs and put in a > symlink > netfs: Move pinning-for-writeback from fscache to netfs > netfs: Add a procfile to list in-progress requests > netfs: Allow the netfs to make the io (sub)request alloc larger > netfs: Add a ->free_subrequest() op > afs: Don't use folio->private to record partial modification > netfs: Provide invalidate_folio and release_folio calls > netfs: Implement unbuffered/DIO vs buffered I/O locking > netfs: Add iov_iters to (sub)requests to describe various buffers > netfs: Add support for DIO buffering > netfs: Provide tools to create a buffer in an xarray > netfs: Add bounce buffering support > netfs: Add func to calculate pagecount/size-limited span of an > iterator > netfs: Limit subrequest by size or number of segments > netfs: Export netfs_put_subrequest() and some tracepoints > netfs: Extend the netfs_io_*request structs to handle writes > netfs: Add a hook to allow tell the netfs to update its i_size > netfs: Make netfs_put_request() handle a NULL pointer > netfs: Make the refcounting of netfs_begin_read() easier to use > netfs: Prep to use folio->private for write grouping and streaming > write > netfs: Dispatch write requests to process a writeback slice > netfs: Provide func to copy data to pagecache for buffered write > netfs: Make netfs_read_folio() handle streaming-write pages > netfs: Allocate multipage folios in the writepath > netfs: Implement support for unbuffered/DIO read > netfs: Implement unbuffered/DIO write support > netfs: Implement buffered write API > netfs: Allow buffered shared-writeable mmap through > netfs_page_mkwrite() > netfs: Provide netfs_file_read_iter() > netfs, cachefiles: Pass upper bound length to allow expansion > netfs: Provide a writepages implementation > netfs: Provide a launder_folio implementation > netfs: Implement a write-through caching option > netfs: Optimise away reads above the point at which there can be no > data > afs: Use the netfs write helpers > 9p: Use netfslib read/write_iter > > Documentation/filesystems/netfs_library.rst | 23 +- > MAINTAINERS | 2 +- > fs/9p/vfs_addr.c | 352 +---- > fs/9p/vfs_file.c | 89 +- > fs/9p/vfs_inode.c | 5 +- > fs/9p/vfs_super.c | 14 +- > fs/Kconfig | 1 - > fs/Makefile | 1 - > fs/afs/file.c | 213 +-- > fs/afs/inode.c | 26 +- > fs/afs/internal.h | 72 +- > fs/afs/super.c | 2 +- > fs/afs/write.c | 826 +---------- > fs/cachefiles/internal.h | 2 +- > fs/cachefiles/io.c | 10 +- > fs/cachefiles/ondemand.c | 2 +- > fs/ceph/addr.c | 25 +- > fs/ceph/cache.h | 35 +- > fs/ceph/inode.c | 2 +- > fs/fs-writeback.c | 10 +- > fs/fscache/Kconfig | 40 - > fs/fscache/Makefile | 16 - > fs/fscache/internal.h | 277 ---- > fs/netfs/Kconfig | 39 + > fs/netfs/Makefile | 22 +- > fs/netfs/buffered_read.c | 229 ++- > fs/netfs/buffered_write.c | 1247 +++++++++++++++++ > fs/netfs/direct_read.c | 252 ++++ > fs/netfs/direct_write.c | 170 +++ > fs/{fscache/cache.c => netfs/fscache_cache.c} | 0 > .../cookie.c => netfs/fscache_cookie.c} | 0 > fs/netfs/fscache_internal.h | 14 + > fs/{fscache/io.c => netfs/fscache_io.c} | 42 +- > fs/{fscache/main.c => netfs/fscache_main.c} | 25 +- > fs/{fscache/proc.c => netfs/fscache_proc.c} | 23 +- > fs/{fscache/stats.c => netfs/fscache_stats.c} | 4 +- > .../volume.c => netfs/fscache_volume.c} | 0 > fs/netfs/internal.h | 288 ++++ > fs/netfs/io.c | 214 ++- > fs/netfs/iterator.c | 97 ++ > fs/netfs/locking.c | 215 +++ > fs/netfs/main.c | 110 ++ > fs/netfs/misc.c | 260 ++++ > fs/netfs/objects.c | 63 +- > fs/netfs/output.c | 478 +++++++ > fs/netfs/stats.c | 31 +- > fs/nfs/Kconfig | 4 +- > fs/nfs/fscache.c | 7 - > fs/smb/client/cifsfs.c | 9 +- > fs/smb/client/file.c | 18 +- > fs/smb/client/fscache.c | 2 +- > include/linux/fs.h | 2 +- > include/linux/fscache.h | 45 - > include/linux/netfs.h | 176 ++- > include/linux/writeback.h | 2 +- > include/trace/events/afs.h | 31 - > include/trace/events/netfs.h | 155 +- > mm/filemap.c | 1 + > 58 files changed, 4197 insertions(+), 2123 deletions(-) > delete mode 100644 fs/fscache/Kconfig > delete mode 100644 fs/fscache/Makefile > delete mode 100644 fs/fscache/internal.h > create mode 100644 fs/netfs/buffered_write.c > create mode 100644 fs/netfs/direct_read.c > create mode 100644 fs/netfs/direct_write.c > rename fs/{fscache/cache.c => netfs/fscache_cache.c} (100%) > rename fs/{fscache/cookie.c => netfs/fscache_cookie.c} (100%) > create mode 100644 fs/netfs/fscache_internal.h > rename fs/{fscache/io.c => netfs/fscache_io.c} (86%) > rename fs/{fscache/main.c => netfs/fscache_main.c} (84%) > rename fs/{fscache/proc.c => netfs/fscache_proc.c} (58%) > rename fs/{fscache/stats.c => netfs/fscache_stats.c} (97%) > rename fs/{fscache/volume.c => netfs/fscache_volume.c} (100%) > create mode 100644 fs/netfs/locking.c > create mode 100644 fs/netfs/misc.c > create mode 100644 fs/netfs/output.c > This all looks pretty great, David. Nice work! I had a few comments on a few of them, but most are no big deal. It'd be nice to get this into linux-next soon. On the ones where I didn't have comments, you can add: Reviewed-by: Jeff Layton <jlayton@kernel.org>
On Wed, 13 Dec 2023 15:23:10 +0000, David Howells wrote: > I have been working on my netfslib helpers to the point that I can run > xfstests on AFS to completion (both with write-back buffering and, with a > small patch, write-through buffering in the pagecache). I have a patch for > 9P, but am currently unable to test it. > > The patches remove a little over 800 lines from AFS, 300 from 9P, albeit with > around 3000 lines added to netfs. Hopefully, I will be able to remove a bunch > of lines from Ceph too. > > [...] Ok, that's on vfs.netfs for now. It's based on vfs.rw as that has splice changes that would cause needless conflicts. It helps to not have such series based on -next. Fwiw, I'd rather have this based on a mainline tag in the future. Linus has stated loads of times that he doesn't mind handling merge conflicts and for me it's a lot easier if I have a stable mainline tag. linux-next is too volatile. Thanks! --- Applied to the vfs.netfs branch of the vfs/vfs.git tree. Patches in the vfs.netfs branch should appear in linux-next soon. Please report any outstanding bugs that were missed during review in a new review to the original patch series allowing us to drop it. It's encouraged to provide Acked-bys and Reviewed-bys even though the patch has now been applied. If possible patch trailers will be updated. Note that commit hashes shown below are subject to change due to rebase, trailer updates or similar. If in doubt, please check the listed branch. tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git branch: vfs.netfs [01/39] netfs, fscache: Move fs/fscache/* into fs/netfs/ https://git.kernel.org/vfs/vfs/c/94029f4c6459 [02/39] netfs, fscache: Combine fscache with netfs https://git.kernel.org/vfs/vfs/c/77eb7aa4805e [03/39] netfs, fscache: Remove ->begin_cache_operation https://git.kernel.org/vfs/vfs/c/a7f70e4b4ebf [04/39] netfs, fscache: Move /proc/fs/fscache to /proc/fs/netfs and put in a symlink https://git.kernel.org/vfs/vfs/c/131e9eb7bd1f [05/39] netfs: Move pinning-for-writeback from fscache to netfs https://git.kernel.org/vfs/vfs/c/1792e1940f54 [06/39] netfs: Add a procfile to list in-progress requests https://git.kernel.org/vfs/vfs/c/1491057f69dc [07/39] netfs: Allow the netfs to make the io (sub)request alloc larger https://git.kernel.org/vfs/vfs/c/6c3efd20150f [08/39] netfs: Add a ->free_subrequest() op https://git.kernel.org/vfs/vfs/c/e0b44a08ac20 [09/39] afs: Don't use folio->private to record partial modification https://git.kernel.org/vfs/vfs/c/9d2a996de9a2 [10/39] netfs: Provide invalidate_folio and release_folio calls https://git.kernel.org/vfs/vfs/c/6136f4723a2e [11/39] netfs: Implement unbuffered/DIO vs buffered I/O locking https://git.kernel.org/vfs/vfs/c/1243d122feca [12/39] netfs: Add iov_iters to (sub)requests to describe various buffers https://git.kernel.org/vfs/vfs/c/a164fd03f073 [13/39] netfs: Add support for DIO buffering https://git.kernel.org/vfs/vfs/c/669e8c33691d [14/39] netfs: Provide tools to create a buffer in an xarray https://git.kernel.org/vfs/vfs/c/c554dc89292d [15/39] netfs: Add bounce buffering support https://git.kernel.org/vfs/vfs/c/476c24c3e80b [16/39] netfs: Add func to calculate pagecount/size-limited span of an iterator https://git.kernel.org/vfs/vfs/c/25d0f84de71d [17/39] netfs: Limit subrequest by size or number of segments https://git.kernel.org/vfs/vfs/c/53ee4e38619a [18/39] netfs: Export netfs_put_subrequest() and some tracepoints https://git.kernel.org/vfs/vfs/c/ac3fc1846a06 [19/39] netfs: Extend the netfs_io_*request structs to handle writes https://git.kernel.org/vfs/vfs/c/90999722fa0b [20/39] netfs: Add a hook to allow tell the netfs to update its i_size https://git.kernel.org/vfs/vfs/c/27dfd078db66 [21/39] netfs: Make netfs_put_request() handle a NULL pointer https://git.kernel.org/vfs/vfs/c/0ffd2319fb64 [22/39] netfs: Make the refcounting of netfs_begin_read() easier to use https://git.kernel.org/vfs/vfs/c/f7125395caba [23/39] netfs: Prep to use folio->private for write grouping and streaming write https://git.kernel.org/vfs/vfs/c/acadf22234e3 [24/39] netfs: Dispatch write requests to process a writeback slice https://git.kernel.org/vfs/vfs/c/17c2b775e3f4 [25/39] netfs: Provide func to copy data to pagecache for buffered write https://git.kernel.org/vfs/vfs/c/dd6ed9717a0b [26/39] netfs: Make netfs_read_folio() handle streaming-write pages https://git.kernel.org/vfs/vfs/c/c958b464f07f [27/39] netfs: Allocate multipage folios in the writepath https://git.kernel.org/vfs/vfs/c/6076cc863769 [28/39] netfs: Implement support for unbuffered/DIO read https://git.kernel.org/vfs/vfs/c/9409fe70ca46 [29/39] netfs: Implement unbuffered/DIO write support https://git.kernel.org/vfs/vfs/c/7acd7b902241 [30/39] netfs: Implement buffered write API https://git.kernel.org/vfs/vfs/c/7b1321366337 [31/39] netfs: Allow buffered shared-writeable mmap through netfs_page_mkwrite() https://git.kernel.org/vfs/vfs/c/d156da6e235c [32/39] netfs: Provide netfs_file_read_iter() https://git.kernel.org/vfs/vfs/c/899ae1e25a64 [33/39] netfs, cachefiles: Pass upper bound length to allow expansion https://git.kernel.org/vfs/vfs/c/52882c158a30 [34/39] netfs: Provide a writepages implementation https://git.kernel.org/vfs/vfs/c/02bf7b4afdba [35/39] netfs: Provide a launder_folio implementation https://git.kernel.org/vfs/vfs/c/cf4e16d98659 [36/39] netfs: Implement a write-through caching option https://git.kernel.org/vfs/vfs/c/7bf6f13f4a63 [37/39] netfs: Optimise away reads above the point at which there can be no data https://git.kernel.org/vfs/vfs/c/fad15293bd0d [38/39] afs: Use the netfs write helpers https://git.kernel.org/vfs/vfs/c/0095df30ad7b [39/39] 9p: Use netfslib read/write_iter https://git.kernel.org/vfs/vfs/c/361e79613421
Christian Brauner wrote on Fri, Dec 15, 2023 at 01:03:14PM +0100: > tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git > branch: vfs.netfs This doesn't seem to build: ------- CC [M] fs/netfs/buffered_write.o fs/netfs/buffered_write.c: In function ‘netfs_kill_pages’: fs/netfs/buffered_write.c:569:17: error: implicit declaration of function ‘generic_error_remove_folio’; did you mean ‘generic_error_remove_page’? [-Werror=implicit-function-declaration] 569 | generic_error_remove_folio(mapping, folio); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ | generic_error_remove_page cc1: some warnings being treated as errors ------- This helper is present in -next as commit af7628d6ec19 ("fs: convert error_remove_page to error_remove_folio") (as of now's next), apparently from akpm's mm-stable: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-stable (which obviously have some conflict in afs when trying to merge...) I'll go back to dhowell's tree to finally test 9p a bit, sorry for lack of involvement just low on time all around. Good luck (?),
On Fri, Dec 15, 2023 at 10:29:43PM +0900, Dominique Martinet wrote: > Christian Brauner wrote on Fri, Dec 15, 2023 at 01:03:14PM +0100: > > tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git > > branch: vfs.netfs > > This doesn't seem to build: Yeah, I'm aware. That's why I didn't push it out. I couldn't finish the rebase completely on Friday.
Dominique Martinet <asmadeus@codewreck.org> wrote: > I'll go back to dhowell's tree to finally test 9p a bit, > sorry for lack of involvement just low on time all around. I've rebased my tree on -rc6 rather than linux-next for Christian to pull. Ganesha keeps falling over: [root@carina build]# valgrind ./ganesha.nfsd -L /var/log/ganesha/ganesha.log -f /etc/ganesha/ganesha.conf -N NIV_EVENT -F ==38960== Memcheck, a memory error detector ==38960== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==38960== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info ==38960== Command: ./ganesha.nfsd -L /var/log/ganesha/ganesha.log -f /etc/ganesha/ganesha.conf -N NIV_EVENT -F ==38960== ==38960== Thread 138: ==38960== Invalid read of size 4 ==38960== at 0x4DC32D6: pthread_cond_signal@@GLIBC_2.3.2 (pthread_cond_signal.c:41) ==38960== by 0x489700C: sync_cb (fsal_helper.c:1837) ==38960== by 0x49D79DF: mdc_read_super_cb (mdcache_file.c:559) ==38960== by 0x49D7AC5: mdc_read_cb (mdcache_file.c:582) ==38960== by 0x7B4B81F: vfs_read2 (file.c:1317) ==38960== by 0x49D7BCF: mdcache_read2 (mdcache_file.c:617) ==38960== by 0x4897173: fsal_read (fsal_helper.c:1849) ==38960== by 0x4A10FD4: _9p_read (9p_read.c:134) ==38960== by 0x4A0A024: _9p_process_buffer (9p_interpreter.c:181) ==38960== by 0x4A09DCB: _9p_tcp_process_request (9p_interpreter.c:133) ==38960== by 0x48CE182: _9p_execute (9p_dispatcher.c:315) ==38960== by 0x48CE508: _9p_worker_run (9p_dispatcher.c:412) ==38960== Address 0x24 is not stack'd, malloc'd or (recently) free'd ==38960== ==38960== ==38960== Process terminating with default action of signal 11 (SIGSEGV): dumping core ==38960== Access not within mapped region at address 0x24 ==38960== at 0x4DC32D6: pthread_cond_signal@@GLIBC_2.3.2 (pthread_cond_signal.c:41) ==38960== by 0x489700C: sync_cb (fsal_helper.c:1837) ==38960== by 0x49D79DF: mdc_read_super_cb (mdcache_file.c:559) ==38960== by 0x49D7AC5: mdc_read_cb (mdcache_file.c:582) ==38960== by 0x7B4B81F: vfs_read2 (file.c:1317) ==38960== by 0x49D7BCF: mdcache_read2 (mdcache_file.c:617) ==38960== by 0x4897173: fsal_read (fsal_helper.c:1849) ==38960== by 0x4A10FD4: _9p_read (9p_read.c:134) ==38960== by 0x4A0A024: _9p_process_buffer (9p_interpreter.c:181) ==38960== by 0x4A09DCB: _9p_tcp_process_request (9p_interpreter.c:133) ==38960== by 0x48CE182: _9p_execute (9p_dispatcher.c:315) ==38960== by 0x48CE508: _9p_worker_run (9p_dispatcher.c:412) David
On Wed, Dec 20, 2023 at 10:04:26AM +0000, David Howells wrote: > Dominique Martinet <asmadeus@codewreck.org> wrote: > > > I'll go back to dhowell's tree to finally test 9p a bit, > > sorry for lack of involvement just low on time all around. > > I've rebased my tree on -rc6 rather than linux-next for Christian to pull. Pulled. Thank you, David. It's on vfs.netfs.