| 1 | |
| 2 | * Function declerations and data structures related to the splice
|
| 3 | * implementation.
|
| 4 | *
|
| 5 | * Copyright (C) 2007 Jens Axboe <[email protected]>
|
| 6 | *
|
| 7 |
|
| 8 | #ifndef SPLICE_H
|
| 9 | #define SPLICE_H
|
| 10 |
|
| 11 | #include <linux/pipe_fs_i.h>
|
| 12 |
|
| 13 | |
| 14 | * Flags passed in from splice/tee/vmsplice
|
| 15 |
|
| 16 | #define SPLICE_F_MOVE (0x01)
|
| 17 | #define SPLICE_F_NONBLOCK (0x02)
|
| 18 |
|
| 19 |
|
| 20 | #define SPLICE_F_MORE (0x04)
|
| 21 | #define SPLICE_F_GIFT (0x08)
|
| 22 |
|
| 23 | |
| 24 | * Passed to the actors
|
| 25 |
|
| 26 | struct splice_desc {
|
| 27 | unsigned int len, total_len;
|
| 28 | unsigned int flags;
|
| 29 | |
| 30 | * actor() private data
|
| 31 |
|
| 32 | union {
|
| 33 | void __user *userptr;
|
| 34 | struct file *file;
|
| 35 | void *data;
|
| 36 | } u;
|
| 37 | loff_t pos;
|
| 38 | size_t num_spliced;
|
| 39 | bool need_wakeup;
|
| 40 | };
|
| 41 |
|
| 42 | struct partial_page {
|
| 43 | unsigned int offset;
|
| 44 | unsigned int len;
|
| 45 | unsigned long private;
|
| 46 | };
|
| 47 |
|
| 48 | |
| 49 | * Passed to splice_to_pipe
|
| 50 |
|
| 51 | struct splice_pipe_desc {
|
| 52 | struct page **pages;
|
| 53 | struct partial_page *partial;
|
| 54 | int nr_pages;
|
| 55 | unsigned int flags;
|
| 56 | const struct pipe_buf_operations *ops;
|
| 57 | void (*spd_release)(struct splice_pipe_desc *, unsigned int);
|
| 58 | };
|
| 59 |
|
| 60 | typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *,
|
| 61 | struct splice_desc *);
|
| 62 | typedef int (splice_direct_actor)(struct pipe_inode_info *,
|
| 63 | struct splice_desc *);
|
| 64 |
|
| 65 | extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
|
| 66 | loff_t *, size_t, unsigned int,
|
| 67 | splice_actor *);
|
| 68 | extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
|
| 69 | struct splice_desc *, splice_actor *);
|
| 70 | extern int splice_from_pipe_feed(struct pipe_inode_info *, struct splice_desc *,
|
| 71 | splice_actor *);
|
| 72 | extern int splice_from_pipe_next(struct pipe_inode_info *,
|
| 73 | struct splice_desc *);
|
| 74 | extern void splice_from_pipe_begin(struct splice_desc *);
|
| 75 | extern void splice_from_pipe_end(struct pipe_inode_info *,
|
| 76 | struct splice_desc *);
|
| 77 | extern int pipe_to_file(struct pipe_inode_info *, struct pipe_buffer *,
|
| 78 | struct splice_desc *);
|
| 79 |
|
| 80 | extern ssize_t splice_to_pipe(struct pipe_inode_info *,
|
| 81 | struct splice_pipe_desc *);
|
| 82 | extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
|
| 83 | splice_direct_actor *);
|
| 84 |
|
| 85 | |
| 86 | * for dynamic pipe sizing
|
| 87 |
|
| 88 | extern int splice_grow_spd(struct pipe_inode_info *, struct splice_pipe_desc *);
|
| 89 | extern void splice_shrink_spd(struct pipe_inode_info *,
|
| 90 | struct splice_pipe_desc *);
|
| 91 |
|
| 92 | #endif
|