mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
media: vb2: use ssize_t for vb2_read/vb2_write
vb2_read() and vb2_write() return size_t, but propagate
negative errno values from __vb2_perform_fileio().
This relies on implicit signed/unsigned conversions in callers
(e.g. vb2_fop_read()) to recover error codes:
__vb2_perform_fileio() -> -EINVAL
vb2_read() -> (size_t)-EINVAL
vb2_fop_read() -> -EINVAL
This relies on implicit conversions that are not obvious.
These helpers are exported (EXPORT_SYMBOL_GPL) and part of the
vb2 API, so changing their return type may affect existing users.
However, they conceptually follow read/write semantics, where
ssize_t is typically used to return either a byte count or a
negative error code.
Switch vb2_read() and vb2_write() to ssize_t, and update
__vb2_perform_fileio() accordingly.
Signed-off-by: Zile Xiong <xiongzile99@gmail.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Fixes: b25748fe61 ("[media] v4l: videobuf2: add read() and write() emulator")
Cc: stable@vger.kernel.org
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
@@ -2990,8 +2990,8 @@ static int __vb2_cleanup_fileio(struct vb2_queue *q)
|
||||
* @nonblock: mode selector (1 means blocking calls, 0 means nonblocking)
|
||||
* @read: access mode selector (1 means read, 0 means write)
|
||||
*/
|
||||
static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock, int read)
|
||||
static ssize_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock, int read)
|
||||
{
|
||||
struct vb2_fileio_data *fileio;
|
||||
struct vb2_fileio_buf *buf;
|
||||
@@ -3154,15 +3154,15 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblocking)
|
||||
ssize_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblocking)
|
||||
{
|
||||
return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 1);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vb2_read);
|
||||
|
||||
size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblocking)
|
||||
ssize_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblocking)
|
||||
{
|
||||
return __vb2_perform_fileio(q, (char __user *) data, count,
|
||||
ppos, nonblocking, 0);
|
||||
|
||||
@@ -1093,8 +1093,8 @@ __poll_t vb2_core_poll(struct vb2_queue *q, struct file *file,
|
||||
* @ppos: file handle position tracking pointer
|
||||
* @nonblock: mode selector (1 means blocking calls, 0 means nonblocking)
|
||||
*/
|
||||
size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
ssize_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
/**
|
||||
* vb2_write() - implements write() syscall logic.
|
||||
* @q: pointer to &struct vb2_queue with videobuf2 queue.
|
||||
@@ -1103,8 +1103,8 @@ size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,
|
||||
* @ppos: file handle position tracking pointer
|
||||
* @nonblock: mode selector (1 means blocking calls, 0 means nonblocking)
|
||||
*/
|
||||
size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
ssize_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblock);
|
||||
|
||||
/**
|
||||
* typedef vb2_thread_fnc - callback function for use with vb2_thread.
|
||||
|
||||
Reference in New Issue
Block a user