|
@@ -43,15 +43,17 @@ void __init sysfs_inode_init(void)
|
|
|
panic("failed to init sysfs_backing_dev_info");
|
|
|
}
|
|
|
|
|
|
-static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
|
|
|
+static struct sysfs_inode_attrs *sysfs_inode_attrs(struct sysfs_dirent *sd)
|
|
|
{
|
|
|
- struct sysfs_inode_attrs *attrs;
|
|
|
struct iattr *iattrs;
|
|
|
|
|
|
- attrs = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL);
|
|
|
- if (!attrs)
|
|
|
+ if (sd->s_iattr)
|
|
|
+ return sd->s_iattr;
|
|
|
+
|
|
|
+ sd->s_iattr = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL);
|
|
|
+ if (!sd->s_iattr)
|
|
|
return NULL;
|
|
|
- iattrs = &attrs->ia_iattr;
|
|
|
+ iattrs = &sd->s_iattr->ia_iattr;
|
|
|
|
|
|
/* assign default attributes */
|
|
|
iattrs->ia_mode = sd->s_mode;
|
|
@@ -59,26 +61,20 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
|
|
|
iattrs->ia_gid = GLOBAL_ROOT_GID;
|
|
|
iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
|
|
|
|
|
|
- return attrs;
|
|
|
+ return sd->s_iattr;
|
|
|
}
|
|
|
|
|
|
static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr)
|
|
|
{
|
|
|
- struct sysfs_inode_attrs *sd_attrs;
|
|
|
+ struct sysfs_inode_attrs *attrs;
|
|
|
struct iattr *iattrs;
|
|
|
unsigned int ia_valid = iattr->ia_valid;
|
|
|
|
|
|
- sd_attrs = sd->s_iattr;
|
|
|
+ attrs = sysfs_inode_attrs(sd);
|
|
|
+ if (!attrs)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- if (!sd_attrs) {
|
|
|
- /* setting attributes for the first time, allocate now */
|
|
|
- sd_attrs = sysfs_init_inode_attrs(sd);
|
|
|
- if (!sd_attrs)
|
|
|
- return -ENOMEM;
|
|
|
- sd->s_iattr = sd_attrs;
|
|
|
- }
|
|
|
- /* attributes were changed at least once in past */
|
|
|
- iattrs = &sd_attrs->ia_iattr;
|
|
|
+ iattrs = &attrs->ia_iattr;
|
|
|
|
|
|
if (ia_valid & ATTR_UID)
|
|
|
iattrs->ia_uid = iattr->ia_uid;
|
|
@@ -143,22 +139,19 @@ out:
|
|
|
static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata,
|
|
|
u32 *secdata_len)
|
|
|
{
|
|
|
- struct sysfs_inode_attrs *iattrs;
|
|
|
+ struct sysfs_inode_attrs *attrs;
|
|
|
void *old_secdata;
|
|
|
size_t old_secdata_len;
|
|
|
|
|
|
- if (!sd->s_iattr) {
|
|
|
- sd->s_iattr = sysfs_init_inode_attrs(sd);
|
|
|
- if (!sd->s_iattr)
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
+ attrs = sysfs_inode_attrs(sd);
|
|
|
+ if (!attrs)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- iattrs = sd->s_iattr;
|
|
|
- old_secdata = iattrs->ia_secdata;
|
|
|
- old_secdata_len = iattrs->ia_secdata_len;
|
|
|
+ old_secdata = attrs->ia_secdata;
|
|
|
+ old_secdata_len = attrs->ia_secdata_len;
|
|
|
|
|
|
- iattrs->ia_secdata = *secdata;
|
|
|
- iattrs->ia_secdata_len = *secdata_len;
|
|
|
+ attrs->ia_secdata = *secdata;
|
|
|
+ attrs->ia_secdata_len = *secdata_len;
|
|
|
|
|
|
*secdata = old_secdata;
|
|
|
*secdata_len = old_secdata_len;
|
|
@@ -216,17 +209,16 @@ static inline void set_inode_attr(struct inode *inode, struct iattr *iattr)
|
|
|
|
|
|
static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
|
|
|
{
|
|
|
- struct sysfs_inode_attrs *iattrs = sd->s_iattr;
|
|
|
+ struct sysfs_inode_attrs *attrs = sd->s_iattr;
|
|
|
|
|
|
inode->i_mode = sd->s_mode;
|
|
|
- if (iattrs) {
|
|
|
+ if (attrs) {
|
|
|
/* sysfs_dirent has non-default attributes
|
|
|
* get them from persistent copy in sysfs_dirent
|
|
|
*/
|
|
|
- set_inode_attr(inode, &iattrs->ia_iattr);
|
|
|
- security_inode_notifysecctx(inode,
|
|
|
- iattrs->ia_secdata,
|
|
|
- iattrs->ia_secdata_len);
|
|
|
+ set_inode_attr(inode, &attrs->ia_iattr);
|
|
|
+ security_inode_notifysecctx(inode, attrs->ia_secdata,
|
|
|
+ attrs->ia_secdata_len);
|
|
|
}
|
|
|
|
|
|
if (sysfs_type(sd) == SYSFS_DIR)
|