Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afc847b7 authored by Al Viro's avatar Al Viro
Browse files

[PATCH] don't do exit_io_context() until we know we won't be doing any IO



testcase:

mount /dev/sdb10 /mnt
touch /mnt/tmp/b
umount /mnt
mount /dev/sdb10 /mnt
rm /mnt/tmp/b </mnt/tmp/b
umount /mnt

and watch blkdev_ioc line in /proc/slabinfo.  Vanilla kernel leaks.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 60a6dc55
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -807,8 +807,6 @@ fastcall NORET_TYPE void do_exit(long code)
		panic("Attempted to kill the idle task!");
	if (unlikely(tsk->pid == 1))
		panic("Attempted to kill init!");
	if (tsk->io_context)
		exit_io_context();

	if (unlikely(current->ptrace & PT_TRACE_EXIT)) {
		current->ptrace_message = code;
@@ -822,6 +820,8 @@ fastcall NORET_TYPE void do_exit(long code)
	if (unlikely(tsk->flags & PF_EXITING)) {
		printk(KERN_ALERT
			"Fixing recursive fault but reboot is needed!\n");
		if (tsk->io_context)
			exit_io_context();
		set_current_state(TASK_UNINTERRUPTIBLE);
		schedule();
	}
@@ -881,6 +881,9 @@ fastcall NORET_TYPE void do_exit(long code)
	 */
	mutex_debug_check_no_locks_held(tsk);

	if (tsk->io_context)
		exit_io_context();

	/* PF_DEAD causes final put_task_struct after we schedule. */
	preempt_disable();
	BUG_ON(tsk->flags & PF_DEAD);