dm.c (bd2a49b86d9aae0c505dcc99c0a073f9da2cc889) | dm.c (55a62eef8d1b50ceff3b7bf46851103bdcc7e5b0) |
---|---|
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" --- 1089 unchanged lines hidden (view full) --- 1098 1099 if (idx != bio->bi_idx || clone->bi_size < bio->bi_size) 1100 trim = 1; 1101 clone_bio_integrity(bio, clone, idx, len, 0, trim); 1102} 1103 1104static struct dm_target_io *alloc_tio(struct clone_info *ci, 1105 struct dm_target *ti, int nr_iovecs, | 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" --- 1089 unchanged lines hidden (view full) --- 1098 1099 if (idx != bio->bi_idx || clone->bi_size < bio->bi_size) 1100 trim = 1; 1101 clone_bio_integrity(bio, clone, idx, len, 0, trim); 1102} 1103 1104static struct dm_target_io *alloc_tio(struct clone_info *ci, 1105 struct dm_target *ti, int nr_iovecs, |
1106 unsigned target_request_nr) | 1106 unsigned target_bio_nr) |
1107{ 1108 struct dm_target_io *tio; 1109 struct bio *clone; 1110 1111 clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, ci->md->bs); 1112 tio = container_of(clone, struct dm_target_io, clone); 1113 1114 tio->io = ci->io; 1115 tio->ti = ti; 1116 memset(&tio->info, 0, sizeof(tio->info)); | 1107{ 1108 struct dm_target_io *tio; 1109 struct bio *clone; 1110 1111 clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, ci->md->bs); 1112 tio = container_of(clone, struct dm_target_io, clone); 1113 1114 tio->io = ci->io; 1115 tio->ti = ti; 1116 memset(&tio->info, 0, sizeof(tio->info)); |
1117 tio->target_request_nr = target_request_nr; | 1117 tio->target_bio_nr = target_bio_nr; |
1118 1119 return tio; 1120} 1121 1122static void __issue_target_request(struct clone_info *ci, struct dm_target *ti, | 1118 1119 return tio; 1120} 1121 1122static void __issue_target_request(struct clone_info *ci, struct dm_target *ti, |
1123 unsigned request_nr, sector_t len) | 1123 unsigned target_bio_nr, sector_t len) |
1124{ | 1124{ |
1125 struct dm_target_io *tio = alloc_tio(ci, ti, ci->bio->bi_max_vecs, request_nr); | 1125 struct dm_target_io *tio = alloc_tio(ci, ti, ci->bio->bi_max_vecs, target_bio_nr); |
1126 struct bio *clone = &tio->clone; 1127 1128 /* 1129 * Discard requests require the bio's inline iovecs be initialized. 1130 * ci->bio->bi_max_vecs is BIO_INLINE_VECS anyway, for both flush 1131 * and discard, so no need for concern about wasted bvec allocations. 1132 */ 1133 __bio_clone(clone, ci->bio); 1134 if (len) 1135 bio_setup_sector(clone, ci->sector, len); 1136 1137 __map_bio(tio); 1138} 1139 | 1126 struct bio *clone = &tio->clone; 1127 1128 /* 1129 * Discard requests require the bio's inline iovecs be initialized. 1130 * ci->bio->bi_max_vecs is BIO_INLINE_VECS anyway, for both flush 1131 * and discard, so no need for concern about wasted bvec allocations. 1132 */ 1133 __bio_clone(clone, ci->bio); 1134 if (len) 1135 bio_setup_sector(clone, ci->sector, len); 1136 1137 __map_bio(tio); 1138} 1139 |
1140static void __issue_target_requests(struct clone_info *ci, struct dm_target *ti, 1141 unsigned num_requests, sector_t len) | 1140static void __issue_target_bios(struct clone_info *ci, struct dm_target *ti, 1141 unsigned num_bios, sector_t len) |
1142{ | 1142{ |
1143 unsigned request_nr; | 1143 unsigned target_bio_nr; |
1144 | 1144 |
1145 for (request_nr = 0; request_nr < num_requests; request_nr++) 1146 __issue_target_request(ci, ti, request_nr, len); | 1145 for (target_bio_nr = 0; target_bio_nr < num_bios; target_bio_nr++) 1146 __issue_target_request(ci, ti, target_bio_nr, len); |
1147} 1148 1149static int __clone_and_map_empty_flush(struct clone_info *ci) 1150{ 1151 unsigned target_nr = 0; 1152 struct dm_target *ti; 1153 1154 BUG_ON(bio_has_data(ci->bio)); 1155 while ((ti = dm_table_get_target(ci->map, target_nr++))) | 1147} 1148 1149static int __clone_and_map_empty_flush(struct clone_info *ci) 1150{ 1151 unsigned target_nr = 0; 1152 struct dm_target *ti; 1153 1154 BUG_ON(bio_has_data(ci->bio)); 1155 while ((ti = dm_table_get_target(ci->map, target_nr++))) |
1156 __issue_target_requests(ci, ti, ti->num_flush_requests, 0); | 1156 __issue_target_bios(ci, ti, ti->num_flush_bios, 0); |
1157 1158 return 0; 1159} 1160 1161/* 1162 * Perform all io with a single clone. 1163 */ 1164static void __clone_and_map_simple(struct clone_info *ci, struct dm_target *ti) 1165{ 1166 struct bio *bio = ci->bio; 1167 struct dm_target_io *tio; 1168 1169 tio = alloc_tio(ci, ti, bio->bi_max_vecs, 0); 1170 clone_bio(tio, bio, ci->sector, ci->idx, bio->bi_vcnt - ci->idx, 1171 ci->sector_count); 1172 __map_bio(tio); 1173 ci->sector_count = 0; 1174} 1175 | 1157 1158 return 0; 1159} 1160 1161/* 1162 * Perform all io with a single clone. 1163 */ 1164static void __clone_and_map_simple(struct clone_info *ci, struct dm_target *ti) 1165{ 1166 struct bio *bio = ci->bio; 1167 struct dm_target_io *tio; 1168 1169 tio = alloc_tio(ci, ti, bio->bi_max_vecs, 0); 1170 clone_bio(tio, bio, ci->sector, ci->idx, bio->bi_vcnt - ci->idx, 1171 ci->sector_count); 1172 __map_bio(tio); 1173 ci->sector_count = 0; 1174} 1175 |
1176typedef unsigned (*get_num_requests_fn)(struct dm_target *ti); | 1176typedef unsigned (*get_num_bios_fn)(struct dm_target *ti); |
1177 | 1177 |
1178static unsigned get_num_discard_requests(struct dm_target *ti) | 1178static unsigned get_num_discard_bios(struct dm_target *ti) |
1179{ | 1179{ |
1180 return ti->num_discard_requests; | 1180 return ti->num_discard_bios; |
1181} 1182 | 1181} 1182 |
1183static unsigned get_num_write_same_requests(struct dm_target *ti) | 1183static unsigned get_num_write_same_bios(struct dm_target *ti) |
1184{ | 1184{ |
1185 return ti->num_write_same_requests; | 1185 return ti->num_write_same_bios; |
1186} 1187 1188typedef bool (*is_split_required_fn)(struct dm_target *ti); 1189 1190static bool is_split_required_for_discard(struct dm_target *ti) 1191{ | 1186} 1187 1188typedef bool (*is_split_required_fn)(struct dm_target *ti); 1189 1190static bool is_split_required_for_discard(struct dm_target *ti) 1191{ |
1192 return ti->split_discard_requests; | 1192 return ti->split_discard_bios; |
1193} 1194 1195static int __clone_and_map_changing_extent_only(struct clone_info *ci, | 1193} 1194 1195static int __clone_and_map_changing_extent_only(struct clone_info *ci, |
1196 get_num_requests_fn get_num_requests, | 1196 get_num_bios_fn get_num_bios, |
1197 is_split_required_fn is_split_required) 1198{ 1199 struct dm_target *ti; 1200 sector_t len; | 1197 is_split_required_fn is_split_required) 1198{ 1199 struct dm_target *ti; 1200 sector_t len; |
1201 unsigned num_requests; | 1201 unsigned num_bios; |
1202 1203 do { 1204 ti = dm_table_find_target(ci->map, ci->sector); 1205 if (!dm_target_is_valid(ti)) 1206 return -EIO; 1207 1208 /* 1209 * Even though the device advertised support for this type of 1210 * request, that does not mean every target supports it, and 1211 * reconfiguration might also have changed that since the 1212 * check was performed. 1213 */ | 1202 1203 do { 1204 ti = dm_table_find_target(ci->map, ci->sector); 1205 if (!dm_target_is_valid(ti)) 1206 return -EIO; 1207 1208 /* 1209 * Even though the device advertised support for this type of 1210 * request, that does not mean every target supports it, and 1211 * reconfiguration might also have changed that since the 1212 * check was performed. 1213 */ |
1214 num_requests = get_num_requests ? get_num_requests(ti) : 0; 1215 if (!num_requests) | 1214 num_bios = get_num_bios ? get_num_bios(ti) : 0; 1215 if (!num_bios) |
1216 return -EOPNOTSUPP; 1217 1218 if (is_split_required && !is_split_required(ti)) 1219 len = min(ci->sector_count, max_io_len_target_boundary(ci->sector, ti)); 1220 else 1221 len = min(ci->sector_count, max_io_len(ci->sector, ti)); 1222 | 1216 return -EOPNOTSUPP; 1217 1218 if (is_split_required && !is_split_required(ti)) 1219 len = min(ci->sector_count, max_io_len_target_boundary(ci->sector, ti)); 1220 else 1221 len = min(ci->sector_count, max_io_len(ci->sector, ti)); 1222 |
1223 __issue_target_requests(ci, ti, num_requests, len); | 1223 __issue_target_bios(ci, ti, num_bios, len); |
1224 1225 ci->sector += len; 1226 } while (ci->sector_count -= len); 1227 1228 return 0; 1229} 1230 1231static int __clone_and_map_discard(struct clone_info *ci) 1232{ | 1224 1225 ci->sector += len; 1226 } while (ci->sector_count -= len); 1227 1228 return 0; 1229} 1230 1231static int __clone_and_map_discard(struct clone_info *ci) 1232{ |
1233 return __clone_and_map_changing_extent_only(ci, get_num_discard_requests, | 1233 return __clone_and_map_changing_extent_only(ci, get_num_discard_bios, |
1234 is_split_required_for_discard); 1235} 1236 1237static int __clone_and_map_write_same(struct clone_info *ci) 1238{ | 1234 is_split_required_for_discard); 1235} 1236 1237static int __clone_and_map_write_same(struct clone_info *ci) 1238{ |
1239 return __clone_and_map_changing_extent_only(ci, get_num_write_same_requests, NULL); | 1239 return __clone_and_map_changing_extent_only(ci, get_num_write_same_bios, NULL); |
1240} 1241 1242static int __clone_and_map(struct clone_info *ci) 1243{ 1244 struct bio *bio = ci->bio; 1245 struct dm_target *ti; 1246 sector_t len = 0, max; 1247 struct dm_target_io *tio; --- 1586 unchanged lines hidden --- | 1240} 1241 1242static int __clone_and_map(struct clone_info *ci) 1243{ 1244 struct bio *bio = ci->bio; 1245 struct dm_target *ti; 1246 sector_t len = 0, max; 1247 struct dm_target_io *tio; --- 1586 unchanged lines hidden --- |