提交 b402d72c 编写于 作者: T Tejun Heo 提交者: Greg Kroah-Hartman

sysfs: rename sysfs_dirent->s_type to s_flags and make room for flags

Rename sysfs_dirent->s_type to s_flags, pack type into lower eight
bits and reserve the rest for flags.  sysfs_type() can used to access
the type.  All existing sd->s_type accesses are converted to use
sysfs_type().  While at it, type test is changed to equality test
instead of bit-and test where appropriate.
Signed-off-by: NTejun Heo <htejun@gmail.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 d0bcb568
...@@ -218,9 +218,9 @@ void release_sysfs_dirent(struct sysfs_dirent * sd) ...@@ -218,9 +218,9 @@ void release_sysfs_dirent(struct sysfs_dirent * sd)
repeat: repeat:
parent_sd = sd->s_parent; parent_sd = sd->s_parent;
if (sd->s_type & SYSFS_KOBJ_LINK) if (sysfs_type(sd) == SYSFS_KOBJ_LINK)
sysfs_put(sd->s_elem.symlink.target_sd); sysfs_put(sd->s_elem.symlink.target_sd);
if (sd->s_type & SYSFS_COPY_NAME) if (sysfs_type(sd) & SYSFS_COPY_NAME)
kfree(sd->s_name); kfree(sd->s_name);
kfree(sd->s_iattr); kfree(sd->s_iattr);
sysfs_free_ino(sd->s_ino); sysfs_free_ino(sd->s_ino);
...@@ -282,7 +282,7 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type) ...@@ -282,7 +282,7 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
sd->s_name = name; sd->s_name = name;
sd->s_mode = mode; sd->s_mode = mode;
sd->s_type = type; sd->s_flags = type;
return sd; return sd;
...@@ -330,7 +330,7 @@ int sysfs_dirent_exist(struct sysfs_dirent *parent_sd, ...@@ -330,7 +330,7 @@ int sysfs_dirent_exist(struct sysfs_dirent *parent_sd,
struct sysfs_dirent * sd; struct sysfs_dirent * sd;
for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) { for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) {
if (sd->s_type) { if (sysfs_type(sd)) {
if (strcmp(sd->s_name, new)) if (strcmp(sd->s_name, new))
continue; continue;
else else
...@@ -446,11 +446,12 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -446,11 +446,12 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
{ {
struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata; struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
struct sysfs_dirent * sd; struct sysfs_dirent * sd;
struct bin_attribute *bin_attr;
struct inode *inode; struct inode *inode;
int found = 0; int found = 0;
for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) { for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) {
if ((sd->s_type & SYSFS_NOT_PINNED) && if ((sysfs_type(sd) & SYSFS_NOT_PINNED) &&
!strcmp(sd->s_name, dentry->d_name.name)) { !strcmp(sd->s_name, dentry->d_name.name)) {
found = 1; found = 1;
break; break;
...@@ -468,16 +469,22 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -468,16 +469,22 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
if (inode->i_state & I_NEW) { if (inode->i_state & I_NEW) {
/* initialize inode according to type */ /* initialize inode according to type */
if (sd->s_type & SYSFS_KOBJ_ATTR) { switch (sysfs_type(sd)) {
case SYSFS_KOBJ_ATTR:
inode->i_size = PAGE_SIZE; inode->i_size = PAGE_SIZE;
inode->i_fop = &sysfs_file_operations; inode->i_fop = &sysfs_file_operations;
} else if (sd->s_type & SYSFS_KOBJ_BIN_ATTR) { break;
struct bin_attribute *bin_attr = case SYSFS_KOBJ_BIN_ATTR:
sd->s_elem.bin_attr.bin_attr; bin_attr = sd->s_elem.bin_attr.bin_attr;
inode->i_size = bin_attr->size; inode->i_size = bin_attr->size;
inode->i_fop = &bin_fops; inode->i_fop = &bin_fops;
} else if (sd->s_type & SYSFS_KOBJ_LINK) break;
case SYSFS_KOBJ_LINK:
inode->i_op = &sysfs_symlink_inode_operations; inode->i_op = &sysfs_symlink_inode_operations;
break;
default:
BUG();
}
} }
sysfs_instantiate(dentry, inode); sysfs_instantiate(dentry, inode);
...@@ -532,7 +539,7 @@ static void __sysfs_remove_dir(struct dentry *dentry) ...@@ -532,7 +539,7 @@ static void __sysfs_remove_dir(struct dentry *dentry)
while (*pos) { while (*pos) {
struct sysfs_dirent *sd = *pos; struct sysfs_dirent *sd = *pos;
if (sd->s_type && (sd->s_type & SYSFS_NOT_PINNED)) { if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) {
*pos = sd->s_sibling; *pos = sd->s_sibling;
sd->s_sibling = removed; sd->s_sibling = removed;
removed = sd; removed = sd;
...@@ -775,7 +782,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) ...@@ -775,7 +782,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
const char * name; const char * name;
int len; int len;
if (!next->s_type) if (!sysfs_type(next))
continue; continue;
name = next->s_name; name = next->s_name;
...@@ -824,7 +831,7 @@ static loff_t sysfs_dir_lseek(struct file * file, loff_t offset, int origin) ...@@ -824,7 +831,7 @@ static loff_t sysfs_dir_lseek(struct file * file, loff_t offset, int origin)
pos = &sd->s_children; pos = &sd->s_children;
while (n && *pos) { while (n && *pos) {
struct sysfs_dirent *next = *pos; struct sysfs_dirent *next = *pos;
if (next->s_type) if (sysfs_type(next))
n--; n--;
pos = &(*pos)->s_sibling; pos = &(*pos)->s_sibling;
} }
......
...@@ -242,7 +242,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd) ...@@ -242,7 +242,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd)
dput(dentry); dput(dentry);
/* XXX: unpin if directory, this will go away soon */ /* XXX: unpin if directory, this will go away soon */
if (sd->s_type & SYSFS_DIR) if (sysfs_type(sd) == SYSFS_DIR)
dput(dentry); dput(dentry);
/* adjust nlink and update timestamp */ /* adjust nlink and update timestamp */
...@@ -254,7 +254,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd) ...@@ -254,7 +254,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd)
inode->i_ctime = curtime; inode->i_ctime = curtime;
drop_nlink(inode); drop_nlink(inode);
if (sd->s_type & SYSFS_DIR) if (sysfs_type(sd) == SYSFS_DIR)
drop_nlink(inode); drop_nlink(inode);
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
...@@ -267,7 +267,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd) ...@@ -267,7 +267,7 @@ void sysfs_drop_dentry(struct sysfs_dirent *sd)
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
inode->i_ctime = inode->i_mtime = curtime; inode->i_ctime = inode->i_mtime = curtime;
if (sd->s_type & SYSFS_DIR) if (sysfs_type(sd) == SYSFS_DIR)
drop_nlink(inode); drop_nlink(inode);
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
...@@ -293,7 +293,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * name) ...@@ -293,7 +293,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * name)
for (pos = &parent_sd->s_children; *pos; pos = &(*pos)->s_sibling) { for (pos = &parent_sd->s_children; *pos; pos = &(*pos)->s_sibling) {
sd = *pos; sd = *pos;
if (!sd->s_type) if (!sysfs_type(sd))
continue; continue;
if (!strcmp(sd->s_name, name)) { if (!strcmp(sd->s_name, name)) {
*pos = sd->s_sibling; *pos = sd->s_sibling;
......
...@@ -26,7 +26,7 @@ static const struct super_operations sysfs_ops = { ...@@ -26,7 +26,7 @@ static const struct super_operations sysfs_ops = {
static struct sysfs_dirent sysfs_root = { static struct sysfs_dirent sysfs_root = {
.s_count = ATOMIC_INIT(1), .s_count = ATOMIC_INIT(1),
.s_type = SYSFS_ROOT, .s_flags = SYSFS_ROOT,
.s_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, .s_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
.s_ino = 1, .s_ino = 1,
}; };
......
...@@ -34,7 +34,7 @@ struct sysfs_dirent { ...@@ -34,7 +34,7 @@ struct sysfs_dirent {
struct sysfs_elem_bin_attr bin_attr; struct sysfs_elem_bin_attr bin_attr;
} s_elem; } s_elem;
int s_type; unsigned int s_flags;
umode_t s_mode; umode_t s_mode;
ino_t s_ino; ino_t s_ino;
struct dentry * s_dentry; struct dentry * s_dentry;
...@@ -86,6 +86,11 @@ extern const struct file_operations bin_fops; ...@@ -86,6 +86,11 @@ extern const struct file_operations bin_fops;
extern const struct inode_operations sysfs_dir_inode_operations; extern const struct inode_operations sysfs_dir_inode_operations;
extern const struct inode_operations sysfs_symlink_inode_operations; extern const struct inode_operations sysfs_symlink_inode_operations;
static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
{
return sd->s_flags & SYSFS_TYPE_MASK;
}
static inline struct sysfs_dirent * sysfs_get(struct sysfs_dirent * sd) static inline struct sysfs_dirent * sysfs_get(struct sysfs_dirent * sd)
{ {
if (sd) { if (sd) {
......
...@@ -74,6 +74,7 @@ struct sysfs_ops { ...@@ -74,6 +74,7 @@ struct sysfs_ops {
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
}; };
#define SYSFS_TYPE_MASK 0x00ff
#define SYSFS_ROOT 0x0001 #define SYSFS_ROOT 0x0001
#define SYSFS_DIR 0x0002 #define SYSFS_DIR 0x0002
#define SYSFS_KOBJ_ATTR 0x0004 #define SYSFS_KOBJ_ATTR 0x0004
...@@ -82,6 +83,8 @@ struct sysfs_ops { ...@@ -82,6 +83,8 @@ struct sysfs_ops {
#define SYSFS_NOT_PINNED (SYSFS_KOBJ_ATTR | SYSFS_KOBJ_BIN_ATTR | SYSFS_KOBJ_LINK) #define SYSFS_NOT_PINNED (SYSFS_KOBJ_ATTR | SYSFS_KOBJ_BIN_ATTR | SYSFS_KOBJ_LINK)
#define SYSFS_COPY_NAME (SYSFS_DIR | SYSFS_KOBJ_LINK) #define SYSFS_COPY_NAME (SYSFS_DIR | SYSFS_KOBJ_LINK)
#define SYSFS_FLAG_MASK ~SYSFS_TYPE_MASK
#ifdef CONFIG_SYSFS #ifdef CONFIG_SYSFS
extern int sysfs_schedule_callback(struct kobject *kobj, extern int sysfs_schedule_callback(struct kobject *kobj,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册