mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 13:59:45 -04:00
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: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: Abhishek Kane <v-abkane@microsoft.com> Signed-off-by: Hank Janssen <hjanssen@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c56624988d
commit
6b73e4c06d
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user