dm.c (8eabf5d0a7bd9226d6cc25402dde67f372aae838) dm.c (dc8e2021da71f6b2d5971f98ee3e528cf30c409c)
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-core.h"

--- 531 unchanged lines hidden (view full) ---

540}
541
542static void free_io(struct mapped_device *md, struct dm_io *io)
543{
544 bio_put(&io->tio.clone);
545}
546
547static struct dm_target_io *alloc_tio(struct clone_info *ci, struct dm_target *ti,
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-core.h"

--- 531 unchanged lines hidden (view full) ---

540}
541
542static void free_io(struct mapped_device *md, struct dm_io *io)
543{
544 bio_put(&io->tio.clone);
545}
546
547static struct dm_target_io *alloc_tio(struct clone_info *ci, struct dm_target *ti,
548 unsigned target_bio_nr, gfp_t gfp_mask)
548 unsigned target_bio_nr, unsigned *len, gfp_t gfp_mask)
549{
550 struct dm_target_io *tio;
551
552 if (!ci->io->tio.io) {
553 /* the dm_target_io embedded in ci->io is available */
554 tio = &ci->io->tio;
555 } else {
556 struct bio *clone = bio_alloc_bioset(NULL, 0, 0, gfp_mask,
557 &ci->io->md->bs);
558 if (!clone)
559 return NULL;
560
561 tio = clone_to_tio(clone);
562 tio->inside_dm_io = false;
563 }
549{
550 struct dm_target_io *tio;
551
552 if (!ci->io->tio.io) {
553 /* the dm_target_io embedded in ci->io is available */
554 tio = &ci->io->tio;
555 } else {
556 struct bio *clone = bio_alloc_bioset(NULL, 0, 0, gfp_mask,
557 &ci->io->md->bs);
558 if (!clone)
559 return NULL;
560
561 tio = clone_to_tio(clone);
562 tio->inside_dm_io = false;
563 }
564 __bio_clone_fast(&tio->clone, ci->bio);
564
565 tio->magic = DM_TIO_MAGIC;
566 tio->io = ci->io;
567 tio->ti = ti;
568 tio->target_bio_nr = target_bio_nr;
565
566 tio->magic = DM_TIO_MAGIC;
567 tio->io = ci->io;
568 tio->ti = ti;
569 tio->target_bio_nr = target_bio_nr;
570 tio->len_ptr = len;
569
570 return tio;
571}
572
573static void free_tio(struct dm_target_io *tio)
574{
575 if (tio->inside_dm_io)
576 return;

--- 615 unchanged lines hidden (view full) ---

1192 */
1193static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti,
1194 sector_t sector, unsigned *len)
1195{
1196 struct bio *bio = ci->bio, *clone;
1197 struct dm_target_io *tio;
1198 int r;
1199
571
572 return tio;
573}
574
575static void free_tio(struct dm_target_io *tio)
576{
577 if (tio->inside_dm_io)
578 return;

--- 615 unchanged lines hidden (view full) ---

1194 */
1195static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti,
1196 sector_t sector, unsigned *len)
1197{
1198 struct bio *bio = ci->bio, *clone;
1199 struct dm_target_io *tio;
1200 int r;
1201
1200 tio = alloc_tio(ci, ti, 0, GFP_NOIO);
1201 tio->len_ptr = len;
1202
1202 tio = alloc_tio(ci, ti, 0, len, GFP_NOIO);
1203 clone = &tio->clone;
1203 clone = &tio->clone;
1204 __bio_clone_fast(clone, bio);
1205
1206 r = bio_crypt_clone(clone, bio, GFP_NOIO);
1207 if (r < 0)
1208 goto free_tio;
1209
1210 if (bio_integrity(bio)) {
1211 if (unlikely(!dm_target_has_integrity(tio->ti->type) &&
1212 !dm_target_passes_integrity(tio->ti->type))) {

--- 18 unchanged lines hidden (view full) ---

1231 __map_bio(tio);
1232 return 0;
1233free_tio:
1234 free_tio(tio);
1235 return r;
1236}
1237
1238static void alloc_multiple_bios(struct bio_list *blist, struct clone_info *ci,
1204
1205 r = bio_crypt_clone(clone, bio, GFP_NOIO);
1206 if (r < 0)
1207 goto free_tio;
1208
1209 if (bio_integrity(bio)) {
1210 if (unlikely(!dm_target_has_integrity(tio->ti->type) &&
1211 !dm_target_passes_integrity(tio->ti->type))) {

--- 18 unchanged lines hidden (view full) ---

1230 __map_bio(tio);
1231 return 0;
1232free_tio:
1233 free_tio(tio);
1234 return r;
1235}
1236
1237static void alloc_multiple_bios(struct bio_list *blist, struct clone_info *ci,
1239 struct dm_target *ti, unsigned num_bios)
1238 struct dm_target *ti, unsigned num_bios,
1239 unsigned *len)
1240{
1241 struct dm_target_io *tio;
1242 int try;
1243
1244 if (!num_bios)
1245 return;
1246
1247 if (num_bios == 1) {
1240{
1241 struct dm_target_io *tio;
1242 int try;
1243
1244 if (!num_bios)
1245 return;
1246
1247 if (num_bios == 1) {
1248 tio = alloc_tio(ci, ti, 0, GFP_NOIO);
1248 tio = alloc_tio(ci, ti, 0, len, GFP_NOIO);
1249 bio_list_add(blist, &tio->clone);
1250 return;
1251 }
1252
1253 for (try = 0; try < 2; try++) {
1254 int bio_nr;
1255 struct bio *bio;
1256
1257 if (try)
1258 mutex_lock(&ci->io->md->table_devices_lock);
1259 for (bio_nr = 0; bio_nr < num_bios; bio_nr++) {
1249 bio_list_add(blist, &tio->clone);
1250 return;
1251 }
1252
1253 for (try = 0; try < 2; try++) {
1254 int bio_nr;
1255 struct bio *bio;
1256
1257 if (try)
1258 mutex_lock(&ci->io->md->table_devices_lock);
1259 for (bio_nr = 0; bio_nr < num_bios; bio_nr++) {
1260 tio = alloc_tio(ci, ti, bio_nr, try ? GFP_NOIO : GFP_NOWAIT);
1260 tio = alloc_tio(ci, ti, bio_nr, len,
1261 try ? GFP_NOIO : GFP_NOWAIT);
1261 if (!tio)
1262 break;
1263
1264 bio_list_add(blist, &tio->clone);
1265 }
1266 if (try)
1267 mutex_unlock(&ci->io->md->table_devices_lock);
1268 if (bio_nr == num_bios)

--- 5 unchanged lines hidden (view full) ---

1274}
1275
1276static void __send_duplicate_bios(struct clone_info *ci, struct dm_target *ti,
1277 unsigned num_bios, unsigned *len)
1278{
1279 struct bio_list blist = BIO_EMPTY_LIST;
1280 struct bio *clone;
1281
1262 if (!tio)
1263 break;
1264
1265 bio_list_add(blist, &tio->clone);
1266 }
1267 if (try)
1268 mutex_unlock(&ci->io->md->table_devices_lock);
1269 if (bio_nr == num_bios)

--- 5 unchanged lines hidden (view full) ---

1275}
1276
1277static void __send_duplicate_bios(struct clone_info *ci, struct dm_target *ti,
1278 unsigned num_bios, unsigned *len)
1279{
1280 struct bio_list blist = BIO_EMPTY_LIST;
1281 struct bio *clone;
1282
1282 alloc_multiple_bios(&blist, ci, ti, num_bios);
1283 alloc_multiple_bios(&blist, ci, ti, num_bios, len);
1283
1284 while ((clone = bio_list_pop(&blist))) {
1285 struct dm_target_io *tio = clone_to_tio(clone);
1286
1284
1285 while ((clone = bio_list_pop(&blist))) {
1286 struct dm_target_io *tio = clone_to_tio(clone);
1287
1287 tio->len_ptr = len;
1288
1289 __bio_clone_fast(clone, ci->bio);
1290 if (len)
1291 bio_setup_sector(clone, ci->sector, *len);
1292 __map_bio(tio);
1293 }
1294}
1295
1296static int __send_empty_flush(struct clone_info *ci)
1297{

--- 1674 unchanged lines hidden ---
1288 if (len)
1289 bio_setup_sector(clone, ci->sector, *len);
1290 __map_bio(tio);
1291 }
1292}
1293
1294static int __send_empty_flush(struct clone_info *ci)
1295{

--- 1674 unchanged lines hidden ---