mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
dm: handle failures in dm_table_set_restrictions
If dm_table_set_restrictions() fails while swapping tables,
device-mapper will continue using the previous table. It must be sure to
leave the mapped_device in it's previous state on failure. Otherwise
device-mapper could end up using the old table with settings from the
unused table.
Do not update the mapped device in dm_set_zones_restrictions(). Wait
till after dm_table_set_restrictions() is sure to succeed to update the
md zoned settings. Do the same with the dax settings, and if
dm_revalidate_zones() fails, restore the original queue limits.
Fixes: 7f91ccd8a6 ("dm: Call dm_revalidate_zones() after setting the queue limits")
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
This commit is contained in:
committed by
Mikulas Patocka
parent
e8819e7f03
commit
4ea30ec6fb
@@ -340,12 +340,8 @@ int dm_set_zones_restrictions(struct dm_table *t, struct request_queue *q,
|
||||
* mapped device queue as needing zone append emulation.
|
||||
*/
|
||||
WARN_ON_ONCE(queue_is_mq(q));
|
||||
if (dm_table_supports_zone_append(t)) {
|
||||
clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
} else {
|
||||
set_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
if (!dm_table_supports_zone_append(t))
|
||||
lim->max_hw_zone_append_sectors = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the max open and max active zone limits for the mapped
|
||||
@@ -383,9 +379,6 @@ int dm_set_zones_restrictions(struct dm_table *t, struct request_queue *q,
|
||||
lim->zone_write_granularity = 0;
|
||||
lim->chunk_sectors = 0;
|
||||
lim->features &= ~BLK_FEAT_ZONED;
|
||||
clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
md->nr_zones = 0;
|
||||
disk->nr_zones = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -408,6 +401,23 @@ int dm_set_zones_restrictions(struct dm_table *t, struct request_queue *q,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dm_finalize_zone_settings(struct dm_table *t, struct queue_limits *lim)
|
||||
{
|
||||
struct mapped_device *md = t->md;
|
||||
|
||||
if (lim->features & BLK_FEAT_ZONED) {
|
||||
if (dm_table_supports_zone_append(t))
|
||||
clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
else
|
||||
set_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
} else {
|
||||
clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags);
|
||||
md->nr_zones = 0;
|
||||
md->disk->nr_zones = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* IO completion callback called from clone_endio().
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user