Commit 4c49ff3f authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe

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

d4dc210f (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: default avatarTejun Heo <tj@kernel.org>
Reported-by: default avatarDavid Miller <davem@davemloft.net>
Tested-by: default avatarDavid Miller <davem@davemloft.net>
Cc: stable@kernel.org
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 4495a7d4
...@@ -1272,8 +1272,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment