diff options
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index d505a96845c1..a3f21dc02bd8 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/blkpg.h> | 15 | #include <linux/blkpg.h> |
16 | #include <linux/bio.h> | 16 | #include <linux/bio.h> |
17 | #include <linux/buffer_head.h> | 17 | #include <linux/buffer_head.h> |
18 | #include <linux/smp_lock.h> | ||
18 | #include <linux/mempool.h> | 19 | #include <linux/mempool.h> |
19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
20 | #include <linux/idr.h> | 21 | #include <linux/idr.h> |
@@ -338,6 +339,7 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) | |||
338 | { | 339 | { |
339 | struct mapped_device *md; | 340 | struct mapped_device *md; |
340 | 341 | ||
342 | lock_kernel(); | ||
341 | spin_lock(&_minor_lock); | 343 | spin_lock(&_minor_lock); |
342 | 344 | ||
343 | md = bdev->bd_disk->private_data; | 345 | md = bdev->bd_disk->private_data; |
@@ -355,6 +357,7 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) | |||
355 | 357 | ||
356 | out: | 358 | out: |
357 | spin_unlock(&_minor_lock); | 359 | spin_unlock(&_minor_lock); |
360 | unlock_kernel(); | ||
358 | 361 | ||
359 | return md ? 0 : -ENXIO; | 362 | return md ? 0 : -ENXIO; |
360 | } | 363 | } |
@@ -362,8 +365,12 @@ out: | |||
362 | static int dm_blk_close(struct gendisk *disk, fmode_t mode) | 365 | static int dm_blk_close(struct gendisk *disk, fmode_t mode) |
363 | { | 366 | { |
364 | struct mapped_device *md = disk->private_data; | 367 | struct mapped_device *md = disk->private_data; |
368 | |||
369 | lock_kernel(); | ||
365 | atomic_dec(&md->open_count); | 370 | atomic_dec(&md->open_count); |
366 | dm_put(md); | 371 | dm_put(md); |
372 | unlock_kernel(); | ||
373 | |||
367 | return 0; | 374 | return 0; |
368 | } | 375 | } |
369 | 376 | ||