static void __map_bio(struct dm_target *ti, struct bio *clone, struct target_io *tio) { int r; sector_t sector; struct mapped_device *md; /* * Sanity checks. */ BUG_ON(!clone->bi_size); clone->bi_end_io = clone_endio; clone->bi_private = tio; /* * Map the clone. If r == 0 we don't need to do * anything, the target has assumed ownership of * this io. */ atomic_inc(&tio->io->io_count); sector = clone->bi_sector; r = ti->type->map(ti, clone, &tio->info); if (r == DM_MAPIO_REMAPPED) { /* the bio has been remapped so dispatch it */ blk_add_trace_remap(bdev_get_queue(clone->bi_bdev), clone, tio->io->bio->bi_bdev->bd_dev, sector, clone->bi_sector); generic_make_request(clone); } else if (r < 0 || r == DM_MAPIO_REQUEUE) { /* error the io and bail out, or requeue it if needed */ md = tio->io->md; dec_pending(tio->io, r); /* * Store bio_set for cleanup. */ clone->bi_private = md->bs; bio_put(clone); free_tio(md, tio); } else if (r) { DMWARN("unimplemented target map return value: %d", r); BUG(); } }
/**ltl * 功能: 映射bio请求到目标设备上 * 参数: ti -> 目标设备 * clone-> bio请求 * tio -> 目标io请求对象 * 返回值: * 说明: */ static void __map_bio(struct dm_target *ti, struct bio *clone, struct target_io *tio) { int r; sector_t sector; /* * Sanity checks. */ BUG_ON(!clone->bi_size); clone->bi_end_io = clone_endio; clone->bi_private = tio; /* * Map the clone. If r == 0 we don't need to do * anything, the target has assumed ownership of * this io. */ atomic_inc(&tio->io->io_count); sector = clone->bi_sector; /* 将请求映射到目标设备上 */ r = ti->type->map(ti, clone, &tio->info);/* 调用linear_map函数 */ if (r > 0) { /* the bio has been remapped so dispatch it */ blk_add_trace_remap(bdev_get_queue(clone->bi_bdev), clone, tio->io->bio->bi_bdev->bd_dev, sector, clone->bi_sector); /* 将请求提交到块设备层(插入到IO调度队列中) */ generic_make_request(clone); } else if (r < 0) { /* error the io and bail out */ struct dm_io *io = tio->io; free_tio(tio->io->md, tio); dec_pending(io, r); bio_put(clone); } }