aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs/kernfs/inode.c
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2014-05-05 12:27:30 -0700
committerMark Brown <broonie@linaro.org>2014-05-05 12:27:30 -0700
commitaf46929e6ee7197dfe315af3c5bb5cc75a0aec9c (patch)
tree18359b934daf8c7e271930c938bd867a379cace7 /fs/kernfs/inode.c
parentASoC: fsl_spdif: Use clk_set_rate() for spdif root clock only (diff)
parentLinux 3.15-rc4 (diff)
downloadwireguard-linux-af46929e6ee7197dfe315af3c5bb5cc75a0aec9c.tar.xz
wireguard-linux-af46929e6ee7197dfe315af3c5bb5cc75a0aec9c.zip
Merge tag 'v3.15-rc4' into asoc-fsl-spdif
Linux 3.15-rc4
Diffstat (limited to 'fs/kernfs/inode.c')
-rw-r--r--fs/kernfs/inode.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c
index abb0f1f53d93..985217626e66 100644
--- a/fs/kernfs/inode.c
+++ b/fs/kernfs/inode.c
@@ -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;
+ mutex_lock(&iattr_mutex);
+
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;
simple_xattrs_init(&kn->iattr->xattrs);
-
- return kn->iattr;
+out_unlock:
+ ret = kn->iattr;
+ mutex_unlock(&iattr_mutex);
+ return ret;
}
static int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)