[PATCH] splice: fix bugs with stealing regular pipe pages
[firefly-linux-kernel-4.4.55.git] / fs / pipe.c
index 7fefb10db8d9d6ad2a187d3c352cd0557beb30f5..5a369273c51b815465075f6c13ad5e65e4cbc031 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -127,8 +127,15 @@ 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)
 {
-       buf->flags |= PIPE_BUF_FLAG_STOLEN;
-       return 0;
+       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,