bio_put(&io->tio.clone);
 }
 
-static struct dm_target_io *alloc_tio(struct clone_info *ci, struct dm_target *ti,
+static struct bio *alloc_tio(struct clone_info *ci, struct dm_target *ti,
                unsigned target_bio_nr, unsigned *len, gfp_t gfp_mask)
 {
        struct dm_target_io *tio;
        tio->target_bio_nr = target_bio_nr;
        tio->len_ptr = len;
 
-       return tio;
+       return &tio->clone;
 }
 
-static void free_tio(struct dm_target_io *tio)
+static void free_tio(struct bio *clone)
 {
-       if (tio->inside_dm_io)
+       if (clone_to_tio(clone)->inside_dm_io)
                return;
-       bio_put(&tio->clone);
+       bio_put(clone);
 }
 
 /*
                up(&md->swap_bios_semaphore);
        }
 
-       free_tio(tio);
+       free_tio(bio);
        dm_io_dec_pending(io, error);
 }
 
                        struct mapped_device *md = io->md;
                        up(&md->swap_bios_semaphore);
                }
-               free_tio(tio);
+               free_tio(clone);
                dm_io_dec_pending(io, BLK_STS_IOERR);
                break;
        case DM_MAPIO_REQUEUE:
                        struct mapped_device *md = io->md;
                        up(&md->swap_bios_semaphore);
                }
-               free_tio(tio);
+               free_tio(clone);
                dm_io_dec_pending(io, BLK_STS_DM_REQUEUE);
                break;
        default:
                                    sector_t sector, unsigned *len)
 {
        struct bio *bio = ci->bio, *clone;
-       struct dm_target_io *tio;
        int r;
 
-       tio = alloc_tio(ci, ti, 0, len, GFP_NOIO);
-       clone = &tio->clone;
+       clone = alloc_tio(ci, ti, 0, len, GFP_NOIO);
 
        r = bio_crypt_clone(clone, bio, GFP_NOIO);
        if (r < 0)
                goto free_tio;
 
        if (bio_integrity(bio)) {
+               struct dm_target_io *tio = clone_to_tio(clone);
+
                if (unlikely(!dm_target_has_integrity(tio->ti->type) &&
                             !dm_target_passes_integrity(tio->ti->type))) {
                        DMWARN("%s: the target %s doesn't support integrity data.",
        __map_bio(clone);
        return 0;
 free_tio:
-       free_tio(tio);
+       free_tio(clone);
        return r;
 }
 
                                struct dm_target *ti, unsigned num_bios,
                                unsigned *len)
 {
-       struct dm_target_io *tio;
+       struct bio *bio;
        int try;
 
        if (!num_bios)
                return;
 
        if (num_bios == 1) {
-               tio = alloc_tio(ci, ti, 0, len, GFP_NOIO);
-               bio_list_add(blist, &tio->clone);
+               bio = alloc_tio(ci, ti, 0, len, GFP_NOIO);
+               bio_list_add(blist, bio);
                return;
        }
 
        for (try = 0; try < 2; try++) {
                int bio_nr;
-               struct bio *bio;
 
                if (try)
                        mutex_lock(&ci->io->md->table_devices_lock);
                for (bio_nr = 0; bio_nr < num_bios; bio_nr++) {
-                       tio = alloc_tio(ci, ti, bio_nr, len,
+                       bio = alloc_tio(ci, ti, bio_nr, len,
                                        try ? GFP_NOIO : GFP_NOWAIT);
-                       if (!tio)
+                       if (!bio)
                                break;
 
-                       bio_list_add(blist, &tio->clone);
+                       bio_list_add(blist, bio);
                }
                if (try)
                        mutex_unlock(&ci->io->md->table_devices_lock);
                        return;
 
                while ((bio = bio_list_pop(blist)))
-                       free_tio(clone_to_tio(bio));
+                       free_tio(bio);
        }
 }