Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8718d36c authored by Nick Piggin's avatar Nick Piggin Committed by Al Viro
Browse files

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>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5b54470d
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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 */
@@ -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)
+4 −2
Original line number Diff line number Diff line
@@ -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;