Assigning the newly allocated page to pipe->tmp_page, only to unconditionally clear ->tmp_page a little later, seems somewhat odd. It made sense prior to commit a194dfe6e6f6 ("pipe: Rearrange sequence in pipe_write() to preallocate slot"), when a user copy was done between the allocation and the buf->page = page assignment, and a failure there would then just leave the pipe's one-element page cache populated. Now, the same purpose is served by the page being inserted as a size-0 buffer, and the next write attempting to merge with that buffer. Signed-off-by: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> --- fs/pipe.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 4d0799e4e719..097400cce241 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -508,13 +508,14 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) struct page *page = pipe->tmp_page; int copied; - if (!page) { + if (page) { + pipe->tmp_page = NULL; + } else { page = alloc_page(GFP_HIGHUSER | __GFP_ACCOUNT); if (unlikely(!page)) { ret = ret ? : -ENOMEM; break; } - pipe->tmp_page = page; } /* Allocate a slot in the ring in advance and attach an @@ -534,7 +535,6 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) buf->flags = PIPE_BUF_FLAG_PACKET; else buf->flags = PIPE_BUF_FLAG_CAN_MERGE; - pipe->tmp_page = NULL; copied = copy_page_from_iter(page, 0, PAGE_SIZE, from); if (unlikely(copied < PAGE_SIZE && iov_iter_count(from))) { -- 2.48.1