diff --git a/fs/splice.c b/fs/splice.c index 60aed8de21f8..abf45d6184a5 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -745,14 +745,25 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out, if (ret <= 0) break; + printk("ret: %zd, total len: %zu, %s\n", ret, sd.total_len, __func__); + if (ret > sd.total_len) { + ret = -EINVAL; + goto done; + } sd.num_spliced += ret; sd.total_len -= ret; *ppos = sd.pos; /* dismiss the fully eaten buffers, adjust the partial one */ tail = pipe->tail; - while (ret) { + n = 0; + while (ret > 0 && n < nbufs) { struct pipe_buffer *buf = &pipe->bufs[tail & mask]; + n++; + if (!buf->len) { + tail++; + continue; + } if (ret >= buf->len) { ret -= buf->len; buf->len = 0; diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 1121601536d1..f7c32835b094 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -510,6 +510,7 @@ ssize_t netfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) netfs_end_io_write(inode); if (ret > 0) ret = generic_write_sync(iocb, ret); + printk("ret: %ld, %s\n", ret, __func__); return ret; } EXPORT_SYMBOL(netfs_file_write_iter); diff --git a/fs/netfs/direct_write.c b/fs/netfs/direct_write.c index 608ba6416919..ecd57c4d0ecb 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -69,6 +69,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov */ if (async || user_backed_iter(iter)) { n = netfs_extract_user_iter(iter, len, &wreq->iter, 0); + printk("ret: %zd, %s\n", n, __func__); if (n < 0) { ret = n; goto out; @@ -190,6 +191,7 @@ ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct iov_iter *from) FSCACHE_INVAL_DIO_WRITE); ret = netfs_unbuffered_write_iter_locked(iocb, from, NULL); out: + printk("ret: %zd, %s\n", ret, __func__); netfs_end_io_direct(inode); return ret; }