at v4.12 2.8 kB view raw
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 * Flags passed in from splice/tee/vmsplice 15 */ 16#define SPLICE_F_MOVE (0x01) /* move pages instead of copying */ 17#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */ 18 /* we may still block on the fd we splice */ 19 /* from/to, of course */ 20#define SPLICE_F_MORE (0x04) /* expect more data */ 21#define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */ 22 23#define SPLICE_F_ALL (SPLICE_F_MOVE|SPLICE_F_NONBLOCK|SPLICE_F_MORE|SPLICE_F_GIFT) 24 25/* 26 * Passed to the actors 27 */ 28struct splice_desc { 29 size_t total_len; /* remaining length */ 30 unsigned int len; /* current length */ 31 unsigned int flags; /* splice flags */ 32 /* 33 * actor() private data 34 */ 35 union { 36 void __user *userptr; /* memory to write to */ 37 struct file *file; /* file to read/write */ 38 void *data; /* cookie */ 39 } u; 40 loff_t pos; /* file position */ 41 loff_t *opos; /* sendfile: output position */ 42 size_t num_spliced; /* number of bytes already spliced */ 43 bool need_wakeup; /* need to wake up writer */ 44}; 45 46struct partial_page { 47 unsigned int offset; 48 unsigned int len; 49 unsigned long private; 50}; 51 52/* 53 * Passed to splice_to_pipe 54 */ 55struct splice_pipe_desc { 56 struct page **pages; /* page map */ 57 struct partial_page *partial; /* pages[] may not be contig */ 58 int nr_pages; /* number of populated pages in map */ 59 unsigned int nr_pages_max; /* pages[] & partial[] arrays size */ 60 const struct pipe_buf_operations *ops;/* ops associated with output pipe */ 61 void (*spd_release)(struct splice_pipe_desc *, unsigned int); 62}; 63 64typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *, 65 struct splice_desc *); 66typedef int (splice_direct_actor)(struct pipe_inode_info *, 67 struct splice_desc *); 68 69extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, 70 loff_t *, size_t, unsigned int, 71 splice_actor *); 72extern ssize_t __splice_from_pipe(struct pipe_inode_info *, 73 struct splice_desc *, splice_actor *); 74extern ssize_t splice_to_pipe(struct pipe_inode_info *, 75 struct splice_pipe_desc *); 76extern ssize_t add_to_pipe(struct pipe_inode_info *, 77 struct pipe_buffer *); 78extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, 79 splice_direct_actor *); 80 81/* 82 * for dynamic pipe sizing 83 */ 84extern int splice_grow_spd(const struct pipe_inode_info *, struct splice_pipe_desc *); 85extern void splice_shrink_spd(struct splice_pipe_desc *); 86 87extern const struct pipe_buf_operations page_cache_pipe_buf_ops; 88extern const struct pipe_buf_operations default_pipe_buf_ops; 89#endif