diff options
-rw-r--r-- | fs/pipe.c | 20 |
1 files changed, 13 insertions, 7 deletions
@@ -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 | ||
654 | out_revert_acct: | ||
655 | account_pipe_buffers(user, pipe_bufs, 0); | ||
650 | kfree(pipe); | 656 | kfree(pipe); |
651 | out_free_uid: | 657 | out_free_uid: |
652 | free_uid(user); | 658 | free_uid(user); |