linux/drivers/mtd
Brian Norris 342ff28f5a mtd: mtd_blkdevs: don't increase 'open' count on error path
Some error paths in mtd_blkdevs were fixed in the following commit:

    commit 94735ec404
    mtd: mtd_blkdevs: fix error path in blktrans_open

But on these error paths, the block device's `dev->open' count is
already incremented before we check for errors. This meant that, while
the error path was handled correctly on the first time through
blktrans_open(), the device is erroneously considered already open on
the second time through.

This problem can be seen, for instance, when a UBI volume is
simultaneously mounted as a UBIFS partition and read through its
corresponding gluebi mtdblockX device. This results in blktrans_open()
passing its error checks (with `dev->open > 0') without actually having
a handle on the device. Here's a summarized log of the actions and
results with nandsim:

    # modprobe nandsim
    # modprobe mtdblock
    # modprobe gluebi
    # modprobe ubifs
    # ubiattach /dev/ubi_ctrl -m 0
    ...
    # ubimkvol /dev/ubi0 -N test -s 16MiB
    ...
    # mount -t ubifs ubi0:test /mnt
    # ls /dev/mtdblock*
    /dev/mtdblock0  /dev/mtdblock1
    # cat /dev/mtdblock1 > /dev/null
    cat: can't open '/dev/mtdblock4': Device or resource busy
    # cat /dev/mtdblock1 > /dev/null

    CPU 0 Unable to handle kernel paging request at virtual address
    fffffff0, epc == 8031536c, ra == 8031f280
    Oops[#1]:
    ...
    Call Trace:
    [<8031536c>] ubi_leb_read+0x14/0x164
    [<8031f280>] gluebi_read+0xf0/0x148
    [<802edba8>] mtdblock_readsect+0x64/0x198
    [<802ecfe4>] mtd_blktrans_thread+0x330/0x3f4
    [<8005be98>] kthread+0x88/0x90
    [<8000bc04>] kernel_thread_helper+0x10/0x18

Cc: stable@kernel.org [3.0+]
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
2012-01-09 18:04:01 +00:00
..
chips mtd: cleanup style on pr_debug messages 2011-09-11 15:02:16 +03:00
devices mtd: clean up usage of MTD_DOCPROBE_ADDRESS 2011-10-30 14:22:36 +02:00
lpddr mtd: Add module.h to drivers users that were implicitly using it. 2011-10-31 19:31:12 -04:00
maps mtd: plat_ram: call mtd_device_register only if partition data exists 2011-12-19 11:13:52 +00:00
nand mtd: nand: scan 1st and 2nd page for Macronix SLC 2012-01-09 17:59:53 +00:00
onenand Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
tests mtd: tests: don't use mtd0 as a default 2011-10-30 14:31:04 +02:00
ubi Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
afs.c mtd: abstract last MTD partition parser argument 2011-09-11 15:02:10 +03:00
ar7part.c Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
cmdlinepart.c Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
ftl.c mtd: spelling fixes 2011-09-11 15:02:16 +03:00
inftlcore.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
inftlmount.c mtd: spelling fixes 2011-09-11 15:02:16 +03:00
Kconfig Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
Makefile mtd: make ofpart buildable as a separate module 2011-09-11 15:02:13 +03:00
mtd_blkdevs.c mtd: mtd_blkdevs: don't increase 'open' count on error path 2012-01-09 18:04:01 +00:00
mtdblock_ro.c mtd: Add module.h to drivers users that were implicitly using it. 2011-10-31 19:31:12 -04:00
mtdblock.c mtd: replace DEBUG() with pr_debug() 2011-09-11 15:02:16 +03:00
mtdchar.c Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
mtdconcat.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
mtdcore.c mtd: check parts pointer before using it 2011-09-11 15:02:18 +03:00
mtdcore.h mtd: hide parse_mtd_partitions 2011-09-11 15:02:13 +03:00
mtdoops.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
mtdpart.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
mtdsuper.c Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
mtdswap.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
nftlcore.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
nftlmount.c mtd: spelling fixes 2011-09-11 15:02:16 +03:00
ofpart.c mtd: ofpart: add ofoldpart alias 2011-09-11 15:02:14 +03:00
redboot.c Merge git://git.infradead.org/mtd-2.6 2011-11-07 09:11:16 -08:00
rfd_ftl.c mtd: Add module.h to drivers users that were implicitly using it. 2011-10-31 19:31:12 -04:00
sm_ftl.c mtd: utilize `mtd_is_*()' functions 2011-09-21 09:19:06 +03:00
sm_ftl.h mtd: sm_ftl: cosmetic, use bool when possible 2010-10-25 01:33:08 +01:00
ssfdc.c mtd: rename MTD_OOB_* to MTD_OPS_* 2011-09-11 15:28:59 +03:00