From: Frank Sorenson <sorenson@redhat.com>
To: David Howells <dhowells@redhat.com>
Cc: Paulo Alcantara <pc@manguebit.org>,
Jeff Layton <jlayton@kernel.org>,
linux-fsdevel@vger.kernel.org, netfs@lists.linux.dev,
CIFS <linux-cifs@vger.kernel.org>,
linux-kernel@vger.kernel.org
Subject: Re: netfs_read_gaps(): aliased sink folio makes the read destination unreadable, SIGBUS on cifs with signing
Date: Wed, 9 Sep 2026 16:08:34 -0500 [thread overview]
Message-ID: <317dd59c-819f-4bbe-a196-3946c30eb0a3@redhat.com> (raw)
In-Reply-To: <1730052.1788974127@warthog.procyon.org.uk>
On 9/9/26 12:15 PM, David Howells wrote:
> Try #3...
>
> David
retested successfully with v3
Frank
> ---
> commit 05abad6ef207137fd3a2559d6ac242d1f94c60aa
> Author: David Howells <dhowells@redhat.com>
> Date: Wed Sep 9 11:36:30 2026 +0100
>
> netfs: Fix netfs_read_gaps() to use separate sink folios
>
> Fix netfs_read_gaps() to use separate folios rather than re-using a single
> sink folio to discard the unwanted data so that cifs checksum checking sees
> all the data that was fetched.
>
> Fixes: 7f84a7b9892d ("netfs: Make netfs_read_folio() handle streaming-write pages")
> Reported-by: Frank Sorenson <sorenson@redhat.com>
> Closes: https://lore.kernel.org/r/a385053c-1c4a-4060-a3bb-befa007ddb33@redhat.com/
> Signed-off-by: David Howells <dhowells@redhat.com>
> Tested-by: Frank Sorenson <sorenson@redhat.com>
> cc: Paulo Alcantara <pc@manguebit.org>
> cc: Namjae Jeon <linkinjeon@kernel.org>
> cc: netfs@lists.linux.dev
> cc: linux-cifs@vger.kernel.org
> cc: linux-fsdevel@vger.kernel.org
>
> diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c
> index 424df70a5c30..105194de6e13 100644
> --- a/fs/netfs/buffered_read.c
> +++ b/fs/netfs/buffered_read.c
> @@ -482,15 +482,14 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
> struct netfs_group *group = netfs_folio_group(folio);
> struct netfs_folio *finfo = netfs_folio_info(folio);
> struct netfs_inode *ctx = netfs_inode(mapping->host);
> - struct folio *sink = NULL;
> - struct bio_vec *bvec;
> + struct bio_vec *bvec = NULL;
> unsigned int from = finfo->dirty_offset;
> unsigned int to = from + finfo->dirty_len;
> - unsigned int off = 0, i = 0;
> + unsigned int off = 0;
> size_t flen = folio_size(folio);
> size_t nr_bvec = flen / PAGE_SIZE + 2;
> size_t part;
> - int ret;
> + int ret, i = 0, sink_from = -1, sink_to = -1;
>
> _enter("%lx", folio->index);
>
> @@ -515,24 +514,23 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
> if (!bvec)
> goto discard;
>
> - sink = folio_alloc(GFP_KERNEL, 0);
> - if (!sink) {
> - kfree(bvec);
> - goto discard;
> - }
> -
> trace_netfs_folio(folio, netfs_folio_trace_read_gaps);
>
> - rreq->direct_bv = bvec;
> - rreq->direct_bv_count = nr_bvec;
> if (from > 0) {
> bvec_set_folio(&bvec[i++], folio, from, 0);
> off = from;
> }
> + sink_from = i;
> while (off < to) {
> + struct folio *sink = folio_alloc(GFP_KERNEL, 0);
> +
> + if (!sink)
> + goto discard;
> part = min_t(size_t, to - off, PAGE_SIZE);
> - bvec_set_folio(&bvec[i++], sink, part, 0);
> + bvec_set_folio(&bvec[i], sink, part, 0);
> off += part;
> + sink_to = i;
> + i++;
> }
> if (to < flen)
> bvec_set_folio(&bvec[i++], folio, flen - to, to);
> @@ -553,8 +551,10 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
> folio_mark_uptodate(folio);
> }
>
> - if (sink)
> - folio_put(sink);
> + if (sink_to >= 0)
> + for (; sink_from <= sink_to; sink_from++)
> + folio_put(bvec_folio(&bvec[sink_from]));
> + kfree(bvec);
> folio_unlock(folio);
> netfs_put_request(rreq, netfs_rreq_trace_put_return);
> return ret < 0 ? ret : 0;
> @@ -563,6 +563,10 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
> netfs_put_failed_request(rreq);
> alloc_error:
> folio_unlock(folio);
> + if (sink_to >= 0)
> + for (; sink_from <= sink_to; sink_from++)
> + folio_put(bvec_folio(&bvec[sink_from]));
> + kfree(bvec);
> return ret;
> }
>
--
Frank Sorenson
sorenson@redhat.com
Principal Software Maintenance Engineer, filesystems
Red Hat
prev parent reply other threads:[~2026-09-09 21:08 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 23:24 netfs_read_gaps(): aliased sink folio makes the read destination unreadable, SIGBUS on cifs with signing Frank Sorenson
2026-09-09 11:15 ` David Howells
2026-09-09 16:11 ` Frank Sorenson
2026-09-09 16:34 ` David Howells
2026-09-09 17:13 ` David Howells
2026-09-09 17:14 ` David Howells
2026-09-09 17:15 ` David Howells
2026-09-09 21:08 ` Frank Sorenson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=317dd59c-819f-4bbe-a196-3946c30eb0a3@redhat.com \
--to=sorenson@redhat.com \
--cc=dhowells@redhat.com \
--cc=jlayton@kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netfs@lists.linux.dev \
--cc=pc@manguebit.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox