summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Le Moal <dlemoal@kernel.org>2024-09-17 22:32:31 +0900
committerJens Axboe <axboe@kernel.dk>2024-09-17 08:34:00 -0600
commite3accac1a976e65491a9b9fba82ce8ddbd3d2389 (patch)
treec71c9eef7ee3b820bbf6950620e0a9c32a596455
parent42b16d3ac371a2fac9b6f08fd75f23f34ba3955a (diff)
downloadlinux-e3accac1a976e65491a9b9fba82ce8ddbd3d2389.tar.gz
linux-e3accac1a976e65491a9b9fba82ce8ddbd3d2389.tar.bz2
linux-e3accac1a976e65491a9b9fba82ce8ddbd3d2389.zip
block: Fix elv_iosched_local_module handling of "none" scheduler
Commit 734e1a860312 ("block: Prevent deadlocks when switching elevators") introduced the function elv_iosched_load_module() to allow loading an elevator module outside of elv_iosched_store() with the target device queue not frozen, to avoid deadlocks. However, the "none" scheduler does not have a module and as a result, elv_iosched_load_module() always returns an error when trying to switch to this valid scheduler. Fix this by ignoring the return value of the request_module() call done by elv_iosched_load_module(). This restores the behavior before commit 734e1a860312, which was to ignore the request_module() result and instead rely on elevator_change() to handle the "none" scheduler case. Reported-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> Fixes: 734e1a860312 ("block: Prevent deadlocks when switching elevators") Cc: stable@vger.kernel.org Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20240917133231.134806-1-dlemoal@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/elevator.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/block/elevator.c b/block/elevator.c
index c355b55d0107..4122026b11f1 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -715,7 +715,9 @@ int elv_iosched_load_module(struct gendisk *disk, const char *buf,
strscpy(elevator_name, buf, sizeof(elevator_name));
- return request_module("%s-iosched", strstrip(elevator_name));
+ request_module("%s-iosched", strstrip(elevator_name));
+
+ return 0;
}
ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,