diff options
Diffstat (limited to 'drivers/md/dm-table.c')
| -rw-r--r-- | drivers/md/dm-table.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 986b8754bb08..bc04518e9d8b 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -1238,14 +1238,15 @@ static void dm_table_set_integrity(struct dm_table *t) | |||
| 1238 | return; | 1238 | return; |
| 1239 | 1239 | ||
| 1240 | template_disk = dm_table_get_integrity_disk(t, true); | 1240 | template_disk = dm_table_get_integrity_disk(t, true); |
| 1241 | if (!template_disk && | 1241 | if (template_disk) |
| 1242 | blk_integrity_is_initialized(dm_disk(t->md))) { | 1242 | blk_integrity_register(dm_disk(t->md), |
| 1243 | blk_get_integrity(template_disk)); | ||
| 1244 | else if (blk_integrity_is_initialized(dm_disk(t->md))) | ||
| 1243 | DMWARN("%s: device no longer has a valid integrity profile", | 1245 | DMWARN("%s: device no longer has a valid integrity profile", |
| 1244 | dm_device_name(t->md)); | 1246 | dm_device_name(t->md)); |
| 1245 | return; | 1247 | else |
| 1246 | } | 1248 | DMWARN("%s: unable to establish an integrity profile", |
| 1247 | blk_integrity_register(dm_disk(t->md), | 1249 | dm_device_name(t->md)); |
| 1248 | blk_get_integrity(template_disk)); | ||
| 1249 | } | 1250 | } |
| 1250 | 1251 | ||
| 1251 | static int device_flush_capable(struct dm_target *ti, struct dm_dev *dev, | 1252 | static int device_flush_capable(struct dm_target *ti, struct dm_dev *dev, |
| @@ -1282,6 +1283,22 @@ static bool dm_table_supports_flush(struct dm_table *t, unsigned flush) | |||
| 1282 | return 0; | 1283 | return 0; |
| 1283 | } | 1284 | } |
| 1284 | 1285 | ||
| 1286 | static bool dm_table_discard_zeroes_data(struct dm_table *t) | ||
| 1287 | { | ||
| 1288 | struct dm_target *ti; | ||
| 1289 | unsigned i = 0; | ||
| 1290 | |||
| 1291 | /* Ensure that all targets supports discard_zeroes_data. */ | ||
| 1292 | while (i < dm_table_get_num_targets(t)) { | ||
| 1293 | ti = dm_table_get_target(t, i++); | ||
| 1294 | |||
| 1295 | if (ti->discard_zeroes_data_unsupported) | ||
| 1296 | return 0; | ||
| 1297 | } | ||
| 1298 | |||
| 1299 | return 1; | ||
| 1300 | } | ||
| 1301 | |||
| 1285 | void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, | 1302 | void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, |
| 1286 | struct queue_limits *limits) | 1303 | struct queue_limits *limits) |
| 1287 | { | 1304 | { |
| @@ -1304,6 +1321,9 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, | |||
| 1304 | } | 1321 | } |
| 1305 | blk_queue_flush(q, flush); | 1322 | blk_queue_flush(q, flush); |
| 1306 | 1323 | ||
| 1324 | if (!dm_table_discard_zeroes_data(t)) | ||
| 1325 | q->limits.discard_zeroes_data = 0; | ||
| 1326 | |||
| 1307 | dm_table_set_integrity(t); | 1327 | dm_table_set_integrity(t); |
| 1308 | 1328 | ||
| 1309 | /* | 1329 | /* |
