Commit 75de46b9 authored by Nick Piggin's avatar Nick Piggin Committed by Greg Kroah-Hartman

fix setattr error handling in sysfs, configfs

sysfs and configfs setattr functions have error cases after the generic inode's
attributes have been changed. Fix consistency by changing the generic inode
attributes only when it is guaranteed to succeed.
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Acked-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 743db2d9
...@@ -72,10 +72,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) ...@@ -72,10 +72,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
if (!sd) if (!sd)
return -EINVAL; return -EINVAL;
error = simple_setattr(dentry, iattr);
if (error)
return error;
sd_iattr = sd->s_iattr; sd_iattr = sd->s_iattr;
if (!sd_iattr) { if (!sd_iattr) {
/* setting attributes for the first time, allocate now */ /* setting attributes for the first time, allocate now */
...@@ -89,9 +85,12 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) ...@@ -89,9 +85,12 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME; sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME;
sd->s_iattr = sd_iattr; sd->s_iattr = sd_iattr;
} }
/* attributes were changed atleast once in past */ /* attributes were changed atleast once in past */
error = simple_setattr(dentry, iattr);
if (error)
return error;
if (ia_valid & ATTR_UID) if (ia_valid & ATTR_UID)
sd_iattr->ia_uid = iattr->ia_uid; sd_iattr->ia_uid = iattr->ia_uid;
if (ia_valid & ATTR_GID) if (ia_valid & ATTR_GID)
......
...@@ -117,11 +117,13 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr) ...@@ -117,11 +117,13 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
if (error) if (error)
goto out; goto out;
error = sysfs_sd_setattr(sd, iattr);
if (error)
goto out;
/* this ignores size changes */ /* this ignores size changes */
generic_setattr(inode, iattr); generic_setattr(inode, iattr);
error = sysfs_sd_setattr(sd, iattr);
out: out:
mutex_unlock(&sysfs_mutex); mutex_unlock(&sysfs_mutex);
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment