fs/file_table.c:fput(): add comment
authorAndrew Morton <akpm@linux-foundation.org>
Mon, 8 Jul 2013 21:24:15 +0000 (14:24 -0700)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 Jul 2013 09:27:42 +0000 (13:27 +0400)
A missed update to "fput: task_work_add() can fail if the caller has
passed exit_task_work()".

Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrey Vagin <avagin@openvz.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/file_table.c

index 08e719b884ca31320bbcded23f6963ae0268779d..b9a77ad08b4d305c149a7d891b4a95d0e3538bff 100644 (file)
@@ -313,6 +313,12 @@ void fput(struct file *file)
                        init_task_work(&file->f_u.fu_rcuhead, ____fput);
                        if (!task_work_add(task, &file->f_u.fu_rcuhead, true))
                                return;
+                       /*
+                        * After this task has run exit_task_work(),
+                        * task_work_add() will fail.  free_ipc_ns()->
+                        * shm_destroy() can do this.  Fall through to delayed
+                        * fput to avoid leaking *file.
+                        */
                }
                spin_lock_irqsave(&delayed_fput_lock, flags);
                list_add(&file->f_u.fu_list, &delayed_fput_list);