| From 9535e797777e85a439e82c9873f7fc8565456933 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 13 Jun 2025 19:08:52 -0400 |
| Subject: dm-table: fix checking for rq stackable devices |
| |
| From: Benjamin Marzinski <bmarzins@redhat.com> |
| |
| [ Upstream commit 8ca719b81987be690f197e82fdb030580c0a07f3 ] |
| |
| Due to the semantics of iterate_devices(), the current code allows a |
| request-based dm table as long as it includes one request-stackable |
| device. It is supposed to only allow tables where there are no |
| non-request-stackable devices. |
| |
| Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
| Reviewed-by: Mike Snitzer <snitzer@kernel.org> |
| Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/md/dm-table.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c |
| index bf2ade89c8c2..ed0a5e91968d 100644 |
| --- a/drivers/md/dm-table.c |
| +++ b/drivers/md/dm-table.c |
| @@ -862,17 +862,17 @@ static bool dm_table_supports_dax(struct dm_table *t, |
| return true; |
| } |
| |
| -static int device_is_rq_stackable(struct dm_target *ti, struct dm_dev *dev, |
| - sector_t start, sector_t len, void *data) |
| +static int device_is_not_rq_stackable(struct dm_target *ti, struct dm_dev *dev, |
| + sector_t start, sector_t len, void *data) |
| { |
| struct block_device *bdev = dev->bdev; |
| struct request_queue *q = bdev_get_queue(bdev); |
| |
| /* request-based cannot stack on partitions! */ |
| if (bdev_is_partition(bdev)) |
| - return false; |
| + return true; |
| |
| - return queue_is_mq(q); |
| + return !queue_is_mq(q); |
| } |
| |
| static int dm_table_determine_type(struct dm_table *t) |
| @@ -968,7 +968,7 @@ static int dm_table_determine_type(struct dm_table *t) |
| |
| /* Non-request-stackable devices can't be used for request-based dm */ |
| if (!ti->type->iterate_devices || |
| - !ti->type->iterate_devices(ti, device_is_rq_stackable, NULL)) { |
| + ti->type->iterate_devices(ti, device_is_not_rq_stackable, NULL)) { |
| DMERR("table load rejected: including non-request-stackable devices"); |
| return -EINVAL; |
| } |
| -- |
| 2.39.5 |
| |