aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2009-01-05 22:05:09 -0500
committerAlasdair G Kergon <agk@redhat.com>2009-01-05 22:05:09 -0500
commitab4c1424882be9cd70b89abf2b484add355712fa (patch)
tree8baed3606be67900df9f02e42fcdb091b78c5def /drivers/md/dm.c
parent7d76345da6ed3927c9cbf5d3f7a7021e8bba7374 (diff)
dm: support barriers on simple devices
Implement barrier support for single device DM devices This patch implements barrier support in DM for the common case of dm linear just remapping a single underlying device. In this case we can safely pass the barrier through because there can be no reordering between devices. NB. Any DM device might cease to support barriers if it gets reconfigured so code must continue to allow for a possible -EOPNOTSUPP on every barrier bio submitted. - agk Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r--drivers/md/dm.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 4882ce7e88a3..dd953b189f45 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -835,7 +835,11 @@ static int __split_bio(struct mapped_device *md, struct bio *bio)
835 ci.map = dm_get_table(md); 835 ci.map = dm_get_table(md);
836 if (unlikely(!ci.map)) 836 if (unlikely(!ci.map))
837 return -EIO; 837 return -EIO;
838 838 if (unlikely(bio_barrier(bio) && !dm_table_barrier_ok(ci.map))) {
839 dm_table_put(ci.map);
840 bio_endio(bio, -EOPNOTSUPP);
841 return 0;
842 }
839 ci.md = md; 843 ci.md = md;
840 ci.bio = bio; 844 ci.bio = bio;
841 ci.io = alloc_io(md); 845 ci.io = alloc_io(md);
@@ -919,15 +923,6 @@ static int dm_request(struct request_queue *q, struct bio *bio)
919 struct mapped_device *md = q->queuedata; 923 struct mapped_device *md = q->queuedata;
920 int cpu; 924 int cpu;
921 925
922 /*
923 * There is no use in forwarding any barrier request since we can't
924 * guarantee it is (or can be) handled by the targets correctly.
925 */
926 if (unlikely(bio_barrier(bio))) {
927 bio_endio(bio, -EOPNOTSUPP);
928 return 0;
929 }
930
931 down_read(&md->io_lock); 926 down_read(&md->io_lock);
932 927
933 cpu = part_stat_lock(); 928 cpu = part_stat_lock();