On Wed, Jul 29, 2020 at 10:04:45PM +0900, Tetsuo Handa wrote: > __fput_sync() was introduced by commit 4a9d4b024a3102fc ("switch fput to > task_work_add") with BUG_ON(!(current->flags & PF_KTHREAD)) check, and > the only user of __fput_sync() was introduced by commit 17c0a5aaffa63da6 > ("make acct_kill() wait for file closing."). However, the latter commit is > effectively calling __fput_sync() from !PF_KTHREAD thread because of > schedule_work() call followed by immediate wait_for_completion() call. > That is, there is no need to defer close_work() to a WQ context. I guess > that the reason to defer was nothing but to bypass this BUG_ON() check. > While we need to remain careful about calling __fput_sync(), we can remove > bypassable BUG_ON() check from __fput_sync(). > > If this change is accepted, racy fput()+flush_delayed_fput() introduced > by commit e2dc9bf3f5275ca3 ("umd: Transform fork_usermode_blob into > fork_usermode_driver") will be replaced by this raceless __fput_sync(). NAK. The reason to defer is *NOT* to bypass that BUG_ON() - we really do not want that thing done on anything other than extremely shallow stack. Incidentally, why is that thing ever done _not_ in a kernel thread context?