* [PATCH] mm: Removing the card during write
@ 2025-07-28 14:13 laishangzhen
2025-07-28 14:42 ` Matthew Wilcox
0 siblings, 1 reply; 2+ messages in thread
From: laishangzhen @ 2025-07-28 14:13 UTC (permalink / raw)
To: Matthew Wilcox, Andrew Morton; +Cc: linux-fsdevel, linux-kernel, laishangzhen
operations blocks the I/O process
when during the process
Issue encountered:
When formatting an SD card to ext4 using mkfs.ext4,
if the card is ejected during the process,
the formatting process blocks at
balance_dirty_pages_ratelimited.
task:mkfs.ext4 state:D stack:
0 pid: 900 ppid: 889 flags:0x00000000
(__schedule)
(schedule) from
(schedule_timeout)
(io_schedule_timeout)
(balance_dirty_pages_ratelimited)
(generic_perform_write)
(__generic_file_write_iter)
(blkdev_write_iter)
(vfs_write)
(ksys_pwrite64)
Exception stack(0xc2283fa8 to 0xc2283ff0)
Modification approach:
After card ejection,
the dev in the bdi (backing_dev_info) is
released in del_gendisk.
Within generic_perform_write,
if writeback is supported,
it directly checks whether bdi->dev is NULL to determine
if the card has been ejected.
Once ejected, it becomes unnecessary to proceed
with page allocation and data writing.
Signed-off-by: laishangzhen <laishangzhen@163.com>
---
mm/filemap.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/mm/filemap.c b/mm/filemap.c
index 6af6d8f29..5d6ba9f02 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -4087,6 +4087,8 @@ ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
struct address_space *mapping = file->f_mapping;
const struct address_space_operations *a_ops = mapping->a_ops;
size_t chunk = mapping_max_folio_size(mapping);
+ struct inode *inode = mapping->host;
+ struct backing_dev_info *bdi = inode_to_bdi(inode);
long status = 0;
ssize_t written = 0;
@@ -4101,6 +4103,12 @@ ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
retry:
offset = pos & (chunk - 1);
bytes = min(chunk - offset, bytes);
+ if (bdi->capabilities & BDI_CAP_WRITEBACK) {
+ if (bdi->dev == NULL) {
+ status = -ENODEV;
+ break;
+ }
+ }
balance_dirty_pages_ratelimited(mapping);
if (fatal_signal_pending(current)) {
--
2.25.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] mm: Removing the card during write
2025-07-28 14:13 [PATCH] mm: Removing the card during write laishangzhen
@ 2025-07-28 14:42 ` Matthew Wilcox
0 siblings, 0 replies; 2+ messages in thread
From: Matthew Wilcox @ 2025-07-28 14:42 UTC (permalink / raw)
To: laishangzhen; +Cc: Andrew Morton, linux-fsdevel, linux-kernel
On Mon, Jul 28, 2025 at 07:13:06AM -0700, laishangzhen wrote:
> When formatting an SD card to ext4 using mkfs.ext4,
> if the card is ejected during the process,
> the formatting process blocks at
> balance_dirty_pages_ratelimited.
You're fixing this in the wrong place; it should be in mm/page-writeback.c
somewhere.
But it really needs a more thorough analysis than this. To date we do
not handle removable media well. I wrote up a proposal in 2018 here:
http://www.wil.cx/~willy/banbury.html but I haven't done any work
towards it.
You're proposing an entirely different approach which is to just,
well, kill applications. This leaves pages in the page cache which are
effectively leaked. If we continue on this path, we'd also want a way to
release all the pages in the page cache associated with this block device.
And that's a harder problem than you might think.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-07-28 14:42 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-28 14:13 [PATCH] mm: Removing the card during write laishangzhen
2025-07-28 14:42 ` Matthew Wilcox
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).