Patch "mtd: fix: avoid race condition when accessing mtd->usecount" has been added to the 3.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mtd: fix: avoid race condition when accessing mtd->usecount
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mtd-fix-avoid-race-condition-when-accessing-mtd-usecount.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
073db4a51ee43ccb827f54a4261c0583b028d5abMon Sep 17 00:00:00 2001
From: Brian Norris <[email protected]>
Date: Thu, 7 May 2015 17:55:16 -0700
Subject: mtd: fix: avoid race condition when accessing mtd->usecount
From: Brian Norris <[email protected]>
commit 073db4a51ee43ccb827f54a4261c0583b028d5ab upstream.
On A MIPS 32-cores machine a BUG_ON was triggered because some acesses to mtd->usecount were done without taking mtd_table_mutex.
kernel: Call Trace:
kernel: [<ffffffff80401818>] __put_mtd_device+0x20/0x50
kernel: [<ffffffff804086f4>] blktrans_release+0x8c/0xd8
kernel: [<ffffffff802577e0>] __blkdev_put+0x1a8/0x200
kernel: [<ffffffff802579a4>] blkdev_close+0x1c/0x30
kernel: [<ffffffff8022006c>] __fput+0xac/0x250
kernel: [<ffffffff80171208>] task_work_run+0xd8/0x120
kernel: [<ffffffff8012c23c>] work_notifysig+0x10/0x18
kernel:
kernel:
Code: 2442ffff ac8202d8 000217fe <00020336> dc820128 10400003
00000000 0040f809 00000000kernel: ---[ end trace 080fbb4579b47a73 ]---
Fixed by taking the mutex in blktrans_open and blktrans_release.
Note that this locking is already suggested ininclude/linux/mtd/blktrans.h:
struct mtd_blktrans_ops {
...
/* Called with mtd_table_mutex held; no race with add/remove */ int (*open)(struct mtd_blktrans_dev *dev); void (*release)(struct mtd_blktrans_dev *dev);
...
};
But we weren't following it.
Originally reported by (and patched by) Zhang and Giuseppe, independently. Improved and rewritten.
--- drivers/mtd/mtd_blkdevs.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/mtd/mtd_blkdevs.c +5 -0
@@ -199,6 +199,7 @@ static int blktrans_open(struct block_dereturn -ERESTARTSYS ;/* FIXME: busy loop! -arnd*/ mutex_lock (&dev->lock); +mutex_lock (&mtd_table_mutex);if (dev->open) goto unlock;
@@ -222,6 +223,7 @@ static int blktrans_open(struct block_de unlock: dev->open++; +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev);return ret;
@@ -232,6 +234,7 @@ error_release: error_put:module_put (dev->tr->owner);kref_put (&dev->ref, blktrans_dev_release); +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev);return ret;
@@ -245,6 +248,7 @@ static void blktrans_release(struct gendreturn ;mutex_lock (&dev->lock); +mutex_lock (&mtd_table_mutex);if (--dev->open) goto unlock;
@@ -258,6 +262,7 @@ static void blktrans_release(struct gend__put_mtd_device (dev->mtd); } unlock: +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev); }
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/mtd-fix-avoid-race-condition-when-accessing-mtd-usecount.patch queue-3.10/mtd-dc21285-use-raw-spinlock-functions-for-nw_gpio_lock.patch