|
@@ -54,7 +54,6 @@ struct dm_table {
|
|
|
sector_t *highs;
|
|
|
struct dm_target *targets;
|
|
|
|
|
|
- unsigned discards_supported:1;
|
|
|
unsigned integrity_supported:1;
|
|
|
|
|
|
/*
|
|
@@ -209,7 +208,6 @@ int dm_table_create(struct dm_table **result, fmode_t mode,
|
|
|
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;
|
|
@@ -791,8 +789,9 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
|
|
|
|
|
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: ignoring discards_supported because num_discard_requests is zero.",
|
|
|
+ dm_device_name(t->md), type);
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -1359,19 +1358,19 @@ bool dm_table_supports_discards(struct dm_table *t)
|
|
|
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.
|
|
|
* t->devices includes internal dm devices such as mirror logs
|
|
|
* so we need to use iterate_devices here, which targets
|
|
|
- * supporting discard must provide.
|
|
|
+ * supporting discard selectively must provide.
|
|
|
*/
|
|
|
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;
|
|
|
|