diff options
author | Nick Piggin <npiggin@suse.de> | 2010-05-31 03:58:02 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-06-04 16:27:53 -0400 |
commit | 75de46b98dda624397ccb17c106e51f478a79c15 (patch) | |
tree | 8c4cf43eb8f840e84a48d387928673bcccd03d66 /fs | |
parent | 743db2d903bc4e963a31496328d847d69f75047c (diff) |
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>
Acked-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/configfs/inode.c | 9 | ||||
-rw-r--r-- | fs/sysfs/inode.c | 6 |
2 files changed, 8 insertions, 7 deletions
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index 41645142b88b..cf78d44a8d6a 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c | |||
@@ -72,10 +72,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) | |||
72 | if (!sd) | 72 | if (!sd) |
73 | return -EINVAL; | 73 | return -EINVAL; |
74 | 74 | ||
75 | error = simple_setattr(dentry, iattr); | ||
76 | if (error) | ||
77 | return error; | ||
78 | |||
79 | sd_iattr = sd->s_iattr; | 75 | sd_iattr = sd->s_iattr; |
80 | if (!sd_iattr) { | 76 | if (!sd_iattr) { |
81 | /* setting attributes for the first time, allocate now */ | 77 | /* setting attributes for the first time, allocate now */ |
@@ -89,9 +85,12 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) | |||
89 | sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME; | 85 | sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME; |
90 | sd->s_iattr = sd_iattr; | 86 | sd->s_iattr = sd_iattr; |
91 | } | 87 | } |
92 | |||
93 | /* attributes were changed atleast once in past */ | 88 | /* attributes were changed atleast once in past */ |
94 | 89 | ||
90 | error = simple_setattr(dentry, iattr); | ||
91 | if (error) | ||
92 | return error; | ||
93 | |||
95 | if (ia_valid & ATTR_UID) | 94 | if (ia_valid & ATTR_UID) |
96 | sd_iattr->ia_uid = iattr->ia_uid; | 95 | sd_iattr->ia_uid = iattr->ia_uid; |
97 | if (ia_valid & ATTR_GID) | 96 | if (ia_valid & ATTR_GID) |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index bde1a4c3679a..0835a3b70e03 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -117,11 +117,13 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr) | |||
117 | if (error) | 117 | if (error) |
118 | goto out; | 118 | goto out; |
119 | 119 | ||
120 | error = sysfs_sd_setattr(sd, iattr); | ||
121 | if (error) | ||
122 | goto out; | ||
123 | |||
120 | /* this ignores size changes */ | 124 | /* this ignores size changes */ |
121 | generic_setattr(inode, iattr); | 125 | generic_setattr(inode, iattr); |
122 | 126 | ||
123 | error = sysfs_sd_setattr(sd, iattr); | ||
124 | |||
125 | out: | 127 | out: |
126 | mutex_unlock(&sysfs_mutex); | 128 | mutex_unlock(&sysfs_mutex); |
127 | return error; | 129 | return error; |