|
@@ -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)
|