Commit 9137eda5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'configfs-5.17-2022-02-25' of git://git.infradead.org/users/hch/configfs

Pull configfs fix from Christoph Hellwig:

 - fix a race in configfs_{,un}register_subsystem (ChenXiaoSong)

* tag 'configfs-5.17-2022-02-25' of git://git.infradead.org/users/hch/configfs:
  configfs: fix a race in configfs_{,un}register_subsystem()
parents c0419188 84ec758f
...@@ -34,6 +34,14 @@ ...@@ -34,6 +34,14 @@
*/ */
DEFINE_SPINLOCK(configfs_dirent_lock); DEFINE_SPINLOCK(configfs_dirent_lock);
/*
* All of link_obj/unlink_obj/link_group/unlink_group require that
* subsys->su_mutex is held.
* But parent configfs_subsystem is NULL when config_item is root.
* Use this mutex when config_item is root.
*/
static DEFINE_MUTEX(configfs_subsystem_mutex);
static void configfs_d_iput(struct dentry * dentry, static void configfs_d_iput(struct dentry * dentry,
struct inode * inode) struct inode * inode)
{ {
...@@ -1859,7 +1867,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) ...@@ -1859,7 +1867,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
group->cg_item.ci_name = group->cg_item.ci_namebuf; group->cg_item.ci_name = group->cg_item.ci_namebuf;
sd = root->d_fsdata; sd = root->d_fsdata;
mutex_lock(&configfs_subsystem_mutex);
link_group(to_config_group(sd->s_element), group); link_group(to_config_group(sd->s_element), group);
mutex_unlock(&configfs_subsystem_mutex);
inode_lock_nested(d_inode(root), I_MUTEX_PARENT); inode_lock_nested(d_inode(root), I_MUTEX_PARENT);
...@@ -1884,7 +1894,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) ...@@ -1884,7 +1894,9 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
inode_unlock(d_inode(root)); inode_unlock(d_inode(root));
if (err) { if (err) {
mutex_lock(&configfs_subsystem_mutex);
unlink_group(group); unlink_group(group);
mutex_unlock(&configfs_subsystem_mutex);
configfs_release_fs(); configfs_release_fs();
} }
put_fragment(frag); put_fragment(frag);
...@@ -1931,7 +1943,9 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) ...@@ -1931,7 +1943,9 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys)
dput(dentry); dput(dentry);
mutex_lock(&configfs_subsystem_mutex);
unlink_group(group); unlink_group(group);
mutex_unlock(&configfs_subsystem_mutex);
configfs_release_fs(); configfs_release_fs();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment