From: Mikulas Patocka <[email-masked]>

Prepare for full barrier implementation: first remove the restricted support.

Signed-off-by: Mikulas Patocka <[email-masked]>
Signed-off-by: Alasdair G Kergon <[email-masked]>

---
 drivers/md/dm-linear.c        |    1 -
 drivers/md/dm-table.c         |   19 -------------------
 drivers/md/dm.c               |   15 ++++++++++-----
 drivers/md/dm.h               |    1 -
 include/linux/device-mapper.h |    1 -
 5 files changed, 10 insertions(+), 27 deletions(-)

Index: linux-2.6.30-rc1/drivers/md/dm-linear.c
===================================================================
--- linux-2.6.30-rc1.orig/drivers/md/dm-linear.c	2009-04-08 22:24:24.000000000 +0100
+++ linux-2.6.30-rc1/drivers/md/dm-linear.c	2009-04-08 22:28:01.000000000 +0100
@@ -142,7 +142,6 @@ static struct target_type linear_target 
 	.status = linear_status,
 	.ioctl  = linear_ioctl,
 	.merge  = linear_merge,
-	.features = DM_TARGET_SUPPORTS_BARRIERS,
 };
 
 int __init dm_linear_init(void)
Index: linux-2.6.30-rc1/drivers/md/dm-table.c
===================================================================
--- linux-2.6.30-rc1.orig/drivers/md/dm-table.c	2009-04-08 22:27:59.000000000 +0100
+++ linux-2.6.30-rc1/drivers/md/dm-table.c	2009-04-08 22:28:01.000000000 +0100
@@ -52,8 +52,6 @@ struct dm_table {
 	sector_t *highs;
 	struct dm_target *targets;
 
-	unsigned barriers_supported:1;
-
 	/*
 	 * Indicates the rw permissions for the new logical
 	 * device.  This should be a combination of FMODE_READ
@@ -243,7 +241,6 @@ int dm_table_create(struct dm_table **re
 
 	INIT_LIST_HEAD(&t->devices);
 	atomic_set(&t->holders, 0);
-	t->barriers_supported = 1;
 
 	if (!num_targets)
 		num_targets = KEYS_PER_NODE;
@@ -751,10 +748,6 @@ int dm_table_add_target(struct dm_table 
 	/* FIXME: the plan is to combine high here and then have
 	 * the merge fn apply the target level restrictions. */
 	combine_restrictions_low(&t->limits, &tgt->limits);
-
-	if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS))
-		t->barriers_supported = 0;
-
 	return 0;
 
  bad:
@@ -799,12 +792,6 @@ int dm_table_complete(struct dm_table *t
 
 	check_for_valid_limits(&t->limits);
 
-	/*
-	 * We only support barriers if there is exactly one underlying device.
-	 */
-	if (!list_is_singular(&t->devices))
-		t->barriers_supported = 0;
-
 	/* how many indexes will the btree have ? */
 	leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE);
 	t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE);
@@ -1059,12 +1046,6 @@ struct mapped_device *dm_table_get_md(st
 	return t->md;
 }
 
-int dm_table_barrier_ok(struct dm_table *t)
-{
-	return t->barriers_supported;
-}
-EXPORT_SYMBOL(dm_table_barrier_ok);
-
 EXPORT_SYMBOL(dm_vcalloc);
 EXPORT_SYMBOL(dm_get_device);
 EXPORT_SYMBOL(dm_put_device);
Index: linux-2.6.30-rc1/drivers/md/dm.c
===================================================================
--- linux-2.6.30-rc1.orig/drivers/md/dm.c	2009-04-08 22:27:59.000000000 +0100
+++ linux-2.6.30-rc1/drivers/md/dm.c	2009-04-08 22:28:01.000000000 +0100
@@ -851,11 +851,7 @@ static void __split_and_process_bio(stru
 		bio_io_error(bio);
 		return;
 	}
-	if (unlikely(bio_barrier(bio) && !dm_table_barrier_ok(ci.map))) {
-		dm_table_put(ci.map);
-		bio_endio(bio, -EOPNOTSUPP);
-		return;
-	}
+
 	ci.md = md;
 	ci.bio = bio;
 	ci.io = alloc_io(md);
@@ -937,6 +933,15 @@ static int dm_request(struct request_que
 	struct mapped_device *md = q->queuedata;
 	int cpu;
 
+	/*
+	 * There is no use in forwarding any barrier request since we can't
+	 * guarantee it is (or can be) handled by the targets correctly.
+	 */
+	if (unlikely(bio_barrier(bio))) {
+		bio_endio(bio, -EOPNOTSUPP);
+		return 0;
+	}
+
 	down_read(&md->io_lock);
 
 	cpu = part_stat_lock();
Index: linux-2.6.30-rc1/drivers/md/dm.h
===================================================================
--- linux-2.6.30-rc1.orig/drivers/md/dm.h	2009-04-08 22:24:24.000000000 +0100
+++ linux-2.6.30-rc1/drivers/md/dm.h	2009-04-08 22:28:01.000000000 +0100
@@ -52,7 +52,6 @@ int dm_table_any_congested(struct dm_tab
  * To check the return value from dm_table_find_target().
  */
 #define dm_target_is_valid(t) ((t)->table)
-int dm_table_barrier_ok(struct dm_table *t);
 
 /*-----------------------------------------------------------------
  * A registry of target types.
Index: linux-2.6.30-rc1/include/linux/device-mapper.h
===================================================================
--- linux-2.6.30-rc1.orig/include/linux/device-mapper.h	2009-04-08 22:24:24.000000000 +0100
+++ linux-2.6.30-rc1/include/linux/device-mapper.h	2009-04-08 22:28:01.000000000 +0100
@@ -116,7 +116,6 @@ void dm_put_device(struct dm_target *ti,
 /*
  * Target features
  */
-#define DM_TARGET_SUPPORTS_BARRIERS 0x00000001
 
 struct target_type {
 	uint64_t features;