aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2007-06-04 03:59:47 -0400
committerJens Axboe <jens.axboe@oracle.com>2007-07-10 02:04:14 -0400
commitd6b29d7cee064f28ca097e906de7453541351095 (patch)
tree16775787df194cb45b4ac712da1c240f48cae96e /include
parentebf9909343392c929d9943c04f421cd42e03b530 (diff)
splice: divorce the splice structure/function definitions from the pipe header
We need to move even more stuff into the header so that folks can use the splice_to_pipe() implementation instead of open-coding a lot of pipe knowledge (see relay implementation), so move to our own header file finally. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/pipe_fs_i.h41
-rw-r--r--include/linux/splice.h72
2 files changed, 72 insertions, 41 deletions
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
index f277a9cdb50d..7ba228d52f58 100644
--- a/include/linux/pipe_fs_i.h
+++ b/include/linux/pipe_fs_i.h
@@ -71,45 +71,4 @@ void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *);
71int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *); 71int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *);
72int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); 72int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *);
73 73
74/*
75 * splice is tied to pipes as a transport (at least for now), so we'll just
76 * add the splice flags here.
77 */
78#define SPLICE_F_MOVE (0x01) /* move pages instead of copying */
79#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
80 /* we may still block on the fd we splice */
81 /* from/to, of course */
82#define SPLICE_F_MORE (0x04) /* expect more data */
83#define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */
84
85/*
86 * Passed to the actors
87 */
88struct splice_desc {
89 unsigned int len, total_len; /* current and remaining length */
90 unsigned int flags; /* splice flags */
91 /*
92 * actor() private data
93 */
94 union {
95 void __user *userptr; /* memory to write to */
96 struct file *file; /* file to read/write */
97 void *data; /* cookie */
98 } u;
99 loff_t pos; /* file position */
100};
101
102typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *,
103 struct splice_desc *);
104typedef int (splice_direct_actor)(struct pipe_inode_info *,
105 struct splice_desc *);
106
107extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
108 loff_t *, size_t, unsigned int,
109 splice_actor *);
110extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
111 struct splice_desc *, splice_actor *);
112extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
113 splice_direct_actor *);
114
115#endif 74#endif
diff --git a/include/linux/splice.h b/include/linux/splice.h
new file mode 100644
index 000000000000..f8cc97f71cd0
--- /dev/null
+++ b/include/linux/splice.h
@@ -0,0 +1,72 @@
1/*
2 * Function declerations and data structures related to the splice
3 * implementation.
4 *
5 * Copyright (C) 2007 Jens Axboe <jens.axboe@oracle.com>
6 *
7 */
8#ifndef SPLICE_H
9#define SPLICE_H
10
11#include <linux/pipe_fs_i.h>
12
13/*
14 * splice is tied to pipes as a transport (at least for now), so we'll just
15 * add the splice flags here.
16 */
17#define SPLICE_F_MOVE (0x01) /* move pages instead of copying */
18#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
19 /* we may still block on the fd we splice */
20 /* from/to, of course */
21#define SPLICE_F_MORE (0x04) /* expect more data */
22#define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */
23
24/*
25 * Passed to the actors
26 */
27struct splice_desc {
28 unsigned int len, total_len; /* current and remaining length */
29 unsigned int flags; /* splice flags */
30 /*
31 * actor() private data
32 */
33 union {
34 void __user *userptr; /* memory to write to */
35 struct file *file; /* file to read/write */
36 void *data; /* cookie */
37 } u;
38 loff_t pos; /* file position */
39};
40
41struct partial_page {
42 unsigned int offset;
43 unsigned int len;
44};
45
46/*
47 * Passed to splice_to_pipe
48 */
49struct splice_pipe_desc {
50 struct page **pages; /* page map */
51 struct partial_page *partial; /* pages[] may not be contig */
52 int nr_pages; /* number of pages in map */
53 unsigned int flags; /* splice flags */
54 const struct pipe_buf_operations *ops;/* ops associated with output pipe */
55};
56
57typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *,
58 struct splice_desc *);
59typedef int (splice_direct_actor)(struct pipe_inode_info *,
60 struct splice_desc *);
61
62extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
63 loff_t *, size_t, unsigned int,
64 splice_actor *);
65extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
66 struct splice_desc *, splice_actor *);
67extern ssize_t splice_to_pipe(struct pipe_inode_info *,
68 struct splice_pipe_desc *);
69extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
70 splice_direct_actor *);
71
72#endif