block: blkdev_get() should access ->bd_disk only after success

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>
Cc: stable@kernel.org
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
Tejun Heo 2011-06-01 08:27:41 +02:00 committed by Jens Axboe
parent 4495a7d41d
commit 4c49ff3fe1

View File

@ -1272,8 +1272,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
* individual writeable reference is too fragile given the * individual writeable reference is too fragile given the
* way @mode is used in blkdev_get/put(). * way @mode is used in blkdev_get/put().
*/ */
if ((disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE) && if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder &&
!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) { (disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE)) {
bdev->bd_write_holder = true; bdev->bd_write_holder = true;
disk_block_events(disk); disk_block_events(disk);
} }