summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-11-23 23:40:01 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-04 16:34:45 +0100
commit9a8049affd55a2c857a89faece27b878416fbf91 (patch)
tree721a52df9028ce8008736ad85738c73c6f0e4e82
parentkobject: fix kset sample error path (diff)
downloadlinux-9a8049affd55a2c857a89faece27b878416fbf91.tar.xz
linux-9a8049affd55a2c857a89faece27b878416fbf91.zip
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)
panic("failed to init sysfs_backing_dev_info");
}
-static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
+static struct sysfs_inode_attrs *sysfs_inode_attrs(struct sysfs_dirent *sd)
{
- struct sysfs_inode_attrs *attrs;
struct iattr *iattrs;
- attrs = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL);
- if (!attrs)
+ if (sd->s_iattr)
+ return sd->s_iattr;
+
+ sd->s_iattr = kzalloc(sizeof(struct sysfs_inode_attrs), GFP_KERNEL);
+ if (!sd->s_iattr)
return NULL;
- iattrs = &attrs->ia_iattr;
+ iattrs = &sd->s_iattr->ia_iattr;
/* assign default attributes */
iattrs->ia_mode = sd->s_mode;
@@ -59,26 +61,20 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
iattrs->ia_gid = GLOBAL_ROOT_GID;
iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
- return attrs;
+ return sd->s_iattr;
}
static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr)
{
- struct sysfs_inode_attrs *sd_attrs;
+ struct sysfs_inode_attrs *attrs;
struct iattr *iattrs;
unsigned int ia_valid = iattr->ia_valid;
- sd_attrs = sd->s_iattr;
+ attrs = sysfs_inode_attrs(sd);
+ if (!attrs)
+ return -ENOMEM;
- if (!sd_attrs) {
- /* setting attributes for the first time, allocate now */
- sd_attrs = sysfs_init_inode_attrs(sd);
- if (!sd_attrs)
- return -ENOMEM;
- sd->s_iattr = sd_attrs;
- }
- /* attributes were changed at least once in past */
- iattrs = &sd_attrs->ia_iattr;
+ iattrs = &attrs->ia_iattr;
if (ia_valid & ATTR_UID)
iattrs->ia_uid = iattr->ia_uid;
@@ -143,22 +139,19 @@ out:
static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata,
u32 *secdata_len)
{
- struct sysfs_inode_attrs *iattrs;
+ struct sysfs_inode_attrs *attrs;
void *old_secdata;
size_t old_secdata_len;
- if (!sd->s_iattr) {
- sd->s_iattr = sysfs_init_inode_attrs(sd);
- if (!sd->s_iattr)
- return -ENOMEM;
- }
+ attrs = sysfs_inode_attrs(sd);
+ if (!attrs)
+ return -ENOMEM;
- iattrs = sd->s_iattr;
- old_secdata = iattrs->ia_secdata;
- old_secdata_len = iattrs->ia_secdata_len;
+ old_secdata = attrs->ia_secdata;
+ old_secdata_len = attrs->ia_secdata_len;
- iattrs->ia_secdata = *secdata;
- iattrs->ia_secdata_len = *secdata_len;
+ attrs->ia_secdata = *secdata;
+ attrs->ia_secdata_len = *secdata_len;
*secdata = old_secdata;
*secdata_len = old_secdata_len;
@@ -216,17 +209,16 @@ static inline void set_inode_attr(struct inode *inode, struct iattr *iattr)
static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
{
- struct sysfs_inode_attrs *iattrs = sd->s_iattr;
+ struct sysfs_inode_attrs *attrs = sd->s_iattr;
inode->i_mode = sd->s_mode;
- if (iattrs) {
+ if (attrs) {
/* sysfs_dirent has non-default attributes
* get them from persistent copy in sysfs_dirent
*/
- set_inode_attr(inode, &iattrs->ia_iattr);
- security_inode_notifysecctx(inode,
- iattrs->ia_secdata,
- iattrs->ia_secdata_len);
+ set_inode_attr(inode, &attrs->ia_iattr);
+ security_inode_notifysecctx(inode, attrs->ia_secdata,
+ attrs->ia_secdata_len);
}
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 @@
#include <linux/kernfs.h>
struct sysfs_inode_attrs {
- struct iattr ia_iattr;
- void *ia_secdata;
- u32 ia_secdata_len;
+ struct iattr ia_iattr;
+ void *ia_secdata;
+ u32 ia_secdata_len;
};
#define SD_DEACTIVATED_BIAS INT_MIN