mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
media: vb2: use ssize_t for vb2_read/vb2_write
commita562d6dc86upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9a998cc1c3
commit
697b81e9c4
@@ -2769,8 +2769,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;
|
||||
@@ -2930,15 +2930,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);
|
||||
|
||||
@@ -1064,8 +1064,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.
|
||||
@@ -1074,8 +1074,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