Use mapinfo instead of messing with bi_private.
process_bio doesn't need to touch bi_bdev any more either.
---
 drivers/md/dm-thin.c |   16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

Index: linux-3.0-rc7/drivers/md/dm-thin.c
===================================================================
--- linux-3.0-rc7.orig/drivers/md/dm-thin.c
+++ linux-3.0-rc7/drivers/md/dm-thin.c
@@ -510,7 +510,6 @@ struct endio_hook {
 	struct thin_c *tc;
 
 	bio_end_io_t *saved_bi_end_io;
-	void *saved_bi_private;
 
 	struct deferred_entry *entry;
 };
@@ -534,21 +533,18 @@ struct new_mapping {
 	 */
 	struct bio *bio;
 	bio_end_io_t *saved_bi_end_io;
-	void *saved_bi_private;
 };
 
 #define save_and_set_bio_endio(m, bio, endio)		\
 do {							\
 	(m)->saved_bi_end_io = (bio)->bi_end_io;	\
-	(m)->saved_bi_private = (bio)->bi_private;	\
 	(bio)->bi_end_io = (endio);			\
-	(bio)->bi_private = (m);			\
+	dm_get_mapinfo((bio))->ptr = (m);		\
 } while (0)
 
 #define restore_bio_endio(m, bio)			\
 do {							\
 	(bio)->bi_end_io = (m)->saved_bi_end_io;	\
-	(bio)->bi_private = (m)->saved_bi_private;	\
 } while (0)
 
 /*----------------------------------------------------------------*/
@@ -684,7 +680,7 @@ static void copy_complete(int read_err, 
 static void overwrite_endio(struct bio *bio, int err)
 {
 	unsigned long flags;
-	struct new_mapping *m = bio->bi_private;
+	struct new_mapping *m = dm_get_mapinfo(bio)->ptr;
 	struct pool *pool = m->tc->pool;
 
 	m->err = err;
@@ -695,12 +691,11 @@ static void overwrite_endio(struct bio *
 	spin_unlock_irqrestore(&pool->lock, flags);
 }
 
-
 static void shared_read_endio(struct bio *bio, int err)
 {
 	struct list_head mappings;
 	struct new_mapping *m, *tmp;
-	struct endio_hook *endio_hook = bio->bi_private;
+	struct endio_hook *endio_hook = dm_get_mapinfo(bio)->ptr;
 	unsigned long flags;
 
 	restore_bio_endio(endio_hook, bio);
@@ -1040,7 +1035,6 @@ static void process_bio(struct thin_c *t
 
 	case -ENODATA:
 		if (bio_rw(bio) == READ || bio_rw(bio) == READA) {
-			bio->bi_bdev = tc->pool_dev->bdev;
 			zero_fill_bio(bio);
 			bio_endio(bio, 0);
 		} else
@@ -1054,7 +1048,7 @@ static void process_bio(struct thin_c *t
 	}
 }
 
-static void process_bios(struct pool *pool)
+static void process_deferred_bios(struct pool *pool)
 {
 	unsigned long flags;
 	struct bio *bio;
@@ -1128,7 +1122,7 @@ static void do_producer(struct work_stru
 {
 	struct pool *pool = container_of(ws, struct pool, producer);
 
-	process_bios(pool);
+	process_deferred_bios(pool);
 }
 
 static void do_consumer(struct work_struct *ws)
