aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r--drivers/md/dm.c23
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
35static DEFINE_MUTEX(dm_mutex);
36static const char *_name = DM_NAME; 35static const char *_name = DM_NAME;
37 36
38static unsigned int major = 0; 37static 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
347out: 345out:
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
1646requeued: 1646requeued:
1647 spin_lock_irq(q->queue_lock); 1647 BUG_ON(!irqs_disabled());
1648 spin_lock(q->queue_lock);
1648 1649
1649plug_and_out: 1650plug_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 */
1995static void __set_size(struct mapped_device *md, sector_t size) 2000static 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/*