1
2
3
4
5
6
7
8
9 #ifndef SPLICE_H
10 #define SPLICE_H
11
12 #include <linux/pipe_fs_i.h>
13
14
15
16
17 #define SPLICE_F_MOVE (0x01)
18 #define SPLICE_F_NONBLOCK (0x02)
19
20
21 #define SPLICE_F_MORE (0x04)
22 #define SPLICE_F_GIFT (0x08)
23
24 #define SPLICE_F_ALL (SPLICE_F_MOVE|SPLICE_F_NONBLOCK|SPLICE_F_MORE|SPLICE_F_GIFT)
25
26
27
28
29 struct splice_desc {
30 size_t total_len;
31 unsigned int len;
32 unsigned int flags;
33
34
35
36 union {
37 void __user *userptr;
38 struct file *file;
39 void *data;
40 } u;
41 loff_t pos;
42 loff_t *opos;
43 size_t num_spliced;
44 bool need_wakeup;
45 };
46
47 struct partial_page {
48 unsigned int offset;
49 unsigned int len;
50 unsigned long private;
51 };
52
53
54
55
56 struct splice_pipe_desc {
57 struct page **pages;
58 struct partial_page *partial;
59 int nr_pages;
60 unsigned int nr_pages_max;
61 const struct pipe_buf_operations *ops;
62 void (*spd_release)(struct splice_pipe_desc *, unsigned int);
63 };
64
65 typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *,
66 struct splice_desc *);
67 typedef int (splice_direct_actor)(struct pipe_inode_info *,
68 struct splice_desc *);
69
70 extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
71 loff_t *, size_t, unsigned int,
72 splice_actor *);
73 extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
74 struct splice_desc *, splice_actor *);
75 extern ssize_t splice_to_pipe(struct pipe_inode_info *,
76 struct splice_pipe_desc *);
77 extern ssize_t add_to_pipe(struct pipe_inode_info *,
78 struct pipe_buffer *);
79 extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
80 splice_direct_actor *);
81
82
83
84
85 extern int splice_grow_spd(const struct pipe_inode_info *, struct splice_pipe_desc *);
86 extern void splice_shrink_spd(struct splice_pipe_desc *);
87
88 extern const struct pipe_buf_operations page_cache_pipe_buf_ops;
89 extern const struct pipe_buf_operations default_pipe_buf_ops;
90 #endif