You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
watch_queue, pipe: Free watchqueue state after clearing pipe ring
commitdb8facfc9fupstream. In free_pipe_info(), free the watchqueue state after clearing the pipe ring as each pipe ring descriptor has a release function, and in the case of a notification message, this is watch_queue_pipe_buf_release() which tries to mark the allocation bitmap that was previously released. Fix this by moving the put of the pipe's ref on the watch queue to after the ring has been cleared. We still need to call watch_queue_clear() before doing that to make sure that the pipe is disconnected from any notification sources first. Fixes:c73be61ced("pipe: Add general notification queue support") Reported-by: Jann Horn <jannh@google.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
573a3228ca
commit
d729d4e99f
@@ -830,10 +830,8 @@ void free_pipe_info(struct pipe_inode_info *pipe)
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (pipe->watch_queue) {
|
||||
if (pipe->watch_queue)
|
||||
watch_queue_clear(pipe->watch_queue);
|
||||
put_watch_queue(pipe->watch_queue);
|
||||
}
|
||||
#endif
|
||||
|
||||
(void) account_pipe_buffers(pipe->user, pipe->nr_accounted, 0);
|
||||
@@ -843,6 +841,10 @@ void free_pipe_info(struct pipe_inode_info *pipe)
|
||||
if (buf->ops)
|
||||
pipe_buf_release(pipe, buf);
|
||||
}
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (pipe->watch_queue)
|
||||
put_watch_queue(pipe->watch_queue);
|
||||
#endif
|
||||
if (pipe->tmp_page)
|
||||
__free_page(pipe->tmp_page);
|
||||
kfree(pipe->bufs);
|
||||
|
||||
Reference in New Issue
Block a user