aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-11-23 17:40:01 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-04 10:34:45 -0500
commit9a8049affd55a2c857a89faece27b878416fbf91 (patch)
tree721a52df9028ce8008736ad85738c73c6f0e4e82
parente756bc5670d0f801ca43dc55b8eacde42a5b818b (diff)
kernfs: update sysfs_init_inode_attrs()
sysfs_init_inode_attrs() is a bit clumsy to use requiring the caller to check whether @sd->s_iattr is already set or not. Rename it to sysfs_inode_attrs(), update it to check whether @sd->s_iattr is already initialized before trying to initialize it and return @sd->s_iattr. This simplifies the callers. While at it, * Rename struct sysfs_inode_attrs pointer variables to "attrs". As kernfs no longer deals with "struct attribute", this isn't confusing and makes it easier to distinguish from struct iattr pointers. * A new field will be added to sysfs_inode_attrs. Reindent in preparation. This patch doesn't introduce any behavior changes. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/kernfs/inode.c60
-rw-r--r--fs/kernfs/kernfs-internal.h6
2 files changed, 29 insertions, 37 deletions
diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c
index b4cae6fd717b..a1f83825afca 100644
--- a/fs/kernfs/inode.c
+++ b/fs/kernfs/inode.c
@@ -43,15 +43,17 @@ void __init sysfs_inode_init(void)
43 panic("failed to init sysfs_backing_dev_info"); 43 panic("failed to init sysfs_backing_dev_info");
44} 44}
45 45
46static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd) 46static struct sysfs_inode_attrs *sysfs_inode_attrs(struct sysfs_dirent *sd)
47{ 47{
48 struct sysfs_inode_attrs *attrs;
49 struct iattr *iattrs; 48 struct iattr *iattrs;
50 49
51 attrs = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL); 50 if (sd->s_iattr)
52 if (!attrs) 51 return sd->s_iattr;
52
53 sd->s_iattr = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL);
54 if (!sd->s_iattr)
53 return NULL; 55 return NULL;
54 iattrs = &attrs->ia_iattr; 56 iattrs = &sd->s_iattr->ia_iattr;
55 57
56 /* assign default attributes */ 58 /* assign default attributes */
57 iattrs->ia_mode = sd->s_mode; 59 iattrs->ia_mode = sd->s_mode;
@@ -59,26 +61,20 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
59 iattrs->ia_gid = GLOBAL_ROOT_GID; 61 iattrs->ia_gid = GLOBAL_ROOT_GID;
60 iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME; 62 iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
61 63
62 return attrs; 64 return sd->s_iattr;
63} 65}
64 66
65static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr) 67static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr)
66{ 68{
67 struct sysfs_inode_attrs *sd_attrs; 69 struct sysfs_inode_attrs *attrs;
68 struct iattr *iattrs; 70 struct iattr *iattrs;
69 unsigned int ia_valid = iattr->ia_valid; 71 unsigned int ia_valid = iattr->ia_valid;
70 72
71 sd_attrs = sd->s_iattr; 73 attrs = sysfs_inode_attrs(sd);
74 if (!attrs)
75 return -ENOMEM;
72 76
73 if (!sd_attrs) { 77 iattrs = &attrs->ia_iattr;
74 /* setting attributes for the first time, allocate now */
75 sd_attrs = sysfs_init_inode_attrs(sd);
76 if (!sd_attrs)
77 return -ENOMEM;
78 sd->s_iattr = sd_attrs;
79 }
80 /* attributes were changed at least once in past */
81 iattrs = &sd_attrs->ia_iattr;
82 78
83 if (ia_valid & ATTR_UID) 79 if (ia_valid & ATTR_UID)
84 iattrs->ia_uid = iattr->ia_uid; 80 iattrs->ia_uid = iattr->ia_uid;
@@ -143,22 +139,19 @@ out:
143static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata, 139static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata,
144 u32 *secdata_len) 140 u32 *secdata_len)
145{ 141{
146 struct sysfs_inode_attrs *iattrs; 142 struct sysfs_inode_attrs *attrs;
147 void *old_secdata; 143 void *old_secdata;
148 size_t old_secdata_len; 144 size_t old_secdata_len;
149 145
150 if (!sd->s_iattr) { 146 attrs = sysfs_inode_attrs(sd);
151 sd->s_iattr = sysfs_init_inode_attrs(sd); 147 if (!attrs)
152 if (!sd->s_iattr) 148 return -ENOMEM;
153 return -ENOMEM;
154 }
155 149
156 iattrs = sd->s_iattr; 150 old_secdata = attrs->ia_secdata;
157 old_secdata = iattrs->ia_secdata; 151 old_secdata_len = attrs->ia_secdata_len;
158 old_secdata_len = iattrs->ia_secdata_len;
159 152
160 iattrs->ia_secdata = *secdata; 153 attrs->ia_secdata = *secdata;
161 iattrs->ia_secdata_len = *secdata_len; 154 attrs->ia_secdata_len = *secdata_len;
162 155
163 *secdata = old_secdata; 156 *secdata = old_secdata;
164 *secdata_len = old_secdata_len; 157 *secdata_len = old_secdata_len;
@@ -216,17 +209,16 @@ static inline void set_inode_attr(struct inode *inode, struct iattr *iattr)
216 209
217static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode) 210static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
218{ 211{
219 struct sysfs_inode_attrs *iattrs = sd->s_iattr; 212 struct sysfs_inode_attrs *attrs = sd->s_iattr;
220 213
221 inode->i_mode = sd->s_mode; 214 inode->i_mode = sd->s_mode;
222 if (iattrs) { 215 if (attrs) {
223 /* sysfs_dirent has non-default attributes 216 /* sysfs_dirent has non-default attributes
224 * get them from persistent copy in sysfs_dirent 217 * get them from persistent copy in sysfs_dirent
225 */ 218 */
226 set_inode_attr(inode, &iattrs->ia_iattr); 219 set_inode_attr(inode, &attrs->ia_iattr);
227 security_inode_notifysecctx(inode, 220 security_inode_notifysecctx(inode, attrs->ia_secdata,
228 iattrs->ia_secdata, 221 attrs->ia_secdata_len);
229 iattrs->ia_secdata_len);
230 } 222 }
231 223
232 if (sysfs_type(sd) == SYSFS_DIR) 224 if (sysfs_type(sd) == SYSFS_DIR)
diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h
index d1ff591c5cf3..f25b3548bcca 100644
--- a/fs/kernfs/kernfs-internal.h
+++ b/fs/kernfs/kernfs-internal.h
@@ -18,9 +18,9 @@
18#include <linux/kernfs.h> 18#include <linux/kernfs.h>
19 19
20struct sysfs_inode_attrs { 20struct sysfs_inode_attrs {
21 struct iattr ia_iattr; 21 struct iattr ia_iattr;
22 void *ia_secdata; 22 void *ia_secdata;
23 u32 ia_secdata_len; 23 u32 ia_secdata_len;
24}; 24};
25 25
26#define SD_DEACTIVATED_BIAS INT_MIN 26#define SD_DEACTIVATED_BIAS INT_MIN