diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2007-06-04 03:59:47 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2007-07-10 02:04:14 -0400 |
commit | d6b29d7cee064f28ca097e906de7453541351095 (patch) | |
tree | 16775787df194cb45b4ac712da1c240f48cae96e /include/linux/splice.h | |
parent | ebf9909343392c929d9943c04f421cd42e03b530 (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/linux/splice.h')
-rw-r--r-- | include/linux/splice.h | 72 |
1 files changed, 72 insertions, 0 deletions
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 | */ | ||
27 | struct 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 | |||
41 | struct partial_page { | ||
42 | unsigned int offset; | ||
43 | unsigned int len; | ||
44 | }; | ||
45 | |||
46 | /* | ||
47 | * Passed to splice_to_pipe | ||
48 | */ | ||
49 | struct 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 | |||
57 | typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *, | ||
58 | struct splice_desc *); | ||
59 | typedef int (splice_direct_actor)(struct pipe_inode_info *, | ||
60 | struct splice_desc *); | ||
61 | |||
62 | extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, | ||
63 | loff_t *, size_t, unsigned int, | ||
64 | splice_actor *); | ||
65 | extern ssize_t __splice_from_pipe(struct pipe_inode_info *, | ||
66 | struct splice_desc *, splice_actor *); | ||
67 | extern ssize_t splice_to_pipe(struct pipe_inode_info *, | ||
68 | struct splice_pipe_desc *); | ||
69 | extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, | ||
70 | splice_direct_actor *); | ||
71 | |||
72 | #endif | ||