Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46e678c9 authored by Jens Axboe's avatar Jens Axboe
Browse files

[PATCH] splice: fix bugs with stealing regular pipe pages



- Check that page has suitable count for stealing in the regular pipes.
- pipe_to_file() assumes that the page is locked on succesful steal, so
  do that in the pipe steal hook
- Missing unlock_page() in add_to_page_cache() failure.

Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent e0a515bc
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -127,10 +127,17 @@ static void anon_pipe_buf_unmap(struct pipe_inode_info *pipe,
static int anon_pipe_buf_steal(struct pipe_inode_info *pipe,
			       struct pipe_buffer *buf)
{
	struct page *page = buf->page;

	if (page_count(page) == 1) {
		buf->flags |= PIPE_BUF_FLAG_STOLEN;
		lock_page(page);
		return 0;
	}

	return 1;
}

static void anon_pipe_buf_get(struct pipe_inode_info *info,
			      struct pipe_buffer *buf)
{
+3 −1
Original line number Diff line number Diff line
@@ -599,8 +599,10 @@ static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf,
			goto find_page;

		page = buf->page;
		if (add_to_page_cache(page, mapping, index, gfp_mask))
		if (add_to_page_cache(page, mapping, index, gfp_mask)) {
			unlock_page(page);
			goto find_page;
		}

		if (!(buf->flags & PIPE_BUF_FLAG_LRU))
			lru_cache_add(page);