/* Chunks with outstanding reads */
        spinlock_t tracked_chunk_lock;
-       mempool_t *tracked_chunk_pool;
        struct hlist_head tracked_chunk_hash[DM_TRACKED_CHUNK_HASH_SIZE];
 
        /* The on disk metadata handler */
        chunk_t chunk;
 };
 
-static struct kmem_cache *tracked_chunk_cache;
-
 static struct dm_snap_tracked_chunk *track_chunk(struct dm_snapshot *s,
+                                                struct bio *bio,
                                                 chunk_t chunk)
 {
-       struct dm_snap_tracked_chunk *c = mempool_alloc(s->tracked_chunk_pool,
-                                                       GFP_NOIO);
+       struct dm_snap_tracked_chunk *c = dm_per_bio_data(bio, sizeof(struct dm_snap_tracked_chunk));
 
        c->chunk = chunk;
 
        spin_lock_irqsave(&s->tracked_chunk_lock, flags);
        hlist_del(&c->node);
        spin_unlock_irqrestore(&s->tracked_chunk_lock, flags);
-
-       mempool_free(c, s->tracked_chunk_pool);
 }
 
 static int __chunk_is_tracked(struct dm_snapshot *s, chunk_t chunk)
                goto bad_pending_pool;
        }
 
-       s->tracked_chunk_pool = mempool_create_slab_pool(MIN_IOS,
-                                                        tracked_chunk_cache);
-       if (!s->tracked_chunk_pool) {
-               ti->error = "Could not allocate tracked_chunk mempool for "
-                           "tracking reads";
-               goto bad_tracked_chunk_pool;
-       }
-
        for (i = 0; i < DM_TRACKED_CHUNK_HASH_SIZE; i++)
                INIT_HLIST_HEAD(&s->tracked_chunk_hash[i]);
 
 
        ti->private = s;
        ti->num_flush_requests = num_flush_requests;
+       ti->per_bio_data_size = sizeof(struct dm_snap_tracked_chunk);
 
        /* Add snapshot to the list of snapshots for this origin */
        /* Exceptions aren't triggered till snapshot_resume() is called */
        unregister_snapshot(s);
 
 bad_load_and_register:
-       mempool_destroy(s->tracked_chunk_pool);
-
-bad_tracked_chunk_pool:
        mempool_destroy(s->pending_pool);
 
 bad_pending_pool:
                BUG_ON(!hlist_empty(&s->tracked_chunk_hash[i]));
 #endif
 
-       mempool_destroy(s->tracked_chunk_pool);
-
        __free_exceptions(s);
 
        mempool_destroy(s->pending_pool);
                }
        } else {
                bio->bi_bdev = s->origin->bdev;
-               map_context->ptr = track_chunk(s, chunk);
+               map_context->ptr = track_chunk(s, bio, chunk);
        }
 
 out_unlock:
                remap_exception(s, e, bio, chunk);
 
                if (bio_rw(bio) == WRITE)
-                       map_context->ptr = track_chunk(s, chunk);
+                       map_context->ptr = track_chunk(s, bio, chunk);
                goto out_unlock;
        }
 
 
 static struct target_type origin_target = {
        .name    = "snapshot-origin",
-       .version = {1, 7, 1},
+       .version = {1, 8, 0},
        .module  = THIS_MODULE,
        .ctr     = origin_ctr,
        .dtr     = origin_dtr,
 
 static struct target_type snapshot_target = {
        .name    = "snapshot",
-       .version = {1, 10, 0},
+       .version = {1, 11, 0},
        .module  = THIS_MODULE,
        .ctr     = snapshot_ctr,
        .dtr     = snapshot_dtr,
 
 static struct target_type merge_target = {
        .name    = dm_snapshot_merge_target_name,
-       .version = {1, 1, 0},
+       .version = {1, 2, 0},
        .module  = THIS_MODULE,
        .ctr     = snapshot_ctr,
        .dtr     = snapshot_dtr,
                goto bad_pending_cache;
        }
 
-       tracked_chunk_cache = KMEM_CACHE(dm_snap_tracked_chunk, 0);
-       if (!tracked_chunk_cache) {
-               DMERR("Couldn't create cache to track chunks in use.");
-               r = -ENOMEM;
-               goto bad_tracked_chunk_cache;
-       }
-
        return 0;
 
-bad_tracked_chunk_cache:
-       kmem_cache_destroy(pending_cache);
 bad_pending_cache:
        kmem_cache_destroy(exception_cache);
 bad_exception_cache:
        exit_origin_hash();
        kmem_cache_destroy(pending_cache);
        kmem_cache_destroy(exception_cache);
-       kmem_cache_destroy(tracked_chunk_cache);
 
        dm_exception_store_exit();
 }