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: Tejun Heo <htejun@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
d0bcb5689a
commit
b402d72cf7
|
@ -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)
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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 = {
|
||||||
|
|
||||||
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 {
|
||||||
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;
|
||||||
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 {
|
||||||
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 {
|
||||||
#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,
|
||||||
|
|
Loading…
Reference in New Issue