Commit 6b73e4c0 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman

Staging: hv: blkvsc_drv: Cleanup spin lock usage

This spin lock is potentially acquired from interrupt context.
Ensure that the interrupts are blocked whenever the lock is held.
The current code was not consistent with regards to blocking
interrupts - the same lock would be acquired without blocking
interrupts in some instance while the interrupts would be blocked
in other instances. Fix this potential deadlock problem.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarAbhishek Kane <v-abkane@microsoft.com>
Signed-off-by: default avatarHank Janssen <hjanssen@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c5662498
......@@ -249,12 +249,13 @@ static int blkvsc_submit_request(struct blkvsc_request *blkvsc_req,
static int blkvsc_open(struct block_device *bdev, fmode_t mode)
{
struct block_device_context *blkdev = bdev->bd_disk->private_data;
unsigned long flags;
spin_lock(&blkdev->lock);
spin_lock_irqsave(&blkdev->lock, flags);
blkdev->users++;
spin_unlock(&blkdev->lock);
spin_unlock_irqrestore(&blkdev->lock, flags);
return 0;
}
......@@ -616,17 +617,18 @@ static void blkvsc_shutdown(struct hv_device *dev)
static int blkvsc_release(struct gendisk *disk, fmode_t mode)
{
struct block_device_context *blkdev = disk->private_data;
unsigned long flags;
spin_lock(&blkdev->lock);
spin_lock_irqsave(&blkdev->lock, flags);
if (blkdev->users == 1) {
spin_unlock(&blkdev->lock);
spin_unlock_irqrestore(&blkdev->lock, flags);
blkvsc_do_operation(blkdev, DO_FLUSH);
spin_lock(&blkdev->lock);
spin_lock_irqsave(&blkdev->lock, flags);
}
blkdev->users--;
spin_unlock(&blkdev->lock);
spin_unlock_irqrestore(&blkdev->lock, flags);
return 0;
}
......
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