diff options
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index e2ab13d99d69..d2b6764a7b1f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -2604,6 +2604,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) | |||
2604 | unsigned long flags; | 2604 | unsigned long flags; |
2605 | int rv = 0; | 2605 | int rv = 0; |
2606 | 2606 | ||
2607 | lock_kernel(); | ||
2607 | spin_lock_irqsave(&mdev->req_lock, flags); | 2608 | spin_lock_irqsave(&mdev->req_lock, flags); |
2608 | /* to have a stable mdev->state.role | 2609 | /* to have a stable mdev->state.role |
2609 | * and no race with updating open_cnt */ | 2610 | * and no race with updating open_cnt */ |
@@ -2618,6 +2619,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) | |||
2618 | if (!rv) | 2619 | if (!rv) |
2619 | mdev->open_cnt++; | 2620 | mdev->open_cnt++; |
2620 | spin_unlock_irqrestore(&mdev->req_lock, flags); | 2621 | spin_unlock_irqrestore(&mdev->req_lock, flags); |
2622 | unlock_kernel(); | ||
2621 | 2623 | ||
2622 | return rv; | 2624 | return rv; |
2623 | } | 2625 | } |
@@ -2625,7 +2627,9 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) | |||
2625 | static int drbd_release(struct gendisk *gd, fmode_t mode) | 2627 | static int drbd_release(struct gendisk *gd, fmode_t mode) |
2626 | { | 2628 | { |
2627 | struct drbd_conf *mdev = gd->private_data; | 2629 | struct drbd_conf *mdev = gd->private_data; |
2630 | lock_kernel(); | ||
2628 | mdev->open_cnt--; | 2631 | mdev->open_cnt--; |
2632 | unlock_kernel(); | ||
2629 | return 0; | 2633 | return 0; |
2630 | } | 2634 | } |
2631 | 2635 | ||