diff options
author | Andi Kleen <ak@suse.de> | 2009-01-05 22:05:09 -0500 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2009-01-05 22:05:09 -0500 |
commit | ab4c1424882be9cd70b89abf2b484add355712fa (patch) | |
tree | 8baed3606be67900df9f02e42fcdb091b78c5def /drivers/md/dm-table.c | |
parent | 7d76345da6ed3927c9cbf5d3f7a7021e8bba7374 (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-table.c')
-rw-r--r-- | drivers/md/dm-table.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 04e5fd742c2c..ebaaf72cd822 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -38,6 +38,8 @@ struct dm_table { | |||
38 | sector_t *highs; | 38 | sector_t *highs; |
39 | struct dm_target *targets; | 39 | struct dm_target *targets; |
40 | 40 | ||
41 | unsigned barriers_supported:1; | ||
42 | |||
41 | /* | 43 | /* |
42 | * Indicates the rw permissions for the new logical | 44 | * Indicates the rw permissions for the new logical |
43 | * device. This should be a combination of FMODE_READ | 45 | * device. This should be a combination of FMODE_READ |
@@ -227,6 +229,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode, | |||
227 | 229 | ||
228 | INIT_LIST_HEAD(&t->devices); | 230 | INIT_LIST_HEAD(&t->devices); |
229 | atomic_set(&t->holders, 1); | 231 | atomic_set(&t->holders, 1); |
232 | t->barriers_supported = 1; | ||
230 | 233 | ||
231 | if (!num_targets) | 234 | if (!num_targets) |
232 | num_targets = KEYS_PER_NODE; | 235 | num_targets = KEYS_PER_NODE; |
@@ -728,6 +731,10 @@ int dm_table_add_target(struct dm_table *t, const char *type, | |||
728 | /* FIXME: the plan is to combine high here and then have | 731 | /* FIXME: the plan is to combine high here and then have |
729 | * the merge fn apply the target level restrictions. */ | 732 | * the merge fn apply the target level restrictions. */ |
730 | combine_restrictions_low(&t->limits, &tgt->limits); | 733 | combine_restrictions_low(&t->limits, &tgt->limits); |
734 | |||
735 | if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS)) | ||
736 | t->barriers_supported = 0; | ||
737 | |||
731 | return 0; | 738 | return 0; |
732 | 739 | ||
733 | bad: | 740 | bad: |
@@ -772,6 +779,12 @@ int dm_table_complete(struct dm_table *t) | |||
772 | 779 | ||
773 | check_for_valid_limits(&t->limits); | 780 | check_for_valid_limits(&t->limits); |
774 | 781 | ||
782 | /* | ||
783 | * We only support barriers if there is exactly one underlying device. | ||
784 | */ | ||
785 | if (!list_is_singular(&t->devices)) | ||
786 | t->barriers_supported = 0; | ||
787 | |||
775 | /* how many indexes will the btree have ? */ | 788 | /* how many indexes will the btree have ? */ |
776 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); | 789 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); |
777 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); | 790 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); |
@@ -986,6 +999,12 @@ struct mapped_device *dm_table_get_md(struct dm_table *t) | |||
986 | return t->md; | 999 | return t->md; |
987 | } | 1000 | } |
988 | 1001 | ||
1002 | int dm_table_barrier_ok(struct dm_table *t) | ||
1003 | { | ||
1004 | return t->barriers_supported; | ||
1005 | } | ||
1006 | EXPORT_SYMBOL(dm_table_barrier_ok); | ||
1007 | |||
989 | EXPORT_SYMBOL(dm_vcalloc); | 1008 | EXPORT_SYMBOL(dm_vcalloc); |
990 | EXPORT_SYMBOL(dm_get_device); | 1009 | EXPORT_SYMBOL(dm_get_device); |
991 | EXPORT_SYMBOL(dm_put_device); | 1010 | EXPORT_SYMBOL(dm_put_device); |