head = pipe->head;
                if (!pipe_full(head, pipe->tail, pipe->max_usage)) {
-                       unsigned int mask = pipe->ring_size - 1;
                        struct pipe_buffer *buf;
 -                      struct page *page = pipe->tmp_page;
 +                      struct page *page;
                        int copied;
  
 -                      if (!page) {
 -                              page = alloc_page(GFP_HIGHUSER | __GFP_ACCOUNT);
 -                              if (unlikely(!page)) {
 -                                      ret = ret ? : -ENOMEM;
 -                                      break;
 -                              }
 -                              pipe->tmp_page = page;
 +                      page = anon_pipe_get_page(pipe);
 +                      if (unlikely(!page)) {
 +                              if (!ret)
 +                                      ret = -ENOMEM;
 +                              break;
                        }
  
 -                      /* Allocate a slot in the ring in advance and attach an
 -                       * empty buffer.  If we fault or otherwise fail to use
 -                       * it, either the reader will consume it or it'll still
 -                       * be there for the next write.
 -                       */
 -                      pipe->head = head + 1;
 +                      copied = copy_page_from_iter(page, 0, PAGE_SIZE, from);
 +                      if (unlikely(copied < PAGE_SIZE && iov_iter_count(from))) {
 +                              anon_pipe_put_page(pipe, page);
 +                              if (!ret)
 +                                      ret = -EFAULT;
 +                              break;
 +                      }
  
 +                      pipe->head = head + 1;
                        /* Insert it into the buffer array */
-                       buf = &pipe->bufs[head & mask];
+                       buf = pipe_buf(pipe, head);
                        buf->page = page;
                        buf->ops = &anon_pipe_buf_ops;
                        buf->offset = 0;