On Sun, Dec 10, 2023 at 4:19 PM Amir Goldstein <amir73il@xxxxxxxxx> wrote: > > Not sure why some splice helpers return long, maybe historic reasons. > Change them all to return ssize_t to conform to the splice methods and > to the rest of the helpers. > > Suggested-by: Christian Brauner <brauner@xxxxxxxxxx> > Link: https://lore.kernel.org/r/20231208-horchen-helium-d3ec1535ede5@brauner/ > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > fs/overlayfs/copy_up.c | 2 +- > fs/read_write.c | 2 +- > fs/splice.c | 62 +++++++++++++++++++++--------------------- > include/linux/splice.h | 43 ++++++++++++++--------------- > io_uring/splice.c | 4 +-- > 5 files changed, 56 insertions(+), 57 deletions(-) > > diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c > index 294b330aba9f..741d38058337 100644 > --- a/fs/overlayfs/copy_up.c > +++ b/fs/overlayfs/copy_up.c > @@ -285,7 +285,7 @@ static int ovl_copy_up_file(struct ovl_fs *ofs, struct dentry *dentry, > > while (len) { > size_t this_len = OVL_COPY_UP_CHUNK_SIZE; > - long bytes; > + ssize_t bytes; > > if (len < this_len) > this_len = len; > diff --git a/fs/read_write.c b/fs/read_write.c > index 01a14570015b..7783b8522693 100644 > --- a/fs/read_write.c > +++ b/fs/read_write.c > @@ -1214,7 +1214,7 @@ COMPAT_SYSCALL_DEFINE6(pwritev2, compat_ulong_t, fd, > #endif /* CONFIG_COMPAT */ > > static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, > - size_t count, loff_t max) > + size_t count, loff_t max) > { > struct fd in, out; > struct inode *in_inode, *out_inode; > diff --git a/fs/splice.c b/fs/splice.c > index 7cda013e5a1e..6c1f12872407 100644 > --- a/fs/splice.c > +++ b/fs/splice.c > @@ -932,8 +932,8 @@ static int warn_unsupported(struct file *file, const char *op) > /* > * Attempt to initiate a splice from pipe to file. > */ > -static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, > - loff_t *ppos, size_t len, unsigned int flags) > +static ssize_t do_splice_from(struct pipe_inode_info *pipe, struct file *out, > + loff_t *ppos, size_t len, unsigned int flags) > { > if (unlikely(!out->f_op->splice_write)) > return warn_unsupported(out, "write"); > @@ -955,9 +955,9 @@ static void do_splice_eof(struct splice_desc *sd) > * Callers already called rw_verify_area() on the entire range. > * No need to call it for sub ranges. > */ > -static long do_splice_read(struct file *in, loff_t *ppos, > - struct pipe_inode_info *pipe, size_t len, > - unsigned int flags) > +static size_t do_splice_read(struct file *in, loff_t *ppos, > + struct pipe_inode_info *pipe, size_t len, > + unsigned int flags) > { > unsigned int p_space; > > @@ -999,11 +999,11 @@ static long do_splice_read(struct file *in, loff_t *ppos, > * If successful, it returns the amount of data spliced, 0 if it hit the EOF or > * a hole and a negative error code otherwise. > */ > -long vfs_splice_read(struct file *in, loff_t *ppos, > - struct pipe_inode_info *pipe, size_t len, > - unsigned int flags) > +ssize_t vfs_splice_read(struct file *in, loff_t *ppos, > + struct pipe_inode_info *pipe, size_t len, > + unsigned int flags) > { > - int ret; > + ssize_t ret; > > ret = rw_verify_area(READ, in, ppos, len); > if (unlikely(ret < 0)) > @@ -1030,7 +1030,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, > splice_direct_actor *actor) > { > struct pipe_inode_info *pipe; > - long ret, bytes; > + size_t ret, bytes; > size_t len; > int i, flags, more; > > @@ -1181,7 +1181,7 @@ static void direct_file_splice_eof(struct splice_desc *sd) > file->f_op->splice_eof(file); > } > > -static long do_splice_direct_actor(struct file *in, loff_t *ppos, > +static ssize_t do_splice_direct_actor(struct file *in, loff_t *ppos, > struct file *out, loff_t *opos, > size_t len, unsigned int flags, > splice_direct_actor *actor) > @@ -1226,8 +1226,8 @@ static long do_splice_direct_actor(struct file *in, loff_t *ppos, > * > * Callers already called rw_verify_area() on the entire range. > */ > -long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, > - loff_t *opos, size_t len, unsigned int flags) > +ssize_t do_splice_direct(struct file *in, loff_t *ppos, struct file *out, > + loff_t *opos, size_t len, unsigned int flags) > { > return do_splice_direct_actor(in, ppos, out, opos, len, flags, > direct_splice_actor); > @@ -1249,8 +1249,8 @@ EXPORT_SYMBOL(do_splice_direct); > * > * Callers already called rw_verify_area() on the entire range. > */ > -long splice_file_range(struct file *in, loff_t *ppos, struct file *out, > - loff_t *opos, size_t len) > +ssize_t splice_file_range(struct file *in, loff_t *ppos, struct file *out, > + loff_t *opos, size_t len) > { > lockdep_assert(file_write_started(out)); > > @@ -1280,12 +1280,12 @@ static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe, > struct pipe_inode_info *opipe, > size_t len, unsigned int flags); > > -long splice_file_to_pipe(struct file *in, > - struct pipe_inode_info *opipe, > - loff_t *offset, > - size_t len, unsigned int flags) > +ssize_t splice_file_to_pipe(struct file *in, > + struct pipe_inode_info *opipe, > + loff_t *offset, > + size_t len, unsigned int flags) OOPS forgot to fix the declaration in fs/internal.h > { > - long ret; > + ssize_t ret; > > pipe_lock(opipe); > ret = wait_for_space(opipe, flags); > @@ -1300,13 +1300,13 @@ long splice_file_to_pipe(struct file *in, > /* > * Determine where to splice to/from. > */ > -long do_splice(struct file *in, loff_t *off_in, struct file *out, > - loff_t *off_out, size_t len, unsigned int flags) > +ssize_t do_splice(struct file *in, loff_t *off_in, struct file *out, > + loff_t *off_out, size_t len, unsigned int flags) > { > struct pipe_inode_info *ipipe; > struct pipe_inode_info *opipe; > loff_t offset; > - long ret; > + ssize_t ret; > > if (unlikely(!(in->f_mode & FMODE_READ) || > !(out->f_mode & FMODE_WRITE))) > @@ -1397,14 +1397,14 @@ long do_splice(struct file *in, loff_t *off_in, struct file *out, > return ret; > } > > -static long __do_splice(struct file *in, loff_t __user *off_in, > - struct file *out, loff_t __user *off_out, > - size_t len, unsigned int flags) > +static ssize_t __do_splice(struct file *in, loff_t __user *off_in, > + struct file *out, loff_t __user *off_out, > + size_t len, unsigned int flags) > { > struct pipe_inode_info *ipipe; > struct pipe_inode_info *opipe; > loff_t offset, *__off_in = NULL, *__off_out = NULL; > - long ret; > + ssize_t ret; > > ipipe = get_pipe_info(in, true); > opipe = get_pipe_info(out, true); > @@ -1634,7 +1634,7 @@ SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in, > size_t, len, unsigned int, flags) > { > struct fd in, out; > - long error; > + ssize_t error; > > if (unlikely(!len)) > return 0; > @@ -1648,7 +1648,7 @@ SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in, > out = fdget(fd_out); > if (out.file) { > error = __do_splice(in.file, off_in, out.file, off_out, > - len, flags); > + len, flags); > fdput(out); > } > fdput(in); > @@ -1962,7 +1962,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, > * The 'flags' used are the SPLICE_F_* variants, currently the only > * applicable one is SPLICE_F_NONBLOCK. > */ > -long do_tee(struct file *in, struct file *out, size_t len, unsigned int flags) > +ssize_t do_tee(struct file *in, struct file *out, size_t len, unsigned int flags) > { > struct pipe_inode_info *ipipe = get_pipe_info(in, true); > struct pipe_inode_info *opipe = get_pipe_info(out, true); > @@ -2003,7 +2003,7 @@ long do_tee(struct file *in, struct file *out, size_t len, unsigned int flags) > SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags) > { > struct fd in, out; > - int error; > + ssize_t error; > > if (unlikely(flags & ~SPLICE_F_ALL)) > return -EINVAL; > diff --git a/include/linux/splice.h b/include/linux/splice.h > index 49532d5dda52..068a8e8ffd73 100644 > --- a/include/linux/splice.h > +++ b/include/linux/splice.h > @@ -68,31 +68,30 @@ typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *, > typedef int (splice_direct_actor)(struct pipe_inode_info *, > struct splice_desc *); > > -extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, > - loff_t *, size_t, unsigned int, > - splice_actor *); > -extern ssize_t __splice_from_pipe(struct pipe_inode_info *, > - struct splice_desc *, splice_actor *); > -extern ssize_t splice_to_pipe(struct pipe_inode_info *, > - struct splice_pipe_desc *); > -extern ssize_t add_to_pipe(struct pipe_inode_info *, > - struct pipe_buffer *); > -long vfs_splice_read(struct file *in, loff_t *ppos, > - struct pipe_inode_info *pipe, size_t len, > - unsigned int flags); > +ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, > + loff_t *ppos, size_t len, unsigned int flags, > + splice_actor *actor); > +ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, > + struct splice_desc *sd, splice_actor *actor); > +ssize_t splice_to_pipe(struct pipe_inode_info *pipe, > + struct splice_pipe_desc *spd); > +ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf); > +ssize_t vfs_splice_read(struct file *in, loff_t *ppos, > + struct pipe_inode_info *pipe, size_t len, > + unsigned int flags); > ssize_t splice_direct_to_actor(struct file *file, struct splice_desc *sd, > splice_direct_actor *actor); > -long do_splice(struct file *in, loff_t *off_in, struct file *out, > - loff_t *off_out, size_t len, unsigned int flags); > -long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, > - loff_t *opos, size_t len, unsigned int flags); > -long splice_file_range(struct file *in, loff_t *ppos, struct file *out, > - loff_t *opos, size_t len); > +ssize_t do_splice(struct file *in, loff_t *off_in, struct file *out, > + loff_t *off_out, size_t len, unsigned int flags); > +ssize_t do_splice_direct(struct file *in, loff_t *ppos, struct file *out, > + loff_t *opos, size_t len, unsigned int flags); > +ssize_t splice_file_range(struct file *in, loff_t *ppos, struct file *out, > + loff_t *opos, size_t len); > > -extern long do_tee(struct file *in, struct file *out, size_t len, > - unsigned int flags); > -extern ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out, > - loff_t *ppos, size_t len, unsigned int flags); > +ssize_t do_tee(struct file *in, struct file *out, size_t len, > + unsigned int flags); > +ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out, > + loff_t *ppos, size_t len, unsigned int flags); > > /* > * for dynamic pipe sizing > diff --git a/io_uring/splice.c b/io_uring/splice.c > index 7c4469e9540e..3b659cd23e9d 100644 > --- a/io_uring/splice.c > +++ b/io_uring/splice.c > @@ -51,7 +51,7 @@ int io_tee(struct io_kiocb *req, unsigned int issue_flags) > struct file *out = sp->file_out; > unsigned int flags = sp->flags & ~SPLICE_F_FD_IN_FIXED; > struct file *in; > - long ret = 0; > + ssize_t ret = 0; > > WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK); > > @@ -92,7 +92,7 @@ int io_splice(struct io_kiocb *req, unsigned int issue_flags) > unsigned int flags = sp->flags & ~SPLICE_F_FD_IN_FIXED; > loff_t *poff_in, *poff_out; > struct file *in; > - long ret = 0; > + ssize_t ret = 0; > > WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK); > > -- > 2.34.1 >