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