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: Nick Piggin <npiggin@suse.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
5b54470dad
Коммит
8718d36cf9
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче