dm.c (3d8aab2d2cca2dc878e396196d07889129440798) | dm.c (86f1152b117a404229fd6f08ec3faca779f37b92) |
---|---|
1/* 2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. 3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm.h" --- 128 unchanged lines hidden (view full) --- 137 138 /* 139 * The current mapping. 140 * Use dm_get_live_table{_fast} or take suspend_lock for 141 * dereference. 142 */ 143 struct dm_table *map; 144 | 1/* 2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. 3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm.h" --- 128 unchanged lines hidden (view full) --- 137 138 /* 139 * The current mapping. 140 * Use dm_get_live_table{_fast} or take suspend_lock for 141 * dereference. 142 */ 143 struct dm_table *map; 144 |
145 struct list_head table_devices; 146 struct mutex table_devices_lock; 147 |
|
145 unsigned long flags; 146 147 struct request_queue *queue; 148 unsigned type; 149 /* Protect queue and type against concurrent access. */ 150 struct mutex type_lock; 151 152 struct target_type *immutable_target_type; --- 54 unchanged lines hidden (view full) --- 207/* 208 * For mempools pre-allocation at the table loading time. 209 */ 210struct dm_md_mempools { 211 mempool_t *io_pool; 212 struct bio_set *bs; 213}; 214 | 148 unsigned long flags; 149 150 struct request_queue *queue; 151 unsigned type; 152 /* Protect queue and type against concurrent access. */ 153 struct mutex type_lock; 154 155 struct target_type *immutable_target_type; --- 54 unchanged lines hidden (view full) --- 210/* 211 * For mempools pre-allocation at the table loading time. 212 */ 213struct dm_md_mempools { 214 mempool_t *io_pool; 215 struct bio_set *bs; 216}; 217 |
218struct table_device { 219 struct list_head list; 220 atomic_t count; 221 struct dm_dev dm_dev; 222}; 223 |
|
215#define RESERVED_BIO_BASED_IOS 16 216#define RESERVED_REQUEST_BASED_IOS 256 217#define RESERVED_MAX_IOS 1024 218static struct kmem_cache *_io_cache; 219static struct kmem_cache *_rq_tio_cache; 220 221/* 222 * Bio-based DM's mempools' reserved IOs set by the user. --- 442 unchanged lines hidden (view full) --- 665} 666 667static void dm_put_live_table_fast(struct mapped_device *md) __releases(RCU) 668{ 669 rcu_read_unlock(); 670} 671 672/* | 224#define RESERVED_BIO_BASED_IOS 16 225#define RESERVED_REQUEST_BASED_IOS 256 226#define RESERVED_MAX_IOS 1024 227static struct kmem_cache *_io_cache; 228static struct kmem_cache *_rq_tio_cache; 229 230/* 231 * Bio-based DM's mempools' reserved IOs set by the user. --- 442 unchanged lines hidden (view full) --- 674} 675 676static void dm_put_live_table_fast(struct mapped_device *md) __releases(RCU) 677{ 678 rcu_read_unlock(); 679} 680 681/* |
682 * Open a table device so we can use it as a map destination. 683 */ 684static int open_table_device(struct table_device *td, dev_t dev, 685 struct mapped_device *md) 686{ 687 static char *_claim_ptr = "I belong to device-mapper"; 688 struct block_device *bdev; 689 690 int r; 691 692 BUG_ON(td->dm_dev.bdev); 693 694 bdev = blkdev_get_by_dev(dev, td->dm_dev.mode | FMODE_EXCL, _claim_ptr); 695 if (IS_ERR(bdev)) 696 return PTR_ERR(bdev); 697 698 r = bd_link_disk_holder(bdev, dm_disk(md)); 699 if (r) { 700 blkdev_put(bdev, td->dm_dev.mode | FMODE_EXCL); 701 return r; 702 } 703 704 td->dm_dev.bdev = bdev; 705 return 0; 706} 707 708/* 709 * Close a table device that we've been using. 710 */ 711static void close_table_device(struct table_device *td, struct mapped_device *md) 712{ 713 if (!td->dm_dev.bdev) 714 return; 715 716 bd_unlink_disk_holder(td->dm_dev.bdev, dm_disk(md)); 717 blkdev_put(td->dm_dev.bdev, td->dm_dev.mode | FMODE_EXCL); 718 td->dm_dev.bdev = NULL; 719} 720 721static struct table_device *find_table_device(struct list_head *l, dev_t dev, 722 fmode_t mode) { 723 struct table_device *td; 724 725 list_for_each_entry(td, l, list) 726 if (td->dm_dev.bdev->bd_dev == dev && td->dm_dev.mode == mode) 727 return td; 728 729 return NULL; 730} 731 732int dm_get_table_device(struct mapped_device *md, dev_t dev, fmode_t mode, 733 struct dm_dev **result) { 734 int r; 735 struct table_device *td; 736 737 mutex_lock(&md->table_devices_lock); 738 td = find_table_device(&md->table_devices, dev, mode); 739 if (!td) { 740 td = kmalloc(sizeof(*td), GFP_KERNEL); 741 if (!td) { 742 mutex_unlock(&md->table_devices_lock); 743 return -ENOMEM; 744 } 745 746 td->dm_dev.mode = mode; 747 td->dm_dev.bdev = NULL; 748 749 if ((r = open_table_device(td, dev, md))) { 750 mutex_unlock(&md->table_devices_lock); 751 kfree(td); 752 return r; 753 } 754 755 format_dev_t(td->dm_dev.name, dev); 756 757 atomic_set(&td->count, 0); 758 list_add(&td->list, &md->table_devices); 759 } 760 atomic_inc(&td->count); 761 mutex_unlock(&md->table_devices_lock); 762 763 *result = &td->dm_dev; 764 return 0; 765} 766EXPORT_SYMBOL_GPL(dm_get_table_device); 767 768void dm_put_table_device(struct mapped_device *md, struct dm_dev *d) 769{ 770 struct table_device *td = container_of(d, struct table_device, dm_dev); 771 772 mutex_lock(&md->table_devices_lock); 773 if (atomic_dec_and_test(&td->count)) { 774 close_table_device(td, md); 775 list_del(&td->list); 776 kfree(td); 777 } 778 mutex_unlock(&md->table_devices_lock); 779} 780EXPORT_SYMBOL(dm_put_table_device); 781 782static void free_table_devices(struct list_head *devices) 783{ 784 struct list_head *tmp, *next; 785 786 list_for_each_safe(tmp, next, devices) { 787 struct table_device *td = list_entry(tmp, struct table_device, list); 788 789 DMWARN("dm_destroy: %s still exists with %d references", 790 td->dm_dev.name, atomic_read(&td->count)); 791 kfree(td); 792 } 793} 794 795/* |
|
673 * Get the geometry associated with a dm device 674 */ 675int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo) 676{ 677 *geo = md->geometry; 678 679 return 0; 680} --- 1258 unchanged lines hidden (view full) --- 1939 1940 r = init_srcu_struct(&md->io_barrier); 1941 if (r < 0) 1942 goto bad_io_barrier; 1943 1944 md->type = DM_TYPE_NONE; 1945 mutex_init(&md->suspend_lock); 1946 mutex_init(&md->type_lock); | 796 * Get the geometry associated with a dm device 797 */ 798int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo) 799{ 800 *geo = md->geometry; 801 802 return 0; 803} --- 1258 unchanged lines hidden (view full) --- 2062 2063 r = init_srcu_struct(&md->io_barrier); 2064 if (r < 0) 2065 goto bad_io_barrier; 2066 2067 md->type = DM_TYPE_NONE; 2068 mutex_init(&md->suspend_lock); 2069 mutex_init(&md->type_lock); |
2070 mutex_init(&md->table_devices_lock); |
|
1947 spin_lock_init(&md->deferred_lock); 1948 atomic_set(&md->holders, 1); 1949 atomic_set(&md->open_count, 0); 1950 atomic_set(&md->event_nr, 0); 1951 atomic_set(&md->uevent_seq, 0); 1952 INIT_LIST_HEAD(&md->uevent_list); | 2071 spin_lock_init(&md->deferred_lock); 2072 atomic_set(&md->holders, 1); 2073 atomic_set(&md->open_count, 0); 2074 atomic_set(&md->event_nr, 0); 2075 atomic_set(&md->uevent_seq, 0); 2076 INIT_LIST_HEAD(&md->uevent_list); |
2077 INIT_LIST_HEAD(&md->table_devices); |
|
1953 spin_lock_init(&md->uevent_lock); 1954 1955 md->queue = blk_alloc_queue(GFP_KERNEL); 1956 if (!md->queue) 1957 goto bad_queue; 1958 1959 dm_init_md_queue(md); 1960 --- 69 unchanged lines hidden (view full) --- 2030 destroy_workqueue(md->wq); 2031 if (md->io_pool) 2032 mempool_destroy(md->io_pool); 2033 if (md->bs) 2034 bioset_free(md->bs); 2035 blk_integrity_unregister(md->disk); 2036 del_gendisk(md->disk); 2037 cleanup_srcu_struct(&md->io_barrier); | 2078 spin_lock_init(&md->uevent_lock); 2079 2080 md->queue = blk_alloc_queue(GFP_KERNEL); 2081 if (!md->queue) 2082 goto bad_queue; 2083 2084 dm_init_md_queue(md); 2085 --- 69 unchanged lines hidden (view full) --- 2155 destroy_workqueue(md->wq); 2156 if (md->io_pool) 2157 mempool_destroy(md->io_pool); 2158 if (md->bs) 2159 bioset_free(md->bs); 2160 blk_integrity_unregister(md->disk); 2161 del_gendisk(md->disk); 2162 cleanup_srcu_struct(&md->io_barrier); |
2163 free_table_devices(&md->table_devices); |
|
2038 free_minor(minor); 2039 2040 spin_lock(&_minor_lock); 2041 md->disk->private_data = NULL; 2042 spin_unlock(&_minor_lock); 2043 2044 put_disk(md->disk); 2045 blk_cleanup_queue(md->queue); --- 907 unchanged lines hidden --- | 2164 free_minor(minor); 2165 2166 spin_lock(&_minor_lock); 2167 md->disk->private_data = NULL; 2168 spin_unlock(&_minor_lock); 2169 2170 put_disk(md->disk); 2171 blk_cleanup_queue(md->queue); --- 907 unchanged lines hidden --- |