Skip to content

Commit 3caf414

Browse files
tmlindcjb
authored andcommitted
mmc: omap: Fix NULL pointer dereference if mmc_omap_new_slot() fails
Commit b01a4f1 (mmc: omap: convert to per instance workqueue) initializes the workqueue too late causing the following: Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 [00000000] *pgd=00000000 Internal error: Oops: 5 [raspberrypi#1] SMP ARM Modules linked in: CPU: 0 Not tainted (3.4.0-08218-gb48b2c3 raspberrypi#158) PC is at __queue_work+0x8/0x46c LR is at queue_work_on+0x38/0x40 pc : [<c005bb4c>] lr : [<c005c00c>] psr: 60000193 sp : c0691e1c ip : 00000000 fp : c07374ac r10: c7aae400 r9 : c0395700 r8 : 00000100 r7 : c0691e70 r6 : 00000000 r5 : 00000000 r4 : c7aae440 r3 : 00000001 r2 : c7aae440 r1 : 00000000 r0 : 00000000 Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel Control: 00c5387d Table: 80004000 DAC: 00000017 Process swapper/0 (pid: 0, stack limit = 0xc06902f8) Stack: (0xc0691e1c to 0xc0692000) Fix this by initializing the workqueue before mmc_omap_remove_slot() get called. Tested on n770, looks like n800 at least still has some other issue with MMC. Signed-off-by: Tony Lindgren <[email protected]> Signed-off-by: Chris Ball <[email protected]>
1 parent 4f83779 commit 3caf414

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

drivers/mmc/host/omap.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,24 +1485,27 @@ static int __devinit mmc_omap_probe(struct platform_device *pdev)
14851485
}
14861486

14871487
host->nr_slots = pdata->nr_slots;
1488+
1489+
host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
1490+
if (!host->mmc_omap_wq)
1491+
goto err_plat_cleanup;
1492+
14881493
for (i = 0; i < pdata->nr_slots; i++) {
14891494
ret = mmc_omap_new_slot(host, i);
14901495
if (ret < 0) {
14911496
while (--i >= 0)
14921497
mmc_omap_remove_slot(host->slots[i]);
14931498

1494-
goto err_plat_cleanup;
1499+
goto err_destroy_wq;
14951500
}
14961501
}
14971502

14981503
host->reg_shift = (cpu_is_omap7xx() ? 1 : 2);
14991504

1500-
host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0);
1501-
if (!host->mmc_omap_wq)
1502-
goto err_plat_cleanup;
1503-
15041505
return 0;
15051506

1507+
err_destroy_wq:
1508+
destroy_workqueue(host->mmc_omap_wq);
15061509
err_plat_cleanup:
15071510
if (pdata->cleanup)
15081511
pdata->cleanup(&pdev->dev);

0 commit comments

Comments
 (0)