[PATCH 4/4] ubifs: Convert do_writepage() to take a folio
Richard Weinberger
richard at nod.at
Mon Jun 5 23:13:55 PDT 2023
Matthew,
----- Ursprüngliche Mail -----
> Von: "Matthew Wilcox" <willy at infradead.org>
> len is folio_size(), which is not 0.
>
> len = offset_in_folio(folio, i_size);
offset_in_folio(folio, i_size) can give 0.
Further it will call do_writepage() with len being 0.
I can actually trigger this case.
By adding the following ubifs_assert() I can catch the write side.
If the file length is a multiple of PAGE_SIZE (4k), it will trigger.
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index 67cf5138ccc48..dc39ea368ca2b 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1059,6 +1059,8 @@ static int ubifs_writepage(struct folio *folio, struct writeback_control *wbc,
folio_zero_segment(folio, offset_in_folio(folio, i_size), len);
len = offset_in_folio(folio, i_size);
+ ubifs_assert(c, len > 0);
+
if (i_size > synced_i_size) {
err = inode->i_sb->s_op->write_inode(inode, NULL);
if (err)
[ 44.569110] UBIFS error (ubi0:0 pid 59): ubifs_assert_failed: UBIFS assert failed: len > 0, in fs/ubifs/file.c:1062
[ 44.571359] UBIFS warning (ubi0:0 pid 59): ubifs_ro_mode.part.6: switched to read-only mode, error -22
[ 44.572998] CPU: 1 PID: 59 Comm: kworker/u8:2 Not tainted 6.4.0-rc5-00004-gd504b815b71c-dirty #19
[ 44.574139] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.15.0-0-g2dd4b9b-rebuilt.opensuse.org 04/01/2014
[ 44.574141] Workqueue: writeback wb_workfn (flush-ubifs_0_0)
[ 44.574148] Call Trace:
[ 44.574162] <TASK>
[ 44.574165] dump_stack_lvl+0x32/0x50
[ 44.574172] ubifs_writepage+0x25a/0x270
[ 44.578096] write_cache_pages+0x132/0x3a0
[ 44.578103] ? __pfx_ubifs_writepage+0x10/0x10
[ 44.578107] ? virtqueue_add_sgs+0x7b/0x90
[ 44.578113] do_writepages+0xd3/0x1a0
[ 44.578116] ? kvm_clock_read+0x14/0x30
[ 44.578121] ? kvm_sched_clock_read+0x5/0x20
[ 44.578125] __writeback_single_inode+0x3c/0x350
[ 44.578128] writeback_sb_inodes+0x1c9/0x460
[ 44.578133] __writeback_inodes_wb+0x5a/0xc0
[ 44.582508] wb_writeback+0x230/0x2c0
[ 44.582513] wb_workfn+0x301/0x430
[ 44.582515] ? kvm_clock_read+0x14/0x30
[ 44.582519] ? kvm_sched_clock_read+0x5/0x20
[ 44.582523] ? sched_clock_cpu+0xd/0x190
[ 44.582527] ? __smp_call_single_queue+0xa1/0x110
[ 44.582532] process_one_work+0x1f3/0x3f0
[ 44.582538] worker_thread+0x25/0x3b0
[ 44.586196] ? __pfx_worker_thread+0x10/0x10
[ 44.586201] kthread+0xde/0x110
[ 44.586204] ? __pfx_kthread+0x10/0x10
[ 44.586207] ret_from_fork+0x2c/0x50
[ 44.586212] </TASK>
Thanks,
//richard
More information about the linux-mtd
mailing list