struct dm_raid1_bio_record {
        struct mirror *m;
+       /* if details->bi_bdev == NULL, details were not saved */
        struct dm_bio_details details;
+       region_t write_region;
 };
 
 /*
        int r, rw = bio_rw(bio);
        struct mirror *m;
        struct mirror_set *ms = ti->private;
-       struct dm_raid1_bio_record *bio_record;
        struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh);
+       struct dm_raid1_bio_record *bio_record =
+         dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
+
+       bio_record->details.bi_bdev = NULL;
 
        if (rw == WRITE) {
                /* Save region for mirror_end_io() handler */
-               map_context->ll = dm_rh_bio_to_region(ms->rh, bio);
+               bio_record->write_region = dm_rh_bio_to_region(ms->rh, bio);
                queue_bio(ms, bio, rw);
                return DM_MAPIO_SUBMITTED;
        }
        if (unlikely(!m))
                return -EIO;
 
-       bio_record = dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
        dm_bio_record(&bio_record->details, bio);
-       map_context->ptr = bio_record;
        bio_record->m = m;
 
        map_bio(m, bio);
        struct mirror_set *ms = (struct mirror_set *) ti->private;
        struct mirror *m = NULL;
        struct dm_bio_details *bd = NULL;
-       struct dm_raid1_bio_record *bio_record = map_context->ptr;
+       struct dm_raid1_bio_record *bio_record =
+         dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record));
 
        /*
         * We need to dec pending if this was a write.
         */
        if (rw == WRITE) {
                if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)))
-                       dm_rh_dec(ms->rh, map_context->ll);
+                       dm_rh_dec(ms->rh, bio_record->write_region);
                return error;
        }
 
                goto out;
 
        if (unlikely(error)) {
-               if (!bio_record) {
+               if (!bio_record->details.bi_bdev) {
                        /*
                         * There wasn't enough memory to record necessary
                         * information for a retry or there was no other
                        bd = &bio_record->details;
 
                        dm_bio_restore(bd, bio);
-                       map_context->ptr = NULL;
+                       bio_record->details.bi_bdev = NULL;
                        queue_bio(ms, bio, rw);
                        return DM_ENDIO_INCOMPLETE;
                }
        }
 
 out:
-       map_context->ptr = NULL;
+       bio_record->details.bi_bdev = NULL;
 
        return error;
 }