forked from Minki/linux
fs: rename pipe_buf ->steal to ->try_steal
And replace the arcane return value convention with a simple bool where true means success and false means failure. [AV: braino fix folded in] Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b8d9e7f241
commit
c928f642c2
@ -871,7 +871,7 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
|
||||
return 0;
|
||||
|
||||
/* Try lock this page */
|
||||
if (pipe_buf_steal(pipe, buf) == 0) {
|
||||
if (pipe_buf_try_steal(pipe, buf)) {
|
||||
/* Get reference and unlock page for moving */
|
||||
get_page(buf->page);
|
||||
unlock_page(buf->page);
|
||||
|
@ -805,7 +805,7 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
|
||||
if (cs->len != PAGE_SIZE)
|
||||
goto out_fallback;
|
||||
|
||||
if (pipe_buf_steal(cs->pipe, buf) != 0)
|
||||
if (!pipe_buf_try_steal(cs->pipe, buf))
|
||||
goto out_fallback;
|
||||
|
||||
newpage = buf->page;
|
||||
|
34
fs/pipe.c
34
fs/pipe.c
@ -140,21 +140,20 @@ static void anon_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
put_page(page);
|
||||
}
|
||||
|
||||
static int anon_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
static bool anon_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
struct page *page = buf->page;
|
||||
|
||||
if (page_count(page) == 1) {
|
||||
memcg_kmem_uncharge_page(page, 0);
|
||||
__SetPageLocked(page);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
if (page_count(page) != 1)
|
||||
return false;
|
||||
memcg_kmem_uncharge_page(page, 0);
|
||||
__SetPageLocked(page);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* generic_pipe_buf_steal - attempt to take ownership of a &pipe_buffer
|
||||
* generic_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
|
||||
*
|
||||
@ -165,8 +164,8 @@ static int anon_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
* he wishes; the typical use is insertion into a different file
|
||||
* page cache.
|
||||
*/
|
||||
int generic_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
bool generic_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
struct page *page = buf->page;
|
||||
|
||||
@ -177,12 +176,11 @@ int generic_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
*/
|
||||
if (page_count(page) == 1) {
|
||||
lock_page(page);
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(generic_pipe_buf_steal);
|
||||
EXPORT_SYMBOL(generic_pipe_buf_try_steal);
|
||||
|
||||
/**
|
||||
* generic_pipe_buf_get - get a reference to a &struct pipe_buffer
|
||||
@ -216,9 +214,9 @@ void generic_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
EXPORT_SYMBOL(generic_pipe_buf_release);
|
||||
|
||||
static const struct pipe_buf_operations anon_pipe_buf_ops = {
|
||||
.release = anon_pipe_buf_release,
|
||||
.steal = anon_pipe_buf_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
.release = anon_pipe_buf_release,
|
||||
.try_steal = anon_pipe_buf_try_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
|
||||
/* Done while waiting without holding the pipe lock - thus the READ_ONCE() */
|
||||
|
40
fs/splice.c
40
fs/splice.c
@ -44,8 +44,8 @@
|
||||
* addition of remove_mapping(). If success is returned, the caller may
|
||||
* attempt to reuse this page for another destination.
|
||||
*/
|
||||
static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
static bool page_cache_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
struct page *page = buf->page;
|
||||
struct address_space *mapping;
|
||||
@ -76,7 +76,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
*/
|
||||
if (remove_mapping(mapping, page)) {
|
||||
buf->flags |= PIPE_BUF_FLAG_LRU;
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -86,7 +86,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
*/
|
||||
out_unlock:
|
||||
unlock_page(page);
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
@ -139,26 +139,26 @@ error:
|
||||
}
|
||||
|
||||
const struct pipe_buf_operations page_cache_pipe_buf_ops = {
|
||||
.confirm = page_cache_pipe_buf_confirm,
|
||||
.release = page_cache_pipe_buf_release,
|
||||
.steal = page_cache_pipe_buf_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
.confirm = page_cache_pipe_buf_confirm,
|
||||
.release = page_cache_pipe_buf_release,
|
||||
.try_steal = page_cache_pipe_buf_try_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
|
||||
static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
static bool user_page_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
if (!(buf->flags & PIPE_BUF_FLAG_GIFT))
|
||||
return 1;
|
||||
return false;
|
||||
|
||||
buf->flags |= PIPE_BUF_FLAG_LRU;
|
||||
return generic_pipe_buf_steal(pipe, buf);
|
||||
return generic_pipe_buf_try_steal(pipe, buf);
|
||||
}
|
||||
|
||||
static const struct pipe_buf_operations user_page_pipe_buf_ops = {
|
||||
.release = page_cache_pipe_buf_release,
|
||||
.steal = user_page_pipe_buf_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
.release = page_cache_pipe_buf_release,
|
||||
.try_steal = user_page_pipe_buf_try_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
|
||||
static void wakeup_pipe_readers(struct pipe_inode_info *pipe)
|
||||
@ -330,15 +330,15 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
|
||||
EXPORT_SYMBOL(generic_file_splice_read);
|
||||
|
||||
const struct pipe_buf_operations default_pipe_buf_ops = {
|
||||
.release = generic_pipe_buf_release,
|
||||
.steal = generic_pipe_buf_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
.release = generic_pipe_buf_release,
|
||||
.try_steal = generic_pipe_buf_try_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
|
||||
/* Pipe buffer operations for a socket and similar. */
|
||||
const struct pipe_buf_operations nosteal_pipe_buf_ops = {
|
||||
.release = generic_pipe_buf_release,
|
||||
.get = generic_pipe_buf_get,
|
||||
.release = generic_pipe_buf_release,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
EXPORT_SYMBOL(nosteal_pipe_buf_ops);
|
||||
|
||||
|
@ -70,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 {
|
||||
/*
|
||||
@ -94,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.
|
||||
@ -201,16 +201,16 @@ static inline int pipe_buf_confirm(struct pipe_inode_info *pipe,
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
if (!buf->ops->steal)
|
||||
return 1;
|
||||
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
|
||||
@ -234,7 +234,7 @@ 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_steal(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 *);
|
||||
|
||||
extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
|
||||
|
@ -1177,9 +1177,9 @@ static void relay_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
}
|
||||
|
||||
static const struct pipe_buf_operations relay_pipe_buf_ops = {
|
||||
.release = relay_pipe_buf_release,
|
||||
.steal = generic_pipe_buf_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
.release = relay_pipe_buf_release,
|
||||
.try_steal = generic_pipe_buf_try_steal,
|
||||
.get = generic_pipe_buf_get,
|
||||
};
|
||||
|
||||
static void relay_page_release(struct splice_pipe_desc *spd, unsigned int i)
|
||||
|
Loading…
Reference in New Issue
Block a user