diff options
Diffstat (limited to 'fs/kernfs/inode.c')
| -rw-r--r-- | fs/kernfs/inode.c | 14 | 
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)  | 
