exec-binfmt_misc-shift-filp_closeinterp_file-from-kill_node-to-bm_evict_inode.patch removed from -mm tree
The patch titled
Subject: exec: binfmt_misc: shift filp_close(interp_file) from kill_node() to bm_evict_inode()
has been removed from the -mm tree. Its filename was
exec-binfmt_misc-shift-filp_closeinterp_file-from-kill_node-to-bm_evict_inode.patch
This patch was dropped because it was merged into mainline or a subsystem tree
------------------------------------------------------
From: Oleg Nesterov <[email protected]>
Subject: exec: binfmt_misc: shift filp_close(interp_file) from kill_node() to bm_evict_inode()
To ensure that load_misc_binary() can't use the partially destroyed Node, see also the next patch.
The current logic looks wrong in any case, once we close interp_file it doesn't make any sense to delay kfree(inode->i_private), this Node is no longer valid. Even if the MISC_FMT_OPEN_FILE/interp_file checks were not racy (they are), load_misc_binary() should not try to reopen ->interpreter if MISC_FMT_OPEN_FILE is set but ->interp_file is NULL.
And I can't understand why do we use filp_close(), not fput().
---
fs/binfmt_misc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/binfmt_misc.c renamed from fs/binfmt_misc.c~exec-binfmt_misc-shift-filp_closeinterp_file-from-kill_node-to-bm_evict_inode +6 -5
@@ -594,8 +594,13 @@ static struct inode *bm_get_inode(structstatic void bm_evict_inode (struct inode *inode) { +Node *e = inode->i_private; + +if ((e->flags &MISC_FMT_OPEN_FILE ) && e->interp_file) +filp_close (e->interp_file,NULL ); +clear_inode (inode); -kfree (inode->i_private); +kfree (e); }static void kill_node (Node *e)
@@ -606,11 +611,6 @@ static void kill_node(Node *e)list_del_init (&e->list);write_unlock (&entries_lock); -if ((e->flags &MISC_FMT_OPEN_FILE ) && e->interp_file) { -filp_close (e->interp_file,NULL ); - e->interp_file =NULL ; - }