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 ---