FAILED: patch "[PATCH] dm table: fix zoned iterate_devices based device capability" failed to apply to 4.19-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 24f6b6036c9eec21191646930ad42808e6180510 Mon Sep 17 00:00:00 2001
From: Jeffle Xu <[email protected]>
Date: Mon, 8 Feb 2021 22:46:38 -0500
Subject: [PATCH] dm table: fix zoned iterate_devices based device capability
checks
Fix dm_table_supports_zoned_model() and invert logic of both iterate_devices_callout_fn so that all devices' zoned capabilities are properly checked.
Add one more parameter to dm_table_any_dev_attr(), which is actually used as the @data parameter of iterate_devices_callout_fn, so that dm_table_matches_zone_sectors() can be replaced by dm_table_any_dev_attr().
drivers/md/dm-table.c +16 -32
@@ -1316,10 +1316,10 @@ struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector)* should use the iteration structure like dm_table_supports_nowait() or * dm_table_supports_discards(). Or introduce dm_table_all_devs_attr() that * uses an @anti_func that handle semantics of counter examples, e.g. not -* capable of something. So: return !dm_table_any_dev_attr(t, anti_func); +* capable of something. So: return !dm_table_any_dev_attr(t, anti_func, data); */ static bool dm_table_any_dev_attr (struct dm_table *t, -iterate_devices_callout_fn func) +iterate_devices_callout_fn func,void *data) {struct dm_target *ti;unsigned int i;
@@ -1328,7 +1328,7 @@ static bool dm_table_any_dev_attr(struct dm_table *t, ti =dm_table_get_target (t, i);if (ti->type->iterate_devices && - ti->type->iterate_devices (ti, func,NULL )) + ti->type->iterate_devices (ti, func, data))return true; }
@@ -1371,13 +1371,13 @@ bool dm_table_has_no_data_devices(struct dm_table *table)return true; } -static int device_is_zoned_model (struct dm_target *ti,struct dm_dev *dev, -sector_t start,sector_t len,void *data) +static int device_not_zoned_model (struct dm_target *ti,struct dm_dev *dev, +sector_t start,sector_t len,void *data) {struct request_queue *q =bdev_get_queue (dev->bdev);enum blk_zoned_model *zoned_model = data; -return q &&blk_queue_zoned_model (q) == *zoned_model; +return !q ||blk_queue_zoned_model (q) != *zoned_model; } static bool dm_table_supports_zoned_model(struct dm_table *t,
@@ -1394,37 +1394,20 @@ static bool dm_table_supports_zoned_model(struct dm_table *t,return false;if (!ti->type->iterate_devices || - !ti->type->iterate_devices (ti, device_is_zoned_model, &zoned_model)) + ti->type->iterate_devices (ti, device_not_zoned_model, &zoned_model))return false; }return true; } -static int device_matches_zone_sectors (struct dm_target *ti,struct dm_dev *dev, -sector_t start,sector_t len,void *data) +static int device_not_matches_zone_sectors (struct dm_target *ti,struct dm_dev *dev, +sector_t start,sector_t len,void *data) {struct request_queue *q =bdev_get_queue (dev->bdev);unsigned int *zone_sectors = data; -return q &&blk_queue_zone_sectors (q) == *zone_sectors; -} - -static bool dm_table_matches_zone_sectors (struct dm_table *t, -unsigned int zone_sectors) -{ -struct dm_target *ti; -unsigned i; - -for (i =0 ; i <dm_table_get_num_targets (t); i++) { - ti =dm_table_get_target (t, i); - -if (!ti->type->iterate_devices || - !ti->type->iterate_devices (ti, device_matches_zone_sectors, &zone_sectors)) -return false; - } - -return true; +return !q ||blk_queue_zone_sectors (q) != *zone_sectors; } static int validate_hardware_zoned_model(struct dm_table *table,
@@ -1444,7 +1427,7 @@ static int validate_hardware_zoned_model(struct dm_table *table,if (!zone_sectors || !is_power_of_2 (zone_sectors))return -EINVAL ; -if (!dm_table_matches_zone_sectors (table, zone_sectors)) { +if (dm_table_any_dev_attr (table, device_not_matches_zone_sectors, &zone_sectors)) {DMERR ("%s: zone sectors is not consistent across all devices" ,dm_device_name (table->md));return -EINVAL ;
@@ -1830,11 +1813,11 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,else blk_queue_flag_clear (QUEUE_FLAG_DAX , q); -if (dm_table_any_dev_attr (t, device_dax_write_cache_enabled)) +if (dm_table_any_dev_attr (t, device_dax_write_cache_enabled,NULL ))dax_write_cache (t->md->dax_dev, true);/* Ensure that all underlying devices are non-rotational. */ -if (dm_table_any_dev_attr (t, device_is_rotational)) +if (dm_table_any_dev_attr (t, device_is_rotational,NULL ))blk_queue_flag_clear (QUEUE_FLAG_NONROT , q);else blk_queue_flag_set (QUEUE_FLAG_NONROT , q);
@@ -1853,7 +1836,7 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,* them as well. Only targets that support iterate_devices are considered: * don't want error, zero, etc to require stable pages. */ -if (dm_table_any_dev_attr (t, device_requires_stable_pages)) +if (dm_table_any_dev_attr (t, device_requires_stable_pages,NULL ))blk_queue_flag_set (QUEUE_FLAG_STABLE_WRITES , q);else blk_queue_flag_clear (QUEUE_FLAG_STABLE_WRITES , q);
@@ -1864,7 +1847,8 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,* Clear QUEUE_FLAG_ADD_RANDOM if any underlying device does not * have it set. */ -if (blk_queue_add_random (q) &&dm_table_any_dev_attr (t, device_is_not_random)) +if (blk_queue_add_random (q) && +dm_table_any_dev_attr (t, device_is_not_random,NULL ))blk_queue_flag_clear (QUEUE_FLAG_ADD_RANDOM , q);/*