Skip to content

Commit

Permalink
Staging: hv: blkvsc_drv: Cleanup spin lock usage
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
K. Y. Srinivasan authored and Greg Kroah-Hartman committed May 11, 2011
1 parent c566249 commit 6b73e4c
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions drivers/staging/hv/blkvsc_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 6b73e4c

Please sign in to comment.