|
@@ -622,33 +622,34 @@ static bool too_many_pipe_buffers_hard(struct user_struct *user)
|
|
|
struct pipe_inode_info *alloc_pipe_info(void)
|
|
|
{
|
|
|
struct pipe_inode_info *pipe;
|
|
|
+ unsigned long pipe_bufs = PIPE_DEF_BUFFERS;
|
|
|
+ struct user_struct *user = get_current_user();
|
|
|
|
|
|
pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL_ACCOUNT);
|
|
|
- if (pipe) {
|
|
|
- unsigned long pipe_bufs = PIPE_DEF_BUFFERS;
|
|
|
- struct user_struct *user = get_current_user();
|
|
|
-
|
|
|
- if (!too_many_pipe_buffers_hard(user)) {
|
|
|
- if (too_many_pipe_buffers_soft(user))
|
|
|
- pipe_bufs = 1;
|
|
|
- pipe->bufs = kcalloc(pipe_bufs,
|
|
|
- sizeof(struct pipe_buffer),
|
|
|
- GFP_KERNEL_ACCOUNT);
|
|
|
- }
|
|
|
+ if (pipe == NULL)
|
|
|
+ goto out_free_uid;
|
|
|
+
|
|
|
+ if (!too_many_pipe_buffers_hard(user)) {
|
|
|
+ if (too_many_pipe_buffers_soft(user))
|
|
|
+ pipe_bufs = 1;
|
|
|
+ pipe->bufs = kcalloc(pipe_bufs,
|
|
|
+ sizeof(struct pipe_buffer),
|
|
|
+ GFP_KERNEL_ACCOUNT);
|
|
|
+ }
|
|
|
|
|
|
- if (pipe->bufs) {
|
|
|
- init_waitqueue_head(&pipe->wait);
|
|
|
- pipe->r_counter = pipe->w_counter = 1;
|
|
|
- pipe->buffers = pipe_bufs;
|
|
|
- pipe->user = user;
|
|
|
- account_pipe_buffers(user, 0, pipe_bufs);
|
|
|
- mutex_init(&pipe->mutex);
|
|
|
- return pipe;
|
|
|
- }
|
|
|
- free_uid(user);
|
|
|
- kfree(pipe);
|
|
|
+ if (pipe->bufs) {
|
|
|
+ init_waitqueue_head(&pipe->wait);
|
|
|
+ pipe->r_counter = pipe->w_counter = 1;
|
|
|
+ pipe->buffers = pipe_bufs;
|
|
|
+ pipe->user = user;
|
|
|
+ account_pipe_buffers(user, 0, pipe_bufs);
|
|
|
+ mutex_init(&pipe->mutex);
|
|
|
+ return pipe;
|
|
|
}
|
|
|
|
|
|
+ kfree(pipe);
|
|
|
+out_free_uid:
|
|
|
+ free_uid(user);
|
|
|
return NULL;
|
|
|
}
|
|
|
|