aboutsummaryrefslogtreecommitdiffstats
path: root/fs/pipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/pipe.c')
-rw-r--r--fs/pipe.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/fs/pipe.c b/fs/pipe.c
index eaa3c8d36291..83a292464de7 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -629,24 +629,30 @@ struct pipe_inode_info *alloc_pipe_info(void)
629 if (pipe == NULL) 629 if (pipe == NULL)
630 goto out_free_uid; 630 goto out_free_uid;
631 631
632 if (!too_many_pipe_buffers_hard(user)) { 632 account_pipe_buffers(user, 0, pipe_bufs);
633 if (too_many_pipe_buffers_soft(user)) 633
634 pipe_bufs = 1; 634 if (too_many_pipe_buffers_soft(user)) {
635 pipe->bufs = kcalloc(pipe_bufs, 635 account_pipe_buffers(user, pipe_bufs, 1);
636 sizeof(struct pipe_buffer), 636 pipe_bufs = 1;
637 GFP_KERNEL_ACCOUNT);
638 } 637 }
639 638
639 if (too_many_pipe_buffers_hard(user))
640 goto out_revert_acct;
641
642 pipe->bufs = kcalloc(pipe_bufs, sizeof(struct pipe_buffer),
643 GFP_KERNEL_ACCOUNT);
644
640 if (pipe->bufs) { 645 if (pipe->bufs) {
641 init_waitqueue_head(&pipe->wait); 646 init_waitqueue_head(&pipe->wait);
642 pipe->r_counter = pipe->w_counter = 1; 647 pipe->r_counter = pipe->w_counter = 1;
643 pipe->buffers = pipe_bufs; 648 pipe->buffers = pipe_bufs;
644 pipe->user = user; 649 pipe->user = user;
645 account_pipe_buffers(user, 0, pipe_bufs);
646 mutex_init(&pipe->mutex); 650 mutex_init(&pipe->mutex);
647 return pipe; 651 return pipe;
648 } 652 }
649 653
654out_revert_acct:
655 account_pipe_buffers(user, pipe_bufs, 0);
650 kfree(pipe); 656 kfree(pipe);
651out_free_uid: 657out_free_uid:
652 free_uid(user); 658 free_uid(user);