@@ -136,14 +136,6 @@ static int get_swap_bios(void)
136
136
return latch ;
137
137
}
138
138
139
- /*
140
- * For mempools pre-allocation at the table loading time.
141
- */
142
- struct dm_md_mempools {
143
- struct bio_set bs ;
144
- struct bio_set io_bs ;
145
- };
146
-
147
139
struct table_device {
148
140
struct list_head list ;
149
141
refcount_t count ;
@@ -581,7 +573,7 @@ static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio)
581
573
struct dm_target_io * tio ;
582
574
struct bio * clone ;
583
575
584
- clone = bio_alloc_clone (NULL , bio , GFP_NOIO , & md -> io_bs );
576
+ clone = bio_alloc_clone (NULL , bio , GFP_NOIO , & md -> mempools -> io_bs );
585
577
/* Set default bdev, but target must bio_set_dev() before issuing IO */
586
578
clone -> bi_bdev = md -> disk -> part0 ;
587
579
@@ -628,7 +620,8 @@ static struct bio *alloc_tio(struct clone_info *ci, struct dm_target *ti,
628
620
} else {
629
621
struct mapped_device * md = ci -> io -> md ;
630
622
631
- clone = bio_alloc_clone (NULL , ci -> bio , gfp_mask , & md -> bs );
623
+ clone = bio_alloc_clone (NULL , ci -> bio , gfp_mask ,
624
+ & md -> mempools -> bs );
632
625
if (!clone )
633
626
return NULL ;
634
627
/* Set default bdev, but target must bio_set_dev() before issuing IO */
@@ -1023,23 +1016,19 @@ static void clone_endio(struct bio *bio)
1023
1016
struct dm_io * io = tio -> io ;
1024
1017
struct mapped_device * md = io -> md ;
1025
1018
1026
- if (likely (bio -> bi_bdev != md -> disk -> part0 )) {
1027
- struct request_queue * q = bdev_get_queue (bio -> bi_bdev );
1028
-
1029
- if (unlikely (error == BLK_STS_TARGET )) {
1030
- if (bio_op (bio ) == REQ_OP_DISCARD &&
1031
- !bdev_max_discard_sectors (bio -> bi_bdev ))
1032
- disable_discard (md );
1033
- else if (bio_op (bio ) == REQ_OP_WRITE_ZEROES &&
1034
- !q -> limits .max_write_zeroes_sectors )
1035
- disable_write_zeroes (md );
1036
- }
1037
-
1038
- if (static_branch_unlikely (& zoned_enabled ) &&
1039
- unlikely (blk_queue_is_zoned (q )))
1040
- dm_zone_endio (io , bio );
1019
+ if (unlikely (error == BLK_STS_TARGET )) {
1020
+ if (bio_op (bio ) == REQ_OP_DISCARD &&
1021
+ !bdev_max_discard_sectors (bio -> bi_bdev ))
1022
+ disable_discard (md );
1023
+ else if (bio_op (bio ) == REQ_OP_WRITE_ZEROES &&
1024
+ !bdev_write_zeroes_sectors (bio -> bi_bdev ))
1025
+ disable_write_zeroes (md );
1041
1026
}
1042
1027
1028
+ if (static_branch_unlikely (& zoned_enabled ) &&
1029
+ unlikely (blk_queue_is_zoned (bdev_get_queue (bio -> bi_bdev ))))
1030
+ dm_zone_endio (io , bio );
1031
+
1043
1032
if (endio ) {
1044
1033
int r = endio (ti , bio , & error );
1045
1034
switch (r ) {
@@ -1876,8 +1865,7 @@ static void cleanup_mapped_device(struct mapped_device *md)
1876
1865
{
1877
1866
if (md -> wq )
1878
1867
destroy_workqueue (md -> wq );
1879
- bioset_exit (& md -> bs );
1880
- bioset_exit (& md -> io_bs );
1868
+ dm_free_md_mempools (md -> mempools );
1881
1869
1882
1870
if (md -> dax_dev ) {
1883
1871
dax_remove_host (md -> disk );
@@ -2049,48 +2037,6 @@ static void free_dev(struct mapped_device *md)
2049
2037
kvfree (md );
2050
2038
}
2051
2039
2052
- static int __bind_mempools (struct mapped_device * md , struct dm_table * t )
2053
- {
2054
- struct dm_md_mempools * p = dm_table_get_md_mempools (t );
2055
- int ret = 0 ;
2056
-
2057
- if (dm_table_bio_based (t )) {
2058
- /*
2059
- * The md may already have mempools that need changing.
2060
- * If so, reload bioset because front_pad may have changed
2061
- * because a different table was loaded.
2062
- */
2063
- bioset_exit (& md -> bs );
2064
- bioset_exit (& md -> io_bs );
2065
-
2066
- } else if (bioset_initialized (& md -> bs )) {
2067
- /*
2068
- * There's no need to reload with request-based dm
2069
- * because the size of front_pad doesn't change.
2070
- * Note for future: If you are to reload bioset,
2071
- * prep-ed requests in the queue may refer
2072
- * to bio from the old bioset, so you must walk
2073
- * through the queue to unprep.
2074
- */
2075
- goto out ;
2076
- }
2077
-
2078
- BUG_ON (!p ||
2079
- bioset_initialized (& md -> bs ) ||
2080
- bioset_initialized (& md -> io_bs ));
2081
-
2082
- ret = bioset_init_from_src (& md -> bs , & p -> bs );
2083
- if (ret )
2084
- goto out ;
2085
- ret = bioset_init_from_src (& md -> io_bs , & p -> io_bs );
2086
- if (ret )
2087
- bioset_exit (& md -> bs );
2088
- out :
2089
- /* mempool bind completed, no longer need any mempools in the table */
2090
- dm_table_free_md_mempools (t );
2091
- return ret ;
2092
- }
2093
-
2094
2040
/*
2095
2041
* Bind a table to the device.
2096
2042
*/
@@ -2144,12 +2090,28 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
2144
2090
* immutable singletons - used to optimize dm_mq_queue_rq.
2145
2091
*/
2146
2092
md -> immutable_target = dm_table_get_immutable_target (t );
2147
- }
2148
2093
2149
- ret = __bind_mempools (md , t );
2150
- if (ret ) {
2151
- old_map = ERR_PTR (ret );
2152
- goto out ;
2094
+ /*
2095
+ * There is no need to reload with request-based dm because the
2096
+ * size of front_pad doesn't change.
2097
+ *
2098
+ * Note for future: If you are to reload bioset, prep-ed
2099
+ * requests in the queue may refer to bio from the old bioset,
2100
+ * so you must walk through the queue to unprep.
2101
+ */
2102
+ if (!md -> mempools ) {
2103
+ md -> mempools = t -> mempools ;
2104
+ t -> mempools = NULL ;
2105
+ }
2106
+ } else {
2107
+ /*
2108
+ * The md may already have mempools that need changing.
2109
+ * If so, reload bioset because front_pad may have changed
2110
+ * because a different table was loaded.
2111
+ */
2112
+ dm_free_md_mempools (md -> mempools );
2113
+ md -> mempools = t -> mempools ;
2114
+ t -> mempools = NULL ;
2153
2115
}
2154
2116
2155
2117
ret = dm_table_set_restrictions (t , md -> queue , limits );
0 commit comments