diff options
author | Tejun Heo <tj@kernel.org> | 2013-11-23 17:40:01 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-12-04 10:34:45 -0500 |
commit | 9a8049affd55a2c857a89faece27b878416fbf91 (patch) | |
tree | 721a52df9028ce8008736ad85738c73c6f0e4e82 | |
parent | e756bc5670d0f801ca43dc55b8eacde42a5b818b (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.c | 60 | ||||
-rw-r--r-- | fs/kernfs/kernfs-internal.h | 6 |
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 | ||
46 | static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd) | 46 | static 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 | ||
65 | static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr) | 67 | static 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: | |||
143 | static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata, | 139 | static 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 | ||
217 | static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode) | 210 | static 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 | ||
20 | struct sysfs_inode_attrs { | 20 | struct 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 |