Hook the io before we call the targets map function, this allows us to
implement little things like the zero target.
--- diff/drivers/md/dm.c	2003-01-16 11:15:19.000000000 +0000
+++ source/drivers/md/dm.c	2003-02-13 10:42:13.000000000 +0000
@@ -349,28 +349,23 @@
 			       int rw, struct buffer_head *bh,
 			       struct dm_io *io)
 {
-	int r;
 	struct dm_target *ti;
 
 	ti = dm_table_find_target(md->map, bh->b_rsector);
 	if (!ti)
 		return -EINVAL;
 
-	r = ti->type->map(ti, bh, rw, &io->map_context);
-
-	if (r >= 0) {
-		/* hook the end io request fn */
-		atomic_inc(&md->pending);
-		io->md = md;
-		io->ti = ti;
-		io->rw = rw;
-		io->end_io = bh->b_end_io;
-		io->context = bh->b_private;
-		bh->b_end_io = dec_pending;
-		bh->b_private = io;
-	}
+	/* hook the end io request fn */
+	atomic_inc(&md->pending);
+	io->md = md;
+	io->ti = ti;
+	io->rw = rw;
+	io->end_io = bh->b_end_io;
+	io->context = bh->b_private;
+	bh->b_end_io = dec_pending;
+	bh->b_private = io;
 
-	return r;
+	return ti->type->map(ti, bh, rw, &io->map_context);
 }
 
 /*
@@ -443,7 +438,6 @@
 	return r;
 
  bad:
-	free_io(md, io);
 	buffer_IO_error(bh);
 	up_read(&md->lock);
 	dm_put(md);