repeat:
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);
- if (sd->s_type & SYSFS_COPY_NAME)
+ if (sysfs_type(sd) & SYSFS_COPY_NAME)
kfree(sd->s_name);
kfree(sd->s_iattr);
sysfs_free_ino(sd->s_ino);
sd->s_name = name;
sd->s_mode = mode;
- sd->s_type = type;
+ sd->s_flags = type;
return sd;
struct sysfs_dirent * sd;
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))
continue;
else
{
struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
struct sysfs_dirent * sd;
+ struct bin_attribute *bin_attr;
struct inode *inode;
int found = 0;
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)) {
found = 1;
break;
if (inode->i_state & I_NEW) {
/* 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_fop = &sysfs_file_operations;
- } else if (sd->s_type & SYSFS_KOBJ_BIN_ATTR) {
- struct bin_attribute *bin_attr =
- sd->s_elem.bin_attr.bin_attr;
+ break;
+ case SYSFS_KOBJ_BIN_ATTR:
+ bin_attr = sd->s_elem.bin_attr.bin_attr;
inode->i_size = bin_attr->size;
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;
+ break;
+ default:
+ BUG();
+ }
}
sysfs_instantiate(dentry, inode);
while (*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;
sd->s_sibling = removed;
removed = sd;
const char * name;
int len;
- if (!next->s_type)
+ if (!sysfs_type(next))
continue;
name = next->s_name;
pos = &sd->s_children;
while (n && *pos) {
struct sysfs_dirent *next = *pos;
- if (next->s_type)
+ if (sysfs_type(next))
n--;
pos = &(*pos)->s_sibling;
}
dput(dentry);
/* XXX: unpin if directory, this will go away soon */
- if (sd->s_type & SYSFS_DIR)
+ if (sysfs_type(sd) == SYSFS_DIR)
dput(dentry);
/* adjust nlink and update timestamp */
inode->i_ctime = curtime;
drop_nlink(inode);
- if (sd->s_type & SYSFS_DIR)
+ if (sysfs_type(sd) == SYSFS_DIR)
drop_nlink(inode);
mutex_unlock(&inode->i_mutex);
mutex_lock(&inode->i_mutex);
inode->i_ctime = inode->i_mtime = curtime;
- if (sd->s_type & SYSFS_DIR)
+ if (sysfs_type(sd) == SYSFS_DIR)
drop_nlink(inode);
mutex_unlock(&inode->i_mutex);
for (pos = &parent_sd->s_children; *pos; pos = &(*pos)->s_sibling) {
sd = *pos;
- if (!sd->s_type)
+ if (!sysfs_type(sd))
continue;
if (!strcmp(sd->s_name, name)) {
*pos = sd->s_sibling;
struct sysfs_elem_bin_attr bin_attr;
} s_elem;
- int s_type;
+ unsigned int s_flags;
umode_t s_mode;
ino_t s_ino;
struct dentry * s_dentry;
extern const struct inode_operations sysfs_dir_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)
{
if (sd) {
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
};
+#define SYSFS_TYPE_MASK 0x00ff
#define SYSFS_ROOT 0x0001
#define SYSFS_DIR 0x0002
#define SYSFS_KOBJ_ATTR 0x0004
#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_FLAG_MASK ~SYSFS_TYPE_MASK
+
#ifdef CONFIG_SYSFS
extern int sysfs_schedule_callback(struct kobject *kobj,