diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-08-07 12:25:34 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2010-08-07 12:25:34 -0400 |
commit | 6e9624b8caec290d28b4c6d9ec75749df6372b87 (patch) | |
tree | 47225b544e1da82742795553dc4e8aa70c17afdc /drivers/block/drbd/drbd_main.c | |
parent | 8a6cfeb6deca3a8fefd639d898b0d163c0b5d368 (diff) |
block: push down BKL into .open and .release
The open and release block_device_operations are currently
called with the BKL held. In order to change that, we must
first make sure that all drivers that currently rely
on this have no regressions.
This blindly pushes the BKL into all .open and .release
operations for all block drivers to prepare for the
next step. The drivers can subsequently replace the BKL
with their own locks or remove it completely when it can
be shown that it is not needed.
The functions blkdev_get and blkdev_put are the only
remaining users of the big kernel lock in the block
layer, besides a few uses in the ioctl code, none
of which need to serialize with blkdev_{get,put}.
Most of these two functions is also under the protection
of bdev->bd_mutex, including the actual calls to
->open and ->release, and the common code does not
access any global data structures that need the BKL.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
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 | ||