kernel_optimize_test/drivers/mtd
Artem Bityutskiy 23add7455c UBI: fix LEB locking
leb_read_unlock() may be called simultaniously by several tasks.
The would race at the following code:

 up_read(&le->mutex);
 if (free)
         kfree(le);

And it is possible that one task frees 'le' before the other tasks
do 'up_read()'. Fix this by doing up_read and free inside the
'ubi->ltree' lock. Below it the oops we had because of this:

BUG: spinlock bad magic on CPU#0, integck/7504
BUG: unable to handle kernel paging request at 6b6b6c4f
IP: [<c0211221>] spin_bug+0x5c/0xdb
*pde = 00000000 Oops: 0000 [#1] PREEMPT SMP Modules linked in: ubifs ubi nandsim nand nand_ids nand_ecc video output

Pid: 7504, comm: integck Not tainted (2.6.26-rc3ubifs26 #8)
EIP: 0060:[<c0211221>] EFLAGS: 00010002 CPU: 0
EIP is at spin_bug+0x5c/0xdb
EAX: 00000032 EBX: 6b6b6b6b ECX: 6b6b6b6b EDX: f7f7ce30
ESI: f76491dc EDI: c044f51f EBP: e8a736cc ESP: e8a736a8
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
Process integck (pid: 7504, ti=e8a72000 task=f7f7ce30 task.ti=e8a72000)
Stack: c044f754 c044f51f 00000000 f7f7d024 00001d50 00000001 f76491dc 00000296       f6df50e0 e8a736d8 c02112f0 f76491dc e8a736e8 c039157a f7d9e830 f76491d8       e8a7370c c020b975 f76491dc 00000296 f76491f8 00000000 f76491d8 00000000 Call Trace:
[<c02112f0>] ? _raw_spin_unlock+0x50/0x7c
[<c039157a>] ? _spin_unlock_irqrestore+0x20/0x58
[<c020b975>] ? rwsem_wake+0x4b/0x122
[<c0390e0a>] ? call_rwsem_wake+0xa/0xc
[<c0139ee7>] ? up_read+0x28/0x31
[<f8873b3c>] ? leb_read_unlock+0x73/0x7b [ubi]
[<f88742a3>] ? ubi_eba_read_leb+0x195/0x2b0 [ubi]
[<f8872a04>] ? ubi_leb_read+0xaf/0xf8 [ubi]

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
2008-07-24 13:32:56 +03:00
..
chips [MTD][NOR] Add physical address to point() method 2008-05-01 18:59:11 +01:00
devices MTD: handle pci_name() being const 2008-07-21 21:55:03 -07:00
maps [MIPS] MTX-1 flash partition setup move to platform devices registration 2008-07-15 18:44:38 +01:00
nand Merge branch 'pxa' into devel 2008-07-13 12:05:49 +01:00
onenand [MTD] [MAPS] Fix cmdlineparse handling in mapping files 2008-06-05 07:51:13 +01:00
ubi UBI: fix LEB locking 2008-07-24 13:32:56 +03:00
afs.c
ar7part.c [MTD] Clean up AR7 partition map support 2008-04-23 09:39:49 +01:00
cmdlinepart.c [MTD] cmdlinepart: Missing partition info is not an error 2008-04-22 19:10:15 +01:00
ftl.c pcmcia: remove unused bulkmem.h 2008-06-24 15:33:43 +02:00
inftlcore.c
inftlmount.c [MTD] proper prototypes for inftl_{read,write}_oob() 2008-04-22 15:54:16 +01:00
Kconfig [MTD] AR7 mtd partition map 2008-04-22 20:48:12 +01:00
Makefile [MTD] AR7 mtd partition map 2008-04-22 20:48:12 +01:00
mtd_blkdevs.c
mtdblock_ro.c
mtdblock.c
mtdchar.c device create: mtd: convert device_create to device_create_drvdata 2008-07-21 21:54:44 -07:00
mtdconcat.c
mtdcore.c [MTD] Unlocking all Intel flash that is locked on power up. 2008-02-03 18:25:16 +11:00
mtdcore.h
mtdoops.c [MTD] mtdoops.c: make struct oops_cxt static again 2008-04-22 12:35:34 +01:00
mtdpart.c [MTD][NOR] Add physical address to point() method 2008-05-01 18:59:11 +01:00
mtdsuper.c Introduce path_put() 2008-02-14 21:13:33 -08:00
nftlcore.c
nftlmount.c [MTD] proper prototypes for nftl_{read,write}_oob() 2008-04-22 15:54:29 +01:00
ofpart.c [MTD] mtd/ofpart.c: add MODULE_LICENSE 2008-04-22 15:53:52 +01:00
redboot.c Fix various old email addresses for dwmw2 2008-06-06 11:29:10 -07:00
rfd_ftl.c [MTD] make struct rfd_ftl_tr static 2008-04-22 15:59:25 +01:00
ssfdc.c