forked from Minki/linux
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: Tejun Heo <htejun@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
b402d72cf7
commit
380e6fbb72
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
#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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user