Merge branch 'work.splice' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull splice updates from Al Viro: "Christoph's assorted splice cleanups" * 'work.splice' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fs: rename pipe_buf ->steal to ->try_steal fs: make the pipe_buf_operations ->confirm operation optional fs: make the pipe_buf_operations ->steal operation optional trace: remove tracing_pipe_buf_ops pipe: merge anon_pipe_buf*_ops fs: simplify do_splice_from fs: simplify do_splice_to
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */
|
||||
#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 */
|
||||
|
||||
/**
|
||||
* struct pipe_buffer - a linux kernel pipe buffer
|
||||
@@ -69,11 +70,11 @@ struct pipe_inode_info {
|
||||
* Note on the nesting of these functions:
|
||||
*
|
||||
* ->confirm()
|
||||
* ->steal()
|
||||
* ->try_steal()
|
||||
*
|
||||
* That is, ->steal() must be called on a confirmed buffer.
|
||||
* See below for the meaning of each operation. Also see kerneldoc
|
||||
* in fs/pipe.c for the pipe and generic variants of these hooks.
|
||||
* That is, ->try_steal() must be called on a confirmed buffer. See below for
|
||||
* the meaning of each operation. Also see the kerneldoc in fs/pipe.c for the
|
||||
* pipe and generic variants of these hooks.
|
||||
*/
|
||||
struct pipe_buf_operations {
|
||||
/*
|
||||
@@ -81,7 +82,7 @@ struct pipe_buf_operations {
|
||||
* and that the contents are good. If the pages in the pipe belong
|
||||
* to a file system, we may need to wait for IO completion in this
|
||||
* hook. Returns 0 for good, or a negative error value in case of
|
||||
* error.
|
||||
* error. If not present all pages are considered good.
|
||||
*/
|
||||
int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
|
||||
@@ -93,13 +94,13 @@ struct pipe_buf_operations {
|
||||
|
||||
/*
|
||||
* Attempt to take ownership of the pipe buffer and its contents.
|
||||
* ->steal() returns 0 for success, in which case the contents
|
||||
* of the pipe (the buf->page) is locked and now completely owned
|
||||
* by the caller. The page may then be transferred to a different
|
||||
* mapping, the most often used case is insertion into different
|
||||
* file address space cache.
|
||||
* ->try_steal() returns %true for success, in which case the contents
|
||||
* of the pipe (the buf->page) is locked and now completely owned by the
|
||||
* caller. The page may then be transferred to a different mapping, the
|
||||
* most often used case is insertion into different file address space
|
||||
* cache.
|
||||
*/
|
||||
int (*steal)(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
|
||||
/*
|
||||
* Get a reference to the pipe buffer.
|
||||
@@ -194,18 +195,22 @@ static inline void pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
static inline int pipe_buf_confirm(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
if (!buf->ops->confirm)
|
||||
return 0;
|
||||
return buf->ops->confirm(pipe, buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* pipe_buf_steal - attempt to take ownership of a pipe_buffer
|
||||
* pipe_buf_try_steal - attempt to take ownership of a pipe_buffer
|
||||
* @pipe: the pipe that the buffer belongs to
|
||||
* @buf: the buffer to attempt to steal
|
||||
*/
|
||||
static inline int pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
static inline bool pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
return buf->ops->steal(pipe, buf);
|
||||
if (!buf->ops->try_steal)
|
||||
return false;
|
||||
return buf->ops->try_steal(pipe, buf);
|
||||
}
|
||||
|
||||
/* Differs from PIPE_BUF in that PIPE_SIZE is the length of the actual
|
||||
@@ -229,11 +234,8 @@ void free_pipe_info(struct pipe_inode_info *);
|
||||
|
||||
/* Generic pipe buffer ops functions */
|
||||
bool generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
int generic_pipe_buf_nosteal(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
bool generic_pipe_buf_try_steal(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *);
|
||||
void pipe_buf_mark_unmergeable(struct pipe_buffer *buf);
|
||||
|
||||
extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
|
||||
|
||||
|
Reference in New Issue
Block a user