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