Skip to content

Commit

Permalink
fix setattr error handling in sysfs, configfs
Browse files Browse the repository at this point in the history
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: Nick Piggin <npiggin@suse.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Nick Piggin authored and Al Viro committed Jun 4, 2010
1 parent 5b54470 commit 8718d36
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 7 deletions.
9 changes: 4 additions & 5 deletions fs/configfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
if (!sd)
return -EINVAL;

error = simple_setattr(dentry, iattr);
if (error)
return error;

sd_iattr = sd->s_iattr;
if (!sd_iattr) {
/* setting attributes for the first time, allocate now */
Expand All @@ -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->s_iattr = sd_iattr;
}

/* attributes were changed atleast once in past */

error = simple_setattr(dentry, iattr);
if (error)
return error;

if (ia_valid & ATTR_UID)
sd_iattr->ia_uid = iattr->ia_uid;
if (ia_valid & ATTR_GID)
Expand Down
6 changes: 4 additions & 2 deletions fs/sysfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,13 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
if (error)
goto out;

error = sysfs_sd_setattr(sd, iattr);
if (error)
goto out;

/* this ignores size changes */
generic_setattr(inode, iattr);

error = sysfs_sd_setattr(sd, iattr);

out:
mutex_unlock(&sysfs_mutex);
return error;
Expand Down

0 comments on commit 8718d36

Please sign in to comment.