Commit 4afddd60 authored by Tejun Heo's avatar Tejun Heo Committed by Greg Kroah-Hartman

kernfs: protect lazy kernfs_iattrs allocation with mutex

kernfs_iattrs is allocated lazily when operations which require it
take place; unfortunately, the lazy allocation and returning weren't
properly synchronized and when there are multiple concurrent
operations, it might end up returning kernfs_iattrs which hasn't
finished initialization yet or different copies to different callers.

Fix it by synchronizing with a mutex.  This can be smarter with memory
barriers but let's go there if it actually turns out to be necessary.
Signed-off-by: default avatarTejun Heo <>
Link: default avatarSasha Levin <>
Cc: # 3.14
Signed-off-by: default avatarGreg Kroah-Hartman <>
parent a2a4dc49
......@@ -48,14 +48,18 @@ void __init kernfs_inode_init(void)
static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn)
static DEFINE_MUTEX(iattr_mutex);
struct kernfs_iattrs *ret;
struct iattr *iattrs;
if (kn->iattr)
return kn->iattr;
goto out_unlock;
kn->iattr = kzalloc(sizeof(struct kernfs_iattrs), GFP_KERNEL);
if (!kn->iattr)
return NULL;
goto out_unlock;
iattrs = &kn->iattr->ia_iattr;
/* assign default attributes */
......@@ -65,8 +69,10 @@ static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn)
iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
return kn->iattr;
ret = kn->iattr;
return ret;
static int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)
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