Skip to content

Commit

Permalink
blk-mq-debugfs: error on long write to queue "state" file
Browse files Browse the repository at this point in the history
blk_queue_flags_store() currently truncates and returns a short write if
the operation being written is too long. This can give us weird results,
like here:

$ echo "run            bar"
echo: write error: invalid argument
$ dmesg
[ 1103.075435] blk_queue_flags_store: unsupported operation bar. Use either 'run' or 'start'

Instead, return an error if the user does this. While we're here, make
the argument names consistent with everywhere else in this file.

Signed-off-by: Omar Sandoval <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
osandov authored and axboe committed May 4, 2017
1 parent 1a43511 commit c7e4145
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions block/blk-mq-debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,18 @@ static int blk_queue_flags_show(struct seq_file *m, void *v)
return 0;
}

static ssize_t blk_queue_flags_store(struct file *file, const char __user *ubuf,
size_t len, loff_t *offp)
static ssize_t blk_queue_flags_store(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
struct request_queue *q = file_inode(file)->i_private;
char op[16] = { }, *s;

len = min(len, sizeof(op) - 1);
if (copy_from_user(op, ubuf, len))
if (count >= sizeof(op)) {
pr_err("%s: operation too long\n", __func__);
goto inval;
}

if (copy_from_user(op, buf, count))
return -EFAULT;
s = op;
strsep(&s, " \t\n"); /* strip trailing whitespace */
Expand All @@ -123,11 +127,12 @@ static ssize_t blk_queue_flags_store(struct file *file, const char __user *ubuf,
} else if (strcmp(op, "start") == 0) {
blk_mq_start_stopped_hw_queues(q, true);
} else {
pr_err("%s: unsupported operation %s. Use either 'run' or 'start'\n",
__func__, op);
pr_err("%s: unsupported operation '%s'\n", __func__, op);
inval:
pr_err("%s: use either 'run' or 'start'\n", __func__);
return -EINVAL;
}
return len;
return count;
}

static int blk_queue_flags_open(struct inode *inode, struct file *file)
Expand Down

0 comments on commit c7e4145

Please sign in to comment.