root/include/linux/splice.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * Function declerations and data structures related to the splice
   4  * implementation.
   5  *
   6  * Copyright (C) 2007 Jens Axboe <jens.axboe@oracle.com>
   7  *
   8  */
   9 #ifndef SPLICE_H
  10 #define SPLICE_H
  11 
  12 #include <linux/pipe_fs_i.h>
  13 
  14 /*
  15  * Flags passed in from splice/tee/vmsplice
  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 #define SPLICE_F_ALL (SPLICE_F_MOVE|SPLICE_F_NONBLOCK|SPLICE_F_MORE|SPLICE_F_GIFT)
  25 
  26 /*
  27  * Passed to the actors
  28  */
  29 struct splice_desc {
  30         size_t total_len;               /* remaining length */
  31         unsigned int len;               /* current length */
  32         unsigned int flags;             /* splice flags */
  33         /*
  34          * actor() private data
  35          */
  36         union {
  37                 void __user *userptr;   /* memory to write to */
  38                 struct file *file;      /* file to read/write */
  39                 void *data;             /* cookie */
  40         } u;
  41         loff_t pos;                     /* file position */
  42         loff_t *opos;                   /* sendfile: output position */
  43         size_t num_spliced;             /* number of bytes already spliced */
  44         bool need_wakeup;               /* need to wake up writer */
  45 };
  46 
  47 struct partial_page {
  48         unsigned int offset;
  49         unsigned int len;
  50         unsigned long private;
  51 };
  52 
  53 /*
  54  * Passed to splice_to_pipe
  55  */
  56 struct splice_pipe_desc {
  57         struct page **pages;            /* page map */
  58         struct partial_page *partial;   /* pages[] may not be contig */
  59         int nr_pages;                   /* number of populated pages in map */
  60         unsigned int nr_pages_max;      /* pages[] & partial[] arrays size */
  61         const struct pipe_buf_operations *ops;/* ops associated with output pipe */
  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  * for dynamic pipe sizing
  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

/* [<][>][^][v][top][bottom][index][help] */