From: Paulo Alcantara <pc@manguebit.org>
To: Matthew Wilcox <willy@infradead.org>
Cc: linux-cifs@vger.kernel.org, netfs@lists.linux.dev,
David Howells <dhowells@redhat.com>,
Christian Brauner <brauner@kernel.org>,
Namjae Jeon <linkinjeon@kernel.org>,
Ronnie Sahlberg <ronniesahlberg@gmail.com>,
Shyam Prasad N <sprasad@microsoft.com>,
Tom Talpey <tom@talpey.com>, Bharath SM <bharathsm@microsoft.com>,
stable@vger.kernel.org
Subject: Re: [PATCH v2 1/5] netfs: clear post-EOF pagecache when extending a file via write
Date: Wed, 23 Sep 2026 20:46:35 -0300 [thread overview]
Message-ID: <b5a645319f7b2475f65306c3445953db@manguebit.org> (raw)
In-Reply-To: <arHVJ0ihdqmNETMw@casper.infradead.org>
Matthew Wilcox <willy@infradead.org> writes:
> On Mon, Sep 21, 2026 at 08:07:51PM -0300, Paulo Alcantara wrote:
>> + int netfs_clear_stale_post_eof(struct inode *inode, unsigned long long from,
>> + unsigned long long to, bool nowait);
>
> Should this be uoff_t? Or even loff_t?
uoff_t.
>
>> +int netfs_clear_stale_post_eof(struct inode *inode, unsigned long long from,
>> + unsigned long long to, bool nowait)
>> +{
>> + struct address_space *mapping = inode->i_mapping;
>> + fgf_t fgp = FGP_LOCK;
>> + struct folio *folio;
>> +
>> + if (from >= to)
>> + return 0;
>> +
>> + if (nowait)
>> + fgp |= FGP_NOWAIT;
>> +
>> + folio = __filemap_get_folio(mapping, from >> PAGE_SHIFT, fgp, 0);
>> + if (IS_ERR(folio))
>> + return PTR_ERR(folio) == -EAGAIN ? -EAGAIN : 0;
>> +
>> + if (folio_mkclean(folio))
>> + folio_mark_dirty(folio);
>> +
>> + if (folio_test_uptodate(folio)) {
>> + size_t end = umin(to - folio_pos(folio), folio_size(folio));
>> + size_t offset = offset_in_folio(folio, from);
>> +
>> + folio_zero_segment(folio, offset, end);
>> + }
>> +
>> + folio_unlock(folio);
>> + folio_put(folio);
>> + return 0;
>> +}
>> +EXPORT_SYMBOL(netfs_clear_stale_post_eof);
>
> This looks suspiciously similar to pagecache_isize_extended() but does
> not mention it. So any updates to that function will probably imss this
> one. That's not great.
True. Sorry about that.
There are some reasons that I ended up with our own helper:
- The block size checks make no sense for CIFS, as reads and writes will
be byte aligned. For instance, CIFS and AFS set block size to >=
PAGE_SIZE, therefore calling pagecache_isize_extended() is a no-op for
them.
- netfslib needs to honour NOWAIT, which pagecache_isize_extended()
can't do due to filemap_lock_folio() and folio_mkclean(). Besides, we
would also need to return -EAGAIN in case the folio is mapped or under
writeback.
- netfs_clear_stale_post_eof() will be called before i_size is updated,
so we re-check i_size after acquiring the folio lock. It runs with
i_rwsem held shared in both the buffered and unbuffered/DIO paths, so
extending writers might concurrently change i_size while we run.
pagecache_isize_extended() can't also be used as it requires to be
called after i_size is updated, therefore hitting WARN_ON(to >
inode->i_size).
NFS also has its own helper (nfs_truncate_last_folio), but couldn't
re-use it due to above reasons.
Please let me know if you have any ideas.
This is what I currently have for new helper (trying to address some
issues found out by sashiko as well):
int netfs_clear_stale_post_eof(struct inode *inode,
uoff_t from, uoff_t to, bool nowait)
{
struct address_space *mapping = inode->i_mapping;
fgf_t fgp = FGP_LOCK;
struct folio *folio;
int ret;
if (from >= to)
return 0;
if (nowait)
fgp |= FGP_NOWAIT;
folio = __filemap_get_folio(mapping, from >> PAGE_SHIFT, fgp, 0);
if (IS_ERR(folio))
return PTR_ERR(folio) == -EAGAIN ? -EAGAIN : 0;
ret = 0;
if (nowait && (folio_mapped(folio) || folio_test_writeback(folio))) {
ret = -EAGAIN;
goto out;
}
folio_wait_writeback(folio);
if (folio_mkclean(folio))
folio_mark_dirty(folio);
if (folio_test_uptodate(folio)) {
uoff_t fpos = folio_pos(folio);
from = umax(from, i_size_read(inode));
if (from < to && from < fpos + folio_size(folio)) {
size_t end = umin(to - fpos, folio_size(folio));
size_t offset = from - fpos;
folio_zero_segment(folio, offset, end);
}
}
out:
folio_unlock(folio);
folio_put(folio);
return ret;
}
next prev parent reply other threads:[~2026-09-23 23:46 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 23:07 [PATCH v2 1/5] netfs: clear post-EOF pagecache when extending a file via write Paulo Alcantara
2026-09-21 23:07 ` [PATCH v2 2/5] smb: client: clear post-EOF pagecache when extending a file via truncate Paulo Alcantara
2026-09-21 23:07 ` [PATCH v2 3/5] smb: client: discard post-EOF pagecache when extending a file via zero range Paulo Alcantara
2026-09-21 23:07 ` [PATCH v2 4/5] smb: client: discard post-EOF pagecache when extending a file via copy range Paulo Alcantara
2026-09-21 23:07 ` [PATCH v2 5/5] smb: client: discard post-EOF pagecache when extending a file via clone range Paulo Alcantara
2026-09-22 0:08 ` [PATCH v2 1/5] netfs: clear post-EOF pagecache when extending a file via write Paulo Alcantara
2026-09-22 1:08 ` Matthew Wilcox
2026-09-23 19:20 ` David Howells
2026-09-23 23:46 ` Paulo Alcantara [this message]
2026-09-24 4:16 ` Matthew Wilcox
2026-09-24 13:43 ` Paulo Alcantara
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=b5a645319f7b2475f65306c3445953db@manguebit.org \
--to=pc@manguebit.org \
--cc=bharathsm@microsoft.com \
--cc=brauner@kernel.org \
--cc=dhowells@redhat.com \
--cc=linkinjeon@kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=netfs@lists.linux.dev \
--cc=ronniesahlberg@gmail.com \
--cc=sprasad@microsoft.com \
--cc=stable@vger.kernel.org \
--cc=tom@talpey.com \
--cc=willy@infradead.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