Merge tag 'omap-for-v5.8/dt-missed-signed' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / include / linux / pipe_fs_i.h
index 0c31b94..50afd0d 100644 (file)
@@ -9,6 +9,10 @@
 #define PIPE_BUF_FLAG_GIFT     0x04    /* page is a gift */
 #define PIPE_BUF_FLAG_PACKET   0x08    /* read() as a packet */
 #define PIPE_BUF_FLAG_CAN_MERGE        0x10    /* can merge buffers */
+#define PIPE_BUF_FLAG_WHOLE    0x20    /* read() must return entire buffer or error */
+#ifdef CONFIG_WATCH_QUEUE
+#define PIPE_BUF_FLAG_LOSS     0x40    /* Message loss happened after this buffer */
+#endif
 
 /**
  *     struct pipe_buffer - a linux kernel pipe buffer
@@ -34,8 +38,10 @@ struct pipe_buffer {
  *     @wr_wait: writer wait point in case of full pipe
  *     @head: The point of buffer production
  *     @tail: The point of buffer consumption
+ *     @note_loss: The next read() should insert a data-lost message
  *     @max_usage: The maximum number of slots that may be used in the ring
  *     @ring_size: total number of buffers (should be a power of 2)
+ *     @nr_accounted: The amount this pipe accounts for in user->pipe_bufs
  *     @tmp_page: cached released page
  *     @readers: number of current readers of this pipe
  *     @writers: number of current writers of this pipe
@@ -46,6 +52,7 @@ struct pipe_buffer {
  *     @fasync_writers: writer side fasync
  *     @bufs: the circular array of pipe buffers
  *     @user: the user who created this pipe
+ *     @watch_queue: If this pipe is a watch_queue, this is the stuff for that
  **/
 struct pipe_inode_info {
        struct mutex mutex;
@@ -54,6 +61,10 @@ struct pipe_inode_info {
        unsigned int tail;
        unsigned int max_usage;
        unsigned int ring_size;
+#ifdef CONFIG_WATCH_QUEUE
+       bool note_loss;
+#endif
+       unsigned int nr_accounted;
        unsigned int readers;
        unsigned int writers;
        unsigned int files;
@@ -64,6 +75,9 @@ struct pipe_inode_info {
        struct fasync_struct *fasync_writers;
        struct pipe_buffer *bufs;
        struct user_struct *user;
+#ifdef CONFIG_WATCH_QUEUE
+       struct watch_queue *watch_queue;
+#endif
 };
 
 /*
@@ -239,9 +253,20 @@ void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *);
 
 extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
 
+#ifdef CONFIG_WATCH_QUEUE
+unsigned long account_pipe_buffers(struct user_struct *user,
+                                  unsigned long old, unsigned long new);
+bool too_many_pipe_buffers_soft(unsigned long user_bufs);
+bool too_many_pipe_buffers_hard(unsigned long user_bufs);
+bool pipe_is_unprivileged_user(void);
+#endif
+
 /* for F_SETPIPE_SZ and F_GETPIPE_SZ */
+#ifdef CONFIG_WATCH_QUEUE
+int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots);
+#endif
 long pipe_fcntl(struct file *, unsigned int, unsigned long arg);
-struct pipe_inode_info *get_pipe_info(struct file *file);
+struct pipe_inode_info *get_pipe_info(struct file *file, bool for_splice);
 
 int create_pipe_files(struct file **, int);
 unsigned int round_pipe_size(unsigned long size);