diff options
author | Jens Axboe <axboe@suse.de> | 2006-04-11 15:51:17 +0200 |
---|---|---|
committer | Jens Axboe <axboe@suse.de> | 2006-04-11 15:51:17 +0200 |
commit | 70524490ee2ea1bbf6cee6c106597b3ac25a3fc2 (patch) | |
tree | c61dd500035bc3e0dea364777de1b7a58b41a75c /fs/pipe.c | |
parent | [PATCH] splice: pass offset around for ->splice_read() and ->splice_write() (diff) | |
download | linux-70524490ee2ea1bbf6cee6c106597b3ac25a3fc2.tar.xz linux-70524490ee2ea1bbf6cee6c106597b3ac25a3fc2.zip |
[PATCH] splice: add support for sys_tee()
Basically an in-kernel implementation of tee, which uses splice and the
pipe buffers as an intelligent way to pass data around by reference.
Where the user space tee consumes the input and produces a stdout and
file output, this syscall merely duplicates the data inside a pipe to
another pipe. No data is copied, the output just grabs a reference to the
input pipe data.
Signed-off-by: Jens Axboe <axboe@suse.de>
Diffstat (limited to 'fs/pipe.c')
-rw-r--r-- | fs/pipe.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/pipe.c b/fs/pipe.c index e984beb93a0e..7fefb10db8d9 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -131,12 +131,19 @@ static int anon_pipe_buf_steal(struct pipe_inode_info *pipe, return 0; } +static void anon_pipe_buf_get(struct pipe_inode_info *info, + struct pipe_buffer *buf) +{ + page_cache_get(buf->page); +} + static struct pipe_buf_operations anon_pipe_buf_ops = { .can_merge = 1, .map = anon_pipe_buf_map, .unmap = anon_pipe_buf_unmap, .release = anon_pipe_buf_release, .steal = anon_pipe_buf_steal, + .get = anon_pipe_buf_get, }; static ssize_t |