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 */ 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; }
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; mutex_lock(&sysfs_mutex); error = inode_change_ok(inode, iattr); if (error) goto out; error = sysfs_sd_setattr(sd, iattr); if (error) goto out; /* this ignores size changes */ setattr_copy(inode, iattr); out: mutex_unlock(&sysfs_mutex); return error; }
int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) { struct sysfs_dirent *sd; struct iattr newattrs; int rc; mutex_lock(&sysfs_mutex); rc = -ENOENT; sd = sysfs_find_dirent(kobj->sd, NULL, attr->name); if (!sd) goto out; newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO); newattrs.ia_valid = ATTR_MODE; rc = sysfs_sd_setattr(sd, &newattrs); out: mutex_unlock(&sysfs_mutex); return rc; }