1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Function declerations and data structures related to the splice 4*4882a593Smuzhiyun * implementation. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2007 Jens Axboe <jens.axboe@oracle.com> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef SPLICE_H 10*4882a593Smuzhiyun #define SPLICE_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/pipe_fs_i.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Flags passed in from splice/tee/vmsplice 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun #define SPLICE_F_MOVE (0x01) /* move pages instead of copying */ 18*4882a593Smuzhiyun #define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */ 19*4882a593Smuzhiyun /* we may still block on the fd we splice */ 20*4882a593Smuzhiyun /* from/to, of course */ 21*4882a593Smuzhiyun #define SPLICE_F_MORE (0x04) /* expect more data */ 22*4882a593Smuzhiyun #define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SPLICE_F_ALL (SPLICE_F_MOVE|SPLICE_F_NONBLOCK|SPLICE_F_MORE|SPLICE_F_GIFT) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* 27*4882a593Smuzhiyun * Passed to the actors 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun struct splice_desc { 30*4882a593Smuzhiyun size_t total_len; /* remaining length */ 31*4882a593Smuzhiyun unsigned int len; /* current length */ 32*4882a593Smuzhiyun unsigned int flags; /* splice flags */ 33*4882a593Smuzhiyun /* 34*4882a593Smuzhiyun * actor() private data 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun union { 37*4882a593Smuzhiyun void __user *userptr; /* memory to write to */ 38*4882a593Smuzhiyun struct file *file; /* file to read/write */ 39*4882a593Smuzhiyun void *data; /* cookie */ 40*4882a593Smuzhiyun } u; 41*4882a593Smuzhiyun loff_t pos; /* file position */ 42*4882a593Smuzhiyun loff_t *opos; /* sendfile: output position */ 43*4882a593Smuzhiyun size_t num_spliced; /* number of bytes already spliced */ 44*4882a593Smuzhiyun bool need_wakeup; /* need to wake up writer */ 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct partial_page { 48*4882a593Smuzhiyun unsigned int offset; 49*4882a593Smuzhiyun unsigned int len; 50*4882a593Smuzhiyun unsigned long private; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* 54*4882a593Smuzhiyun * Passed to splice_to_pipe 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct splice_pipe_desc { 57*4882a593Smuzhiyun struct page **pages; /* page map */ 58*4882a593Smuzhiyun struct partial_page *partial; /* pages[] may not be contig */ 59*4882a593Smuzhiyun int nr_pages; /* number of populated pages in map */ 60*4882a593Smuzhiyun unsigned int nr_pages_max; /* pages[] & partial[] arrays size */ 61*4882a593Smuzhiyun const struct pipe_buf_operations *ops;/* ops associated with output pipe */ 62*4882a593Smuzhiyun void (*spd_release)(struct splice_pipe_desc *, unsigned int); 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *, 66*4882a593Smuzhiyun struct splice_desc *); 67*4882a593Smuzhiyun typedef int (splice_direct_actor)(struct pipe_inode_info *, 68*4882a593Smuzhiyun struct splice_desc *); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, 71*4882a593Smuzhiyun loff_t *, size_t, unsigned int, 72*4882a593Smuzhiyun splice_actor *); 73*4882a593Smuzhiyun extern ssize_t __splice_from_pipe(struct pipe_inode_info *, 74*4882a593Smuzhiyun struct splice_desc *, splice_actor *); 75*4882a593Smuzhiyun extern ssize_t splice_to_pipe(struct pipe_inode_info *, 76*4882a593Smuzhiyun struct splice_pipe_desc *); 77*4882a593Smuzhiyun extern ssize_t add_to_pipe(struct pipe_inode_info *, 78*4882a593Smuzhiyun struct pipe_buffer *); 79*4882a593Smuzhiyun extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, 80*4882a593Smuzhiyun splice_direct_actor *); 81*4882a593Smuzhiyun extern long do_splice(struct file *in, loff_t *off_in, 82*4882a593Smuzhiyun struct file *out, loff_t *off_out, 83*4882a593Smuzhiyun size_t len, unsigned int flags); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun extern long do_tee(struct file *in, struct file *out, size_t len, 86*4882a593Smuzhiyun unsigned int flags); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* 89*4882a593Smuzhiyun * for dynamic pipe sizing 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun extern int splice_grow_spd(const struct pipe_inode_info *, struct splice_pipe_desc *); 92*4882a593Smuzhiyun extern void splice_shrink_spd(struct splice_pipe_desc *); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun extern const struct pipe_buf_operations page_cache_pipe_buf_ops; 95*4882a593Smuzhiyun extern const struct pipe_buf_operations default_pipe_buf_ops; 96*4882a593Smuzhiyun #endif 97