diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-09-19 17:09:22 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-09-19 21:23:51 -0400 |
commit | 08b494e5b381d8bc44ecf999d635673b06c1a5fb (patch) | |
tree | 3279ce37b0dc2baf4de211cc27a9c07fa893918e | |
parent | c06650f61595eec5bd8989528209df2c1e7ced66 (diff) |
bcachefs: Fix copy_to_user() usage in flush_buf()
copy_to_user() returns the number of bytes successfully copied - not an
errcode.
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/debug.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c index 404148bd348a..75a3dc7cbd47 100644 --- a/fs/bcachefs/debug.c +++ b/fs/bcachefs/debug.c @@ -319,16 +319,16 @@ static ssize_t flush_buf(struct dump_iter *i) { if (i->buf.pos) { size_t bytes = min_t(size_t, i->buf.pos, i->size); - int err = copy_to_user(i->ubuf, i->buf.buf, bytes); + int copied = bytes - copy_to_user(i->ubuf, i->buf.buf, bytes); - if (err) - return err; + i->ret += copied; + i->ubuf += copied; + i->size -= copied; + i->buf.pos -= copied; + memmove(i->buf.buf, i->buf.buf + copied, i->buf.pos); - i->ret += bytes; - i->ubuf += bytes; - i->size -= bytes; - i->buf.pos -= bytes; - memmove(i->buf.buf, i->buf.buf + bytes, i->buf.pos); + if (copied != bytes) + return -EFAULT; } return i->size ? 0 : i->ret; |