@@ -1238,14 +1238,15 @@ static void dm_table_set_integrity(struct dm_table *t)
12381238 return ;
12391239
12401240 template_disk = dm_table_get_integrity_disk (t , true);
1241- if (!template_disk &&
1242- blk_integrity_is_initialized (dm_disk (t -> md ))) {
1241+ if (template_disk )
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 )))
12431245 DMWARN ("%s: device no longer has a valid integrity profile" ,
12441246 dm_device_name (t -> md ));
1245- return ;
1246- }
1247- blk_integrity_register (dm_disk (t -> md ),
1248- blk_get_integrity (template_disk ));
1247+ else
1248+ DMWARN ("%s: unable to establish an integrity profile" ,
1249+ dm_device_name (t -> md ));
12491250}
12501251
12511252static 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)
12821283 return 0 ;
12831284}
12841285
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+
12851302void dm_table_set_restrictions (struct dm_table * t , struct request_queue * q ,
12861303 struct queue_limits * limits )
12871304{
@@ -1304,6 +1321,9 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
13041321 }
13051322 blk_queue_flush (q , flush );
13061323
1324+ if (!dm_table_discard_zeroes_data (t ))
1325+ q -> limits .discard_zeroes_data = 0 ;
1326+
13071327 dm_table_set_integrity (t );
13081328
13091329 /*
0 commit comments