diff options
author | Xiao Ni <xni@redhat.com> | 2023-02-22 11:59:16 +0800 |
---|---|---|
committer | Song Liu <song@kernel.org> | 2023-03-13 10:56:54 -0700 |
commit | 3e453522593d74a87cf68a38e14aa36ebca1dbcd (patch) | |
tree | df38b4dba7b469e83b3499e7b5df24cbe774e6bb /drivers/md/dm-verity.h | |
parent | 49d24398327e32265eccdeec4baeb5a6a609c0bd (diff) | |
download | linux-stable-3e453522593d74a87cf68a38e14aa36ebca1dbcd.tar.gz linux-stable-3e453522593d74a87cf68a38e14aa36ebca1dbcd.tar.bz2 linux-stable-3e453522593d74a87cf68a38e14aa36ebca1dbcd.zip |
md: Free resources in __md_stop
If md_run() fails after ->active_io is initialized, then percpu_ref_exit
is called in error path. However, later md_free_disk will call
percpu_ref_exit again which leads to a panic because of null pointer
dereference. It can also trigger this bug when resources are initialized
but are freed in error path, then will be freed again in md_free_disk.
BUG: kernel NULL pointer dereference, address: 0000000000000038
Oops: 0000 [#1] PREEMPT SMP
Workqueue: md_misc mddev_delayed_delete
RIP: 0010:free_percpu+0x110/0x630
Call Trace:
<TASK>
__percpu_ref_exit+0x44/0x70
percpu_ref_exit+0x16/0x90
md_free_disk+0x2f/0x80
disk_release+0x101/0x180
device_release+0x84/0x110
kobject_put+0x12a/0x380
kobject_put+0x160/0x380
mddev_delayed_delete+0x19/0x30
process_one_work+0x269/0x680
worker_thread+0x266/0x640
kthread+0x151/0x1b0
ret_from_fork+0x1f/0x30
For creating raid device, md raid calls do_md_run->md_run, dm raid calls
md_run. We alloc those memory in md_run. For stopping raid device, md raid
calls do_md_stop->__md_stop, dm raid calls md_stop->__md_stop. So we can
free those memory resources in __md_stop.
Fixes: 72adae23a72c ("md: Change active_io to percpu")
Reported-and-tested-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <song@kernel.org>
Diffstat (limited to 'drivers/md/dm-verity.h')
0 files changed, 0 insertions, 0 deletions