From: Jens Axboe <axboe@suse.de>

dm bits

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/md/dm-table.c |   23 +++++++++++++++++++++++
 25-akpm/drivers/md/dm.c       |   16 ++++++++++++++++
 25-akpm/drivers/md/dm.h       |    1 +
 3 files changed, 40 insertions(+)

diff -puN drivers/md/dm.c~disk-barrier-dm drivers/md/dm.c
--- 25/drivers/md/dm.c~disk-barrier-dm	2004-07-01 22:09:55.458983760 -0700
+++ 25-akpm/drivers/md/dm.c	2004-07-01 22:09:55.466982544 -0700
@@ -597,6 +597,21 @@ static int dm_request(request_queue_t *q
 	return 0;
 }
 
+static int dm_flush_all(request_queue_t *q, struct gendisk *disk,
+			sector_t *error_sector)
+{
+	struct mapped_device *md = q->queuedata;
+	struct dm_table *map = dm_get_table(md);
+	int ret = -ENXIO;
+
+	if (map) {
+		ret = dm_table_flush_all(md->map);
+		dm_table_put(map);
+	}
+
+	return ret;
+}
+
 static void dm_unplug_all(request_queue_t *q)
 {
 	struct mapped_device *md = q->queuedata;
@@ -764,6 +779,7 @@ static struct mapped_device *alloc_dev(u
 	md->queue->backing_dev_info.congested_data = md;
 	blk_queue_make_request(md->queue, dm_request);
 	md->queue->unplug_fn = dm_unplug_all;
+	md->queue->issue_flush_fn = dm_flush_all;
 
 	md->io_pool = mempool_create(MIN_IOS, mempool_alloc_slab,
 				     mempool_free_slab, _io_cache);
diff -puN drivers/md/dm.h~disk-barrier-dm drivers/md/dm.h
--- 25/drivers/md/dm.h~disk-barrier-dm	2004-07-01 22:09:55.460983456 -0700
+++ 25-akpm/drivers/md/dm.h	2004-07-01 22:09:55.466982544 -0700
@@ -113,6 +113,7 @@ void dm_table_suspend_targets(struct dm_
 void dm_table_resume_targets(struct dm_table *t);
 int dm_table_any_congested(struct dm_table *t, int bdi_bits);
 void dm_table_unplug_all(struct dm_table *t);
+int dm_table_flush_all(struct dm_table *t);
 
 /*-----------------------------------------------------------------
  * A registry of target types.
diff -puN drivers/md/dm-table.c~disk-barrier-dm drivers/md/dm-table.c
--- 25/drivers/md/dm-table.c~disk-barrier-dm	2004-07-01 22:09:55.462983152 -0700
+++ 25-akpm/drivers/md/dm-table.c	2004-07-01 22:09:55.467982392 -0700
@@ -900,6 +900,28 @@ void dm_table_unplug_all(struct dm_table
 	}
 }
 
+int dm_table_flush_all(struct dm_table *t)
+{
+	struct list_head *d, *devices = dm_table_get_devices(t);
+	int ret = 0;
+
+	for (d = devices->next; d != devices; d = d->next) {
+		struct dm_dev *dd = list_entry(d, struct dm_dev, list);
+		request_queue_t *q = bdev_get_queue(dd->bdev);
+		int err;
+
+		if (!q->issue_flush_fn)
+			err = -EOPNOTSUPP;
+		else
+			err = q->issue_flush_fn(q, dd->bdev->bd_disk, NULL);
+
+		if (!ret)
+			ret = err;
+	}
+
+	return ret;
+}
+
 EXPORT_SYMBOL(dm_vcalloc);
 EXPORT_SYMBOL(dm_get_device);
 EXPORT_SYMBOL(dm_put_device);
@@ -908,3 +930,4 @@ EXPORT_SYMBOL(dm_table_get_mode);
 EXPORT_SYMBOL(dm_table_put);
 EXPORT_SYMBOL(dm_table_get);
 EXPORT_SYMBOL(dm_table_unplug_all);
+EXPORT_SYMBOL(dm_table_flush_all);
_