Linux Archive

Linux Archive (http://www.linux-archive.org/)
-   Device-mapper Development (http://www.linux-archive.org/device-mapper-development/)
-   -   dm table: fix and simplify discard support processing (http://www.linux-archive.org/device-mapper-development/554923-dm-table-fix-simplify-discard-support-processing.html)

Mike Snitzer 07-21-2011 02:53 AM

dm table: fix and simplify discard support processing
 
Remove 'discards_supported' from the dm_table structure. The same
information can be easily discovered from the table's target(s) in
dm_table_supports_discards().

Before this fix dm_table_supports_discards() would skip checking the
individual targets' 'discards_supported' flag if any one target in the
table didn't set num_discard_requests > 0. Now the per-target
'discards_supported' flag is effective at insuring the final DM device
advertises discard support. But, to be clear, targets that don't
support discards (!num_discard_requests) will not receive discard
requests.

Also DMWARN if a target sets 'discards_supported' override but forgets
to set 'num_discard_requests'.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
drivers/md/dm-table.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

v3: rebased ontop the latest editing tree

Index: linux-2.6/drivers/md/dm-table.c
================================================== =================
--- linux-2.6.orig/drivers/md/dm-table.c
+++ linux-2.6/drivers/md/dm-table.c
@@ -54,7 +54,6 @@ struct dm_table {
sector_t *highs;
struct dm_target *targets;

- unsigned discards_supported:1;
unsigned integrity_supported:1;
unsigned singleton:1;

@@ -209,7 +208,6 @@ int dm_table_create(struct dm_table **re
INIT_LIST_HEAD(&t->devices);
INIT_LIST_HEAD(&t->target_callbacks);
atomic_set(&t->holders, 0);
- t->discards_supported = 1;

if (!num_targets)
num_targets = KEYS_PER_NODE;
@@ -809,8 +807,9 @@ int dm_table_add_target(struct dm_table

t->highs[t->num_targets++] = tgt->begin + tgt->len - 1;

- if (!tgt->num_discard_requests)
- t->discards_supported = 0;
+ if (!tgt->num_discard_requests && tgt->discards_supported)
+ DMWARN("%s: %s: must set num_discard_requests if discards_supported, "
+ "disabling discards", dm_device_name(t->md), type);

return 0;

@@ -1438,9 +1437,6 @@ bool dm_table_supports_discards(struct d
struct dm_target *ti;
unsigned i = 0;

- if (!t->discards_supported)
- return 0;
-
/*
* Unless any target used by the table set discards_supported,
* require at least one underlying device to support discards.
@@ -1451,6 +1447,9 @@ bool dm_table_supports_discards(struct d
while (i < dm_table_get_num_targets(t)) {
ti = dm_table_get_target(t, i++);

+ if (!ti->num_discard_requests)
+ continue;
+
if (ti->discards_supported)
return 1;


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel


All times are GMT. The time now is 07:40 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.