On Fri Mar 20 14:54:45 2026 +0800, Zile Xiong wrote:
> 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 <[email protected]>
> Acked-by: Marek Szyprowski <[email protected]>
> Fixes: b25748fe6126 ("[media] v4l: videobuf2: add read() and write() 
> emulator")
> Cc: [email protected]
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/common/videobuf2/videobuf2-core.c | 12 ++++++------
 include/media/videobuf2-core.h                  |  8 ++++----
 2 files changed, 10 insertions(+), 10 deletions(-)

---

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c 
b/drivers/media/common/videobuf2/videobuf2-core.c
index adf668b213c2..b0a6084f1757 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -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);
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index 4424d481d7f7..4b4f4c15c53a 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -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.
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to