Commit 380e6fbb authored by Tejun Heo's avatar Tejun Heo Committed by Greg Kroah-Hartman

sysfs: implement SYSFS_FLAG_REMOVED flag

Implement SYSFS_FLAG_REMOVED flag which currently is used only to
improve sanity check in sysfs_deactivate().  The flag will be used to
make directory entries reclamiable.
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b402d72c
...@@ -171,7 +171,7 @@ void sysfs_deactivate(struct sysfs_dirent *sd) ...@@ -171,7 +171,7 @@ void sysfs_deactivate(struct sysfs_dirent *sd)
DECLARE_COMPLETION_ONSTACK(wait); DECLARE_COMPLETION_ONSTACK(wait);
int v; int v;
BUG_ON(sd->s_sibling); BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
sd->s_sibling = (void *)&wait; sd->s_sibling = (void *)&wait;
/* atomic_add_return() is a mb(), put_active() will always see /* atomic_add_return() is a mb(), put_active() will always see
...@@ -506,6 +506,7 @@ static void remove_dir(struct dentry * d) ...@@ -506,6 +506,7 @@ static void remove_dir(struct dentry * d)
mutex_lock(&parent->d_inode->i_mutex); mutex_lock(&parent->d_inode->i_mutex);
sysfs_unlink_sibling(sd); sysfs_unlink_sibling(sd);
sd->s_flags |= SYSFS_FLAG_REMOVED;
pr_debug(" o %s removing done (%d)\n",d->d_name.name, pr_debug(" o %s removing done (%d)\n",d->d_name.name,
atomic_read(&d->d_count)); atomic_read(&d->d_count));
...@@ -540,6 +541,7 @@ static void __sysfs_remove_dir(struct dentry *dentry) ...@@ -540,6 +541,7 @@ static void __sysfs_remove_dir(struct dentry *dentry)
struct sysfs_dirent *sd = *pos; struct sysfs_dirent *sd = *pos;
if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) { if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) {
sd->s_flags |= SYSFS_FLAG_REMOVED;
*pos = sd->s_sibling; *pos = sd->s_sibling;
sd->s_sibling = removed; sd->s_sibling = removed;
removed = sd; removed = sd;
......
...@@ -296,6 +296,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * name) ...@@ -296,6 +296,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * name)
if (!sysfs_type(sd)) if (!sysfs_type(sd))
continue; continue;
if (!strcmp(sd->s_name, name)) { if (!strcmp(sd->s_name, name)) {
sd->s_flags |= SYSFS_FLAG_REMOVED;
*pos = sd->s_sibling; *pos = sd->s_sibling;
sd->s_sibling = NULL; sd->s_sibling = NULL;
found = 1; found = 1;
......
...@@ -84,6 +84,7 @@ struct sysfs_ops { ...@@ -84,6 +84,7 @@ struct sysfs_ops {
#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 #define SYSFS_FLAG_MASK ~SYSFS_TYPE_MASK
#define SYSFS_FLAG_REMOVED 0x0100
#ifdef CONFIG_SYSFS #ifdef CONFIG_SYSFS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment