Commit 58367c8a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: sanitize the elevator name before passing it to __elevator_change



The stripped name should also be used for the none check.  To do so
strip it in the caller and pass in the sanitized name.  Drop the pointless
__ prefix in the function name while we're at it.

Based on a patch from Jinlong Chen <nickyc975@zju.edu.cn>.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20221020064819.1469928-3-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent dd6f7f17
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -734,9 +734,8 @@ int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
/*
 * Switch this queue to the given IO scheduler.
 */
static int __elevator_change(struct request_queue *q, const char *name)
static int elevator_change(struct request_queue *q, const char *elevator_name)
{
	char elevator_name[ELV_NAME_MAX];
	struct elevator_type *e;

	/* Make sure queue is not in the middle of being removed */
@@ -746,14 +745,13 @@ static int __elevator_change(struct request_queue *q, const char *name)
	/*
	 * Special case for mq, turn off scheduling
	 */
	if (!strncmp(name, "none", 4)) {
	if (!strncmp(elevator_name, "none", 4)) {
		if (!q->elevator)
			return 0;
		return elevator_switch(q, NULL);
	}

	strlcpy(elevator_name, name, sizeof(elevator_name));
	e = elevator_get(q, strstrip(elevator_name), true);
	e = elevator_get(q, elevator_name, true);
	if (!e)
		return -EINVAL;

@@ -766,18 +764,19 @@ static int __elevator_change(struct request_queue *q, const char *name)
	return elevator_switch(q, e);
}

ssize_t elv_iosched_store(struct request_queue *q, const char *name,
ssize_t elv_iosched_store(struct request_queue *q, const char *buf,
			  size_t count)
{
	char elevator_name[ELV_NAME_MAX];
	int ret;

	if (!elv_support_iosched(q))
		return count;

	ret = __elevator_change(q, name);
	strlcpy(elevator_name, buf, sizeof(elevator_name));
	ret = elevator_change(q, strstrip(elevator_name));
	if (!ret)
		return count;

	return ret;
}