diff options
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index f48a2f359ac4..eaa3af0e0632 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE" | 32 | #define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE" |
33 | #define DM_COOKIE_LENGTH 24 | 33 | #define DM_COOKIE_LENGTH 24 |
34 | 34 | ||
35 | static DEFINE_MUTEX(dm_mutex); | ||
36 | static const char *_name = DM_NAME; | 35 | static const char *_name = DM_NAME; |
37 | 36 | ||
38 | static unsigned int major = 0; | 37 | static unsigned int major = 0; |
@@ -328,7 +327,6 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) | |||
328 | { | 327 | { |
329 | struct mapped_device *md; | 328 | struct mapped_device *md; |
330 | 329 | ||
331 | mutex_lock(&dm_mutex); | ||
332 | spin_lock(&_minor_lock); | 330 | spin_lock(&_minor_lock); |
333 | 331 | ||
334 | md = bdev->bd_disk->private_data; | 332 | md = bdev->bd_disk->private_data; |
@@ -346,7 +344,6 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) | |||
346 | 344 | ||
347 | out: | 345 | out: |
348 | spin_unlock(&_minor_lock); | 346 | spin_unlock(&_minor_lock); |
349 | mutex_unlock(&dm_mutex); | ||
350 | 347 | ||
351 | return md ? 0 : -ENXIO; | 348 | return md ? 0 : -ENXIO; |
352 | } | 349 | } |
@@ -355,10 +352,12 @@ static int dm_blk_close(struct gendisk *disk, fmode_t mode) | |||
355 | { | 352 | { |
356 | struct mapped_device *md = disk->private_data; | 353 | struct mapped_device *md = disk->private_data; |
357 | 354 | ||
358 | mutex_lock(&dm_mutex); | 355 | spin_lock(&_minor_lock); |
356 | |||
359 | atomic_dec(&md->open_count); | 357 | atomic_dec(&md->open_count); |
360 | dm_put(md); | 358 | dm_put(md); |
361 | mutex_unlock(&dm_mutex); | 359 | |
360 | spin_unlock(&_minor_lock); | ||
362 | 361 | ||
363 | return 0; | 362 | return 0; |
364 | } | 363 | } |
@@ -1638,13 +1637,15 @@ static void dm_request_fn(struct request_queue *q) | |||
1638 | if (map_request(ti, clone, md)) | 1637 | if (map_request(ti, clone, md)) |
1639 | goto requeued; | 1638 | goto requeued; |
1640 | 1639 | ||
1641 | spin_lock_irq(q->queue_lock); | 1640 | BUG_ON(!irqs_disabled()); |
1641 | spin_lock(q->queue_lock); | ||
1642 | } | 1642 | } |
1643 | 1643 | ||
1644 | goto out; | 1644 | goto out; |
1645 | 1645 | ||
1646 | requeued: | 1646 | requeued: |
1647 | spin_lock_irq(q->queue_lock); | 1647 | BUG_ON(!irqs_disabled()); |
1648 | spin_lock(q->queue_lock); | ||
1648 | 1649 | ||
1649 | plug_and_out: | 1650 | plug_and_out: |
1650 | if (!elv_queue_empty(q)) | 1651 | if (!elv_queue_empty(q)) |
@@ -1884,7 +1885,8 @@ static struct mapped_device *alloc_dev(int minor) | |||
1884 | add_disk(md->disk); | 1885 | add_disk(md->disk); |
1885 | format_dev_t(md->name, MKDEV(_major, minor)); | 1886 | format_dev_t(md->name, MKDEV(_major, minor)); |
1886 | 1887 | ||
1887 | md->wq = create_singlethread_workqueue("kdmflush"); | 1888 | md->wq = alloc_workqueue("kdmflush", |
1889 | WQ_NON_REENTRANT | WQ_MEM_RECLAIM, 0); | ||
1888 | if (!md->wq) | 1890 | if (!md->wq) |
1889 | goto bad_thread; | 1891 | goto bad_thread; |
1890 | 1892 | ||
@@ -1992,13 +1994,14 @@ static void event_callback(void *context) | |||
1992 | wake_up(&md->eventq); | 1994 | wake_up(&md->eventq); |
1993 | } | 1995 | } |
1994 | 1996 | ||
1997 | /* | ||
1998 | * Protected by md->suspend_lock obtained by dm_swap_table(). | ||
1999 | */ | ||
1995 | static void __set_size(struct mapped_device *md, sector_t size) | 2000 | static void __set_size(struct mapped_device *md, sector_t size) |
1996 | { | 2001 | { |
1997 | set_capacity(md->disk, size); | 2002 | set_capacity(md->disk, size); |
1998 | 2003 | ||
1999 | mutex_lock(&md->bdev->bd_inode->i_mutex); | ||
2000 | i_size_write(md->bdev->bd_inode, (loff_t)size << SECTOR_SHIFT); | 2004 | i_size_write(md->bdev->bd_inode, (loff_t)size << SECTOR_SHIFT); |
2001 | mutex_unlock(&md->bdev->bd_inode->i_mutex); | ||
2002 | } | 2005 | } |
2003 | 2006 | ||
2004 | /* | 2007 | /* |