exec-binfmt_misc-dont-nullify-node-dentry-in-kill_node.patch removed from -mm tree
The patch titled
Subject: exec: binfmt_misc: don't nullify Node->dentry in kill_node()
has been removed from the -mm tree. Its filename was
exec-binfmt_misc-dont-nullify-node-dentry-in-kill_node.patch
This patch was dropped because it was merged into mainline or a subsystem tree
------------------------------------------------------
From: Oleg Nesterov <[email protected]>
Subject: exec: binfmt_misc: don't nullify Node->dentry in kill_node()
kill_node() nullifies/checks Node->dentry to avoid double free. This complicates the next changes and this is very confusing:
- we do not need to check dentry != NULL under entries_lock, kill_node() is always called under inode_lock(d_inode(root)) and we rely on this inode_lock() anyway, without this lock the MISC_FMT_OPEN_FILE cleanup could race with itself.
- if kill_inode() was already called and ->dentry == NULL we should not even try to close e->interp_file.
We can change bm_entry_write() to simply check !list_empty(list) before kill_node. Again, we rely on inode_lock(), in particular it saves us from the race with bm_status_write(), another caller of kill_node().
---
fs/binfmt_misc.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-)
fs/binfmt_misc.c renamed from fs/binfmt_misc.c~exec-binfmt_misc-dont-nullify-node-dentry-in-kill_node +9 -13
@@ -603,11 +603,7 @@ static void kill_node(Node *e)struct dentry *dentry;write_lock (&entries_lock); - dentry = e->dentry; -if (dentry) { -list_del_init (&e->list); - e->dentry =NULL ; - } +list_del_init (&e->list);write_unlock (&entries_lock);if ((e->flags &MISC_FMT_OPEN_FILE ) && e->interp_file) {
@@ -615,12 +611,11 @@ static void kill_node(Node *e) e->interp_file =NULL ; } -if (dentry) { -drop_nlink (d_inode (dentry)); -d_drop (dentry); -dput (dentry); -simple_release_fs (&bm_mnt, &entry_count); - } + dentry = e->dentry; +drop_nlink (d_inode (dentry)); +d_drop (dentry); +dput (dentry); +simple_release_fs (&bm_mnt, &entry_count); }/* /<entry> */
@@ -665,7 +660,8 @@ static ssize_t bm_entry_write(struct fil root =file_inode (file)->i_sb->s_root;inode_lock (d_inode (root)); -kill_node (e); +if (!list_empty (&e->list)) +kill_node (e);inode_unlock (d_inode (root));break ;
@@ -794,7 +790,7 @@ static ssize_t bm_status_write(struct fiinode_lock (d_inode (root));while (!list_empty (&entries)) -kill_node (list_entry (entries.next, Node, list)); +kill_node (list_first_entry (&entries, Node, list));inode_unlock (d_inode (root));break ;
_
Patches currently in -mm which might be from [email protected] are