Hi XiangYu,
Just noticed that. Why it's needed for Linux 6.1 LTS?
Just see my reply, I think 6.1 LTS is not impacted:
https://lore.kernel.org/r/686626cd-7dcd-4931-bf55-108522b9bfeb@xxxxxxxxxxxxxxxxx/
Also, it seems some dependenies are missing, just
backporting this commit will break EROFS.
Hi Greg,
Please help drop this patch from 6.1 queue before more
explanations, thanks!
Thanks,
Gao Xiang
On 2024/12/2 19:48, gregkh@xxxxxxxxxxxxxxxxxxx wrote:
This is a note to let you know that I've just added the patch titled
erofs: reliably distinguish block based and fscache mode
to the 6.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
erofs-reliably-distinguish-block-based-and-fscache-mode.patch
and it can be found in the queue-6.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.
From 7af2ae1b1531feab5d38ec9c8f472dc6cceb4606 Mon Sep 17 00:00:00 2001
From: Christian Brauner <brauner@xxxxxxxxxx>
Date: Fri, 19 Apr 2024 20:36:11 +0800
Subject: erofs: reliably distinguish block based and fscache mode
From: Christian Brauner <brauner@xxxxxxxxxx>
commit 7af2ae1b1531feab5d38ec9c8f472dc6cceb4606 upstream.
When erofs_kill_sb() is called in block dev based mode, s_bdev may not
have been initialised yet, and if CONFIG_EROFS_FS_ONDEMAND is enabled,
it will be mistaken for fscache mode, and then attempt to free an anon_dev
that has never been allocated, triggering the following warning:
============================================
ida_free called for id=0 which is not allocated.
WARNING: CPU: 14 PID: 926 at lib/idr.c:525 ida_free+0x134/0x140
Modules linked in:
CPU: 14 PID: 926 Comm: mount Not tainted 6.9.0-rc3-dirty #630
RIP: 0010:ida_free+0x134/0x140
Call Trace:
<TASK>
erofs_kill_sb+0x81/0x90
deactivate_locked_super+0x35/0x80
get_tree_bdev+0x136/0x1e0
vfs_get_tree+0x2c/0xf0
do_new_mount+0x190/0x2f0
[...]
============================================
Now when erofs_kill_sb() is called, erofs_sb_info must have been
initialised, so use sbi->fsid to distinguish between the two modes.
Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx>
Reviewed-by: Jingbo Xu <jefflexu@xxxxxxxxxxxxxxxxx>
Reviewed-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
Reviewed-by: Chao Yu <chao@xxxxxxxxxx>
Link: https://lore.kernel.org/r/20240419123611.947084-3-libaokun1@xxxxxxxxxx
Signed-off-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
Signed-off-by: Xiangyu Chen <xiangyu.chen@xxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
fs/erofs/super.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -892,7 +892,7 @@ static int erofs_init_fs_context(struct
*/
static void erofs_kill_sb(struct super_block *sb)
{
- struct erofs_sb_info *sbi;
+ struct erofs_sb_info *sbi = EROFS_SB(sb);
WARN_ON(sb->s_magic != EROFS_SUPER_MAGIC);
@@ -902,15 +902,11 @@ static void erofs_kill_sb(struct super_b
return;
}
- if (erofs_is_fscache_mode(sb))
+ if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && sbi->fsid)
kill_anon_super(sb);
else
kill_block_super(sb);
- sbi = EROFS_SB(sb);
- if (!sbi)
- return;
-
erofs_free_dev_context(sbi->devs);
fs_put_dax(sbi->dax_dev, NULL);
erofs_fscache_unregister_fs(sb);
Patches currently in stable-queue which might be from brauner@xxxxxxxxxx are
queue-6.1/cachefiles-fix-missing-pos-updates-in-cachefiles_ond.patch
queue-6.1/hfsplus-don-t-query-the-device-logical-block-size-mu.patch
queue-6.1/netfs-fscache-add-a-memory-barrier-for-fscache_volum.patch
queue-6.1/fs-inode-prevent-dump_mapping-accessing-invalid-dent.patch
queue-6.1/initramfs-avoid-filename-buffer-overrun.patch
queue-6.1/erofs-reliably-distinguish-block-based-and-fscache-mode.patch
queue-6.1/fs_parser-update-mount_api-doc-to-match-function-sig.patch
queue-6.1/selftests-mount_setattr-fix-failures-on-64k-page_siz.patch