|
@@ -65,30 +65,14 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
|
|
return attrs;
|
|
return attrs;
|
|
}
|
|
}
|
|
|
|
|
|
-int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
|
|
|
|
|
|
+int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr * iattr)
|
|
{
|
|
{
|
|
- struct inode * inode = dentry->d_inode;
|
|
|
|
- struct sysfs_dirent * sd = dentry->d_fsdata;
|
|
|
|
struct sysfs_inode_attrs *sd_attrs;
|
|
struct sysfs_inode_attrs *sd_attrs;
|
|
struct iattr *iattrs;
|
|
struct iattr *iattrs;
|
|
unsigned int ia_valid = iattr->ia_valid;
|
|
unsigned int ia_valid = iattr->ia_valid;
|
|
- int error;
|
|
|
|
-
|
|
|
|
- if (!sd)
|
|
|
|
- return -EINVAL;
|
|
|
|
|
|
|
|
sd_attrs = sd->s_iattr;
|
|
sd_attrs = sd->s_iattr;
|
|
|
|
|
|
- error = inode_change_ok(inode, iattr);
|
|
|
|
- if (error)
|
|
|
|
- return error;
|
|
|
|
-
|
|
|
|
- iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
|
|
|
|
-
|
|
|
|
- error = inode_setattr(inode, iattr);
|
|
|
|
- if (error)
|
|
|
|
- return error;
|
|
|
|
-
|
|
|
|
if (!sd_attrs) {
|
|
if (!sd_attrs) {
|
|
/* setting attributes for the first time, allocate now */
|
|
/* setting attributes for the first time, allocate now */
|
|
sd_attrs = sysfs_init_inode_attrs(sd);
|
|
sd_attrs = sysfs_init_inode_attrs(sd);
|
|
@@ -111,12 +95,39 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
|
|
iattrs->ia_ctime = iattr->ia_ctime;
|
|
iattrs->ia_ctime = iattr->ia_ctime;
|
|
if (ia_valid & ATTR_MODE) {
|
|
if (ia_valid & ATTR_MODE) {
|
|
umode_t mode = iattr->ia_mode;
|
|
umode_t mode = iattr->ia_mode;
|
|
-
|
|
|
|
- if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
|
|
|
|
- mode &= ~S_ISGID;
|
|
|
|
iattrs->ia_mode = sd->s_mode = mode;
|
|
iattrs->ia_mode = sd->s_mode = mode;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
|
|
|
+{
|
|
|
|
+ struct inode *inode = dentry->d_inode;
|
|
|
|
+ struct sysfs_dirent *sd = dentry->d_fsdata;
|
|
|
|
+ int error;
|
|
|
|
+
|
|
|
|
+ if (!sd)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ error = inode_change_ok(inode, iattr);
|
|
|
|
+ if (error)
|
|
|
|
+ return error;
|
|
|
|
+
|
|
|
|
+ iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
|
|
|
|
+ if (iattr->ia_valid & ATTR_MODE) {
|
|
|
|
+ if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
|
|
|
|
+ iattr->ia_mode &= ~S_ISGID;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ error = inode_setattr(inode, iattr);
|
|
|
|
+ if (error)
|
|
|
|
+ return error;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&sysfs_mutex);
|
|
|
|
+ error = sysfs_sd_setattr(sd, iattr);
|
|
|
|
+ mutex_unlock(&sysfs_mutex);
|
|
|
|
+
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|