--- ./drivers/md/dm-table.c.dm2	2007-09-04 14:05:42.000000000 +0400
+++ ./drivers/md/dm-table.c	2007-10-29 11:33:55.000000000 +0300
@@ -102,6 +102,8 @@ static void combine_restrictions_low(str
 	lhs->seg_boundary_mask =
 		min_not_zero(lhs->seg_boundary_mask, rhs->seg_boundary_mask);
 
+	lhs->bounce_pfn = min_not_zero(lhs->bounce_pfn, rhs->bounce_pfn);
+
 	lhs->no_cluster |= rhs->no_cluster;
 }
 
@@ -570,6 +572,8 @@ int dm_get_device(struct dm_target *ti, 
 			min_not_zero(rs->seg_boundary_mask,
 				     q->seg_boundary_mask);
 
+		rs->bounce_pfn = min_not_zero(rs->bounce_pfn, q->bounce_pfn);
+
 		rs->no_cluster |= !test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
 	}
 
@@ -701,6 +705,8 @@ static void check_for_valid_limits(struc
 		rs->max_segment_size = MAX_SEGMENT_SIZE;
 	if (!rs->seg_boundary_mask)
 		rs->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK;
+	if (!rs->bounce_pfn)
+		rs->bounce_pfn = -1;
 }
 
 int dm_table_add_target(struct dm_table *t, const char *type,
@@ -885,6 +891,7 @@ void dm_table_set_restrictions(struct dm
 	q->hardsect_size = t->limits.hardsect_size;
 	q->max_segment_size = t->limits.max_segment_size;
 	q->seg_boundary_mask = t->limits.seg_boundary_mask;
+	q->bounce_pfn = t->limits.bounce_pfn;
 	if (t->limits.no_cluster)
 		q->queue_flags &= ~(1 << QUEUE_FLAG_CLUSTER);
 	else
--- ./include/linux/device-mapper.h.dm2	2007-10-29 11:39:03.000000000 +0300
+++ ./include/linux/device-mapper.h	2007-10-29 11:31:30.000000000 +0300
@@ -104,12 +104,13 @@ struct target_type {
 };
 
 struct io_restrictions {
+	unsigned long		seg_boundary_mask;
+	unsigned long		bounce_pfn;
 	unsigned int		max_sectors;
+	unsigned int		max_segment_size;
 	unsigned short		max_phys_segments;
 	unsigned short		max_hw_segments;
 	unsigned short		hardsect_size;
-	unsigned int		max_segment_size;
-	unsigned long		seg_boundary_mask;
 	unsigned char		no_cluster; /* inverted so that 0 is default */
 };
 
