projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
83cbdaf
)
md: fix kmemleak of rdev->serial
author
Li Nan
<linan122@huawei.com>
Thu, 8 Feb 2024 08:55:56 +0000
(16:55 +0800)
committer
Song Liu
<song@kernel.org>
Mon, 12 Feb 2024 17:20:08 +0000
(09:20 -0800)
If kobject_add() is fail in bind_rdev_to_array(), 'rdev->serial' will be
alloc not be freed, and kmemleak occurs.
unreferenced object 0xffff88815a350000 (size 49152):
comm "mdadm", pid 789, jiffies
4294716910
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace (crc
f773277a
):
[<
0000000058b0a453
>] kmemleak_alloc+0x61/0xe0
[<
00000000366adf14
>] __kmalloc_large_node+0x15e/0x270
[<
000000002e82961b
>] __kmalloc_node.cold+0x11/0x7f
[<
00000000f206d60a
>] kvmalloc_node+0x74/0x150
[<
0000000034bf3363
>] rdev_init_serial+0x67/0x170
[<
0000000010e08fe9
>] mddev_create_serial_pool+0x62/0x220
[<
00000000c3837bf0
>] bind_rdev_to_array+0x2af/0x630
[<
0000000073c28560
>] md_add_new_disk+0x400/0x9f0
[<
00000000770e30ff
>] md_ioctl+0x15bf/0x1c10
[<
000000006cfab718
>] blkdev_ioctl+0x191/0x3f0
[<
0000000085086a11
>] vfs_ioctl+0x22/0x60
[<
0000000018b656fe
>] __x64_sys_ioctl+0xba/0xe0
[<
00000000e54e675e
>] do_syscall_64+0x71/0x150
[<
000000008b0ad622
>] entry_SYSCALL_64_after_hwframe+0x6c/0x74
Fixes: 963c555e75b0 ("md: introduce mddev_create/destroy_wb_pool for the change of member device")
Signed-off-by: Li Nan <linan122@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link:
https://lore.kernel.org/r/20240208085556.2412922-1-linan666@huaweicloud.com
drivers/md/md.c
patch
|
blob
|
history
diff --git
a/drivers/md/md.c
b/drivers/md/md.c
index 45bb387d69c46a66703ca15df8ddcbea11eadce7..e2a5f513dbb765a859a3ad88f2c4c8dfccd69094 100644
(file)
--- a/
drivers/md/md.c
+++ b/
drivers/md/md.c
@@
-2562,6
+2562,7
@@
static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
fail:
pr_warn("md: failed to register dev-%s for %s\n",
b, mdname(mddev));
+ mddev_destroy_serial_pool(mddev, rdev);
return err;
}