OSDN Git Service

block: sanitize the elevator name before passing it to __elevator_change
authorChristoph Hellwig <hch@lst.de>
Thu, 20 Oct 2022 06:48:17 +0000 (08:48 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 24 Oct 2022 00:59:17 +0000 (18:59 -0600)
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: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20221020064819.1469928-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/elevator.c

index 8fb404a..5b8fb87 100644 (file)
@@ -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;
 }