|
@@ -936,16 +936,21 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
|
|
|
* pipe->nrbufs == 0 means there are no data to transfer,
|
|
|
* so this returns just 0 for no data.
|
|
|
*/
|
|
|
- if (!pipe->nrbufs)
|
|
|
- return 0;
|
|
|
+ pipe_lock(pipe);
|
|
|
+ if (!pipe->nrbufs) {
|
|
|
+ ret = 0;
|
|
|
+ goto error_out;
|
|
|
+ }
|
|
|
|
|
|
ret = wait_port_writable(port, filp->f_flags & O_NONBLOCK);
|
|
|
if (ret < 0)
|
|
|
- return ret;
|
|
|
+ goto error_out;
|
|
|
|
|
|
buf = alloc_buf(port->out_vq, 0, pipe->nrbufs);
|
|
|
- if (!buf)
|
|
|
- return -ENOMEM;
|
|
|
+ if (!buf) {
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto error_out;
|
|
|
+ }
|
|
|
|
|
|
sgl.n = 0;
|
|
|
sgl.len = 0;
|
|
@@ -953,12 +958,17 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
|
|
|
sgl.sg = buf->sg;
|
|
|
sg_init_table(sgl.sg, sgl.size);
|
|
|
ret = __splice_from_pipe(pipe, &sd, pipe_to_sg);
|
|
|
+ pipe_unlock(pipe);
|
|
|
if (likely(ret > 0))
|
|
|
ret = __send_to_port(port, buf->sg, sgl.n, sgl.len, buf, true);
|
|
|
|
|
|
if (unlikely(ret <= 0))
|
|
|
free_buf(buf, true);
|
|
|
return ret;
|
|
|
+
|
|
|
+error_out:
|
|
|
+ pipe_unlock(pipe);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static unsigned int port_fops_poll(struct file *filp, poll_table *wait)
|