]>
Commit | Line | Data |
---|---|---|
04fd09d4 SL |
1 | From 27125def08eb98cb966fc5529305e28a24b04d67 Mon Sep 17 00:00:00 2001 |
2 | From: Jason Yan <yanaijie@huawei.com> | |
3 | Date: Fri, 15 Feb 2019 19:50:27 +0800 | |
4 | Subject: scsi: megaraid_sas: return error when create DMA pool failed | |
5 | ||
6 | [ Upstream commit bcf3b67d16a4c8ffae0aa79de5853435e683945c ] | |
7 | ||
8 | when create DMA pool for cmd frames failed, we should return -ENOMEM, | |
9 | instead of 0. | |
10 | In some case in: | |
11 | ||
12 | megasas_init_adapter_fusion() | |
13 | ||
14 | -->megasas_alloc_cmds() | |
15 | -->megasas_create_frame_pool | |
16 | create DMA pool failed, | |
17 | --> megasas_free_cmds() [1] | |
18 | ||
19 | -->megasas_alloc_cmds_fusion() | |
20 | failed, then goto fail_alloc_cmds. | |
21 | -->megasas_free_cmds() [2] | |
22 | ||
23 | we will call megasas_free_cmds twice, [1] will kfree cmd_list, | |
24 | [2] will use cmd_list.it will cause a problem: | |
25 | ||
26 | Unable to handle kernel NULL pointer dereference at virtual address | |
27 | 00000000 | |
28 | pgd = ffffffc000f70000 | |
29 | [00000000] *pgd=0000001fbf893003, *pud=0000001fbf893003, | |
30 | *pmd=0000001fbf894003, *pte=006000006d000707 | |
31 | Internal error: Oops: 96000005 [#1] SMP | |
32 | Modules linked in: | |
33 | CPU: 18 PID: 1 Comm: swapper/0 Not tainted | |
34 | task: ffffffdfb9290000 ti: ffffffdfb923c000 task.ti: ffffffdfb923c000 | |
35 | PC is at megasas_free_cmds+0x30/0x70 | |
36 | LR is at megasas_free_cmds+0x24/0x70 | |
37 | ... | |
38 | Call trace: | |
39 | [<ffffffc0005b779c>] megasas_free_cmds+0x30/0x70 | |
40 | [<ffffffc0005bca74>] megasas_init_adapter_fusion+0x2f4/0x4d8 | |
41 | [<ffffffc0005b926c>] megasas_init_fw+0x2dc/0x760 | |
42 | [<ffffffc0005b9ab0>] megasas_probe_one+0x3c0/0xcd8 | |
43 | [<ffffffc0004a5abc>] local_pci_probe+0x4c/0xb4 | |
44 | [<ffffffc0004a5c40>] pci_device_probe+0x11c/0x14c | |
45 | [<ffffffc00053a5e4>] driver_probe_device+0x1ec/0x430 | |
46 | [<ffffffc00053a92c>] __driver_attach+0xa8/0xb0 | |
47 | [<ffffffc000538178>] bus_for_each_dev+0x74/0xc8 | |
48 | [<ffffffc000539e88>] driver_attach+0x28/0x34 | |
49 | [<ffffffc000539a18>] bus_add_driver+0x16c/0x248 | |
50 | [<ffffffc00053b234>] driver_register+0x6c/0x138 | |
51 | [<ffffffc0004a5350>] __pci_register_driver+0x5c/0x6c | |
52 | [<ffffffc000ce3868>] megasas_init+0xc0/0x1a8 | |
53 | [<ffffffc000082a58>] do_one_initcall+0xe8/0x1ec | |
54 | [<ffffffc000ca7be8>] kernel_init_freeable+0x1c8/0x284 | |
55 | [<ffffffc0008d90b8>] kernel_init+0x1c/0xe4 | |
56 | ||
57 | Signed-off-by: Jason Yan <yanaijie@huawei.com> | |
58 | Acked-by: Sumit Saxena <sumit.saxena@broadcom.com> | |
59 | Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> | |
60 | Signed-off-by: Sasha Levin <sashal@kernel.org> | |
61 | --- | |
62 | drivers/scsi/megaraid/megaraid_sas_base.c | 1 + | |
63 | 1 file changed, 1 insertion(+) | |
64 | ||
65 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c | |
66 | index d0abee3e6ed9..7f1ecd264652 100644 | |
67 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c | |
68 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |
69 | @@ -4087,6 +4087,7 @@ int megasas_alloc_cmds(struct megasas_instance *instance) | |
70 | if (megasas_create_frame_pool(instance)) { | |
71 | dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error creating frame DMA pool\n"); | |
72 | megasas_free_cmds(instance); | |
73 | + return -ENOMEM; | |
74 | } | |
75 | ||
76 | return 0; | |
77 | -- | |
78 | 2.19.1 | |
79 |