From 03d95eb2f2578083a3f6286262e1cb5d88a00c02 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 20 Mar 2013 13:04:20 -0400 Subject: lift sb_start_write() out of ->write() Signed-off-by: Al Viro --- fs/splice.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'fs/splice.c') diff --git a/fs/splice.c b/fs/splice.c index 29e394e49ddd..e78a749064db 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1052,7 +1052,9 @@ static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf, loff_t tmp = sd->pos; data = buf->ops->map(pipe, buf, 0); + file_start_write(sd->u.file); ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp); + file_end_write(sd->u.file); buf->ops->unmap(pipe, buf, data); return ret; -- cgit v1.2.3-59-g8ed1b From 17338fccb28ec38097041074dcdc2016df538290 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 20 Mar 2013 13:19:30 -0400 Subject: lift sb_start_write into default_file_splice_write() Signed-off-by: Al Viro --- fs/splice.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'fs/splice.c') diff --git a/fs/splice.c b/fs/splice.c index e78a749064db..17d7323bc2c5 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1052,9 +1052,7 @@ static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf, loff_t tmp = sd->pos; data = buf->ops->map(pipe, buf, 0); - file_start_write(sd->u.file); ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp); - file_end_write(sd->u.file); buf->ops->unmap(pipe, buf, data); return ret; @@ -1066,7 +1064,9 @@ static ssize_t default_file_splice_write(struct pipe_inode_info *pipe, { ssize_t ret; + file_start_write(out); ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf); + file_end_write(out); if (ret > 0) *ppos += ret; -- cgit v1.2.3-59-g8ed1b From 2dd8c9ad376ccc5d2980b38e96372a8e252ae8d0 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 20 Mar 2013 13:21:32 -0400 Subject: lift sb_start_write out of ->splice_write() Signed-off-by: Al Viro --- fs/splice.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'fs/splice.c') diff --git a/fs/splice.c b/fs/splice.c index 17d7323bc2c5..7efc2f5057fb 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1000,8 +1000,6 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, }; ssize_t ret; - sb_start_write(inode->i_sb); - pipe_lock(pipe); splice_from_pipe_begin(&sd); @@ -1037,7 +1035,6 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, *ppos += ret; balance_dirty_pages_ratelimited(mapping); } - sb_end_write(inode->i_sb); return ret; } @@ -1064,9 +1061,7 @@ static ssize_t default_file_splice_write(struct pipe_inode_info *pipe, { ssize_t ret; - file_start_write(out); ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf); - file_end_write(out); if (ret > 0) *ppos += ret; @@ -1119,7 +1114,10 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, else splice_write = default_file_splice_write; - return splice_write(pipe, out, ppos, len, flags); + file_start_write(out); + ret = splice_write(pipe, out, ppos, len, flags); + file_end_write(out); + return ret; } /* -- cgit v1.2.3-59-g8ed1b From 6447a3cf19da8c4653283d1c491e2e775633f348 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 21 Mar 2013 11:01:38 -0400 Subject: get rid of pipe->inode it's used only as a flag to distinguish normal pipes/FIFOs from the internal per-task one used by file-to-file splice. And pipe->files would work just as well for that purpose... Signed-off-by: Al Viro --- fs/fuse/dev.c | 2 +- fs/pipe.c | 5 ++--- fs/splice.c | 4 ++-- include/linux/pipe_fs_i.h | 2 -- 4 files changed, 5 insertions(+), 8 deletions(-) (limited to 'fs/splice.c') diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 11dfa0c3fb46..9bfd1a3214e6 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -1319,7 +1319,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, page_nr++; ret += buf->len; - if (pipe->inode) + if (pipe->files) do_wakeup = 1; } diff --git a/fs/pipe.c b/fs/pipe.c index e2fc5ccb0d49..39bdec06fe2b 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -55,7 +55,7 @@ unsigned int pipe_min_size = PAGE_SIZE; static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) { - if (pipe->inode) + if (pipe->files) mutex_lock_nested(&pipe->mutex, subclass); } @@ -70,7 +70,7 @@ EXPORT_SYMBOL(pipe_lock); void pipe_unlock(struct pipe_inode_info *pipe) { - if (pipe->inode) + if (pipe->files) mutex_unlock(&pipe->mutex); } EXPORT_SYMBOL(pipe_unlock); @@ -785,7 +785,6 @@ struct pipe_inode_info * alloc_pipe_info(struct inode *inode) if (pipe->bufs) { init_waitqueue_head(&pipe->wait); pipe->r_counter = pipe->w_counter = 1; - pipe->inode = inode; pipe->buffers = PIPE_DEF_BUFFERS; mutex_init(&pipe->mutex); return pipe; diff --git a/fs/splice.c b/fs/splice.c index 7efc2f5057fb..9f2a4447da50 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -218,7 +218,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, page_nr++; ret += buf->len; - if (pipe->inode) + if (pipe->files) do_wakeup = 1; if (!--spd->nr_pages) @@ -828,7 +828,7 @@ int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd, ops->release(pipe, buf); pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1); pipe->nrbufs--; - if (pipe->inode) + if (pipe->files) sd->need_wakeup = true; } diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index d803a85a64b6..ed8eeeb10811 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -41,7 +41,6 @@ struct pipe_buffer { * @w_counter: writer counter * @fasync_readers: reader side fasync * @fasync_writers: writer side fasync - * @inode: inode this pipe is attached to * @bufs: the circular array of pipe buffers **/ struct pipe_inode_info { @@ -57,7 +56,6 @@ struct pipe_inode_info { struct page *tmp_page; struct fasync_struct *fasync_readers; struct fasync_struct *fasync_writers; - struct inode *inode; struct pipe_buffer *bufs; }; -- cgit v1.2.3-59-g8ed1b From 7bee130e222dfb3a7a70c0404dc09f104cddd7d6 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 21 Mar 2013 11:04:15 -0400 Subject: get rid of alloc_pipe_info() argument not used anymore Signed-off-by: Al Viro --- fs/pipe.c | 6 +++--- fs/splice.c | 2 +- include/linux/pipe_fs_i.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'fs/splice.c') diff --git a/fs/pipe.c b/fs/pipe.c index 39bdec06fe2b..6cac5ceeded0 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -775,7 +775,7 @@ pipe_fasync(int fd, struct file *filp, int on) return retval; } -struct pipe_inode_info * alloc_pipe_info(struct inode *inode) +struct pipe_inode_info *alloc_pipe_info(void) { struct pipe_inode_info *pipe; @@ -841,7 +841,7 @@ static struct inode * get_pipe_inode(void) inode->i_ino = get_next_ino(); - pipe = alloc_pipe_info(inode); + pipe = alloc_pipe_info(); if (!pipe) goto fail_iput; @@ -1031,7 +1031,7 @@ static int fifo_open(struct inode *inode, struct file *filp) spin_unlock(&inode->i_lock); } else { spin_unlock(&inode->i_lock); - pipe = alloc_pipe_info(inode); + pipe = alloc_pipe_info(); if (!pipe) return -ENOMEM; pipe->files = 1; diff --git a/fs/splice.c b/fs/splice.c index 9f2a4447da50..45e645b15d92 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1183,7 +1183,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, */ pipe = current->splice_pipe; if (unlikely(!pipe)) { - pipe = alloc_pipe_info(NULL); + pipe = alloc_pipe_info(); if (!pipe) return -ENOMEM; diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index ed8eeeb10811..765114f16243 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -146,7 +146,7 @@ int pipe_proc_fn(struct ctl_table *, int, void __user *, size_t *, loff_t *); /* Drop the inode semaphore and wait for a pipe event, atomically */ void pipe_wait(struct pipe_inode_info *pipe); -struct pipe_inode_info * alloc_pipe_info(struct inode * inode); +struct pipe_inode_info *alloc_pipe_info(void); void free_pipe_info(struct inode * inode); void __free_pipe_info(struct pipe_inode_info *); -- cgit v1.2.3-59-g8ed1b