From: Matthew Wilcox <willy@infradead.org>
To: Christoph Hellwig <hch@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Jan Kara <jack@suse.cz>,
linux-fsdevel@vger.kernel.org
Subject: Re: Why does mpage_writepage() not handle locked buffers?
Date: Fri, 15 Dec 2023 17:21:12 +0000 [thread overview]
Message-ID: <ZXyLCJL1o+DFbHh4@casper.infradead.org> (raw)
In-Reply-To: <ZXwvU2CXEeqxSDgA@infradead.org>
On Fri, Dec 15, 2023 at 02:49:55AM -0800, Christoph Hellwig wrote:
> On Fri, Dec 15, 2023 at 05:43:53AM +0000, Matthew Wilcox wrote:
> > block_write_full_page() handles this fine, so why isn't this
> >
> > if (buffer_locked(bh))
> > goto confused;
> >
> > Is the thought that we hold the folio locked, therefore no buffers
> > should be locked at this time? I don't know the rules.
>
> That would be my guess. For writeback on the fs mapping no one
> else should ever have locked the buffer. For the bdev mapping
> buffer locking isn't completely controlled by the bdevfs, but also
> by any mounted fs using the buffer cache. So from my POV your
> above change should be ok, but it'll need a big fat comment so
> that the next person seeing it in 20 years isn't as confused as
> you are now :)
Thanks! Now I'm thinking that it's not OK to call mpage_writepages().
__block_write_full_folio() takes the buffer lock and holds it across the
I/O (it seems that we never split the buffer lock into buffer writeback
like we did the page lock?) So filesystems may have an expectation that
locking the buffer synchronises with writeback. Perhaps it's safest to
just call block_write_full_page() in a loop for blockdev?
I wrote up this before realising that I'd misread the code; adding it
here for posterity.
For filesystems, we know that the filesystem will not lock the buffer
since the writeback path holds the folio locked at this point. For block
devices, the filesystem mounted on it may lock the buffer without locking
the folio first (observed with both ext2 and ext4). If we find the
buffer locked, just fall back to block_write_full_page() which handles
potentially locked buffers correctly. It's fine if we win the race and
the filesystem locks the buffer after this point; block_write_full_page()
doesn't hold the buffer locked across the I/O, so the filesystem has no
expectations that locking the buffer will wait for data writeback.
prev parent reply other threads:[~2023-12-15 17:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-15 5:43 Why does mpage_writepage() not handle locked buffers? Matthew Wilcox
2023-12-15 10:49 ` Christoph Hellwig
2023-12-15 17:21 ` Matthew Wilcox [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=ZXyLCJL1o+DFbHh4@casper.infradead.org \
--to=willy@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).