diff --git a/fs/splice.c b/fs/splice.c index 60aed8de21f8..c6d812684d4e 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -745,16 +745,30 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out, if (ret <= 0) break; + printk("ret: %ld, total len: %lu, %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]; + printk("ret: %ld, nbufs: %d, buf:%p, buf len: %u, m: %u, t: %u,ring size: %u, t&m: %u, n:%d, %s\n", + ret, nbufs, buf, buf->len, mask, tail, pipe->ring_size, tail & mask, n, __func__); + n++; + if (!buf->len) { + tail++; + continue; + } if (ret >= buf->len) { ret -= buf->len; + printk("ret: %ld, %s\n", ret, __func__); buf->len = 0; pipe_buf_release(pipe, buf); tail++; 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..8157b4e6d7b3 100644 --- a/fs/netfs/direct_write.c +++ b/fs/netfs/direct_write.c @@ -190,6 +190,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: %ld, %s\n", ret, __func__); netfs_end_io_direct(inode); return ret; }