41 lines
1.4 KiB
Diff
41 lines
1.4 KiB
Diff
From 4c49ff3fe128ca68dabd07537415c419ad7f82f9 Mon Sep 17 00:00:00 2001
|
|
From: Tejun Heo <tj@kernel.org>
|
|
Date: Wed, 1 Jun 2011 08:27:41 +0200
|
|
Subject: block: blkdev_get() should access ->bd_disk only after
|
|
success
|
|
|
|
From: Tejun Heo <tj@kernel.org>
|
|
|
|
commit 4c49ff3fe128ca68dabd07537415c419ad7f82f9 upstream.
|
|
|
|
d4dc210f69 (block: don't block events on excl write for non-optical
|
|
devices) added dereferencing of bdev->bd_disk to test
|
|
GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; however, bdev->bd_disk can be
|
|
%NULL if open failed which can lead to an oops.
|
|
|
|
Test the flag after testing open was successful, not before.
|
|
|
|
Signed-off-by: Tejun Heo <tj@kernel.org>
|
|
Reported-by: David Miller <davem@davemloft.net>
|
|
Tested-by: David Miller <davem@davemloft.net>
|
|
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
|
|
|
---
|
|
fs/block_dev.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
--- a/fs/block_dev.c
|
|
+++ b/fs/block_dev.c
|
|
@@ -1272,8 +1272,8 @@ int blkdev_get(struct block_device *bdev
|
|
* individual writeable reference is too fragile given the
|
|
* way @mode is used in blkdev_get/put().
|
|
*/
|
|
- if ((disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE) &&
|
|
- !res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) {
|
|
+ if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder &&
|
|
+ (disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE)) {
|
|
bdev->bd_write_holder = true;
|
|
disk_block_events(disk);
|
|
}
|