Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ void sysfs_deactivate(struct sysfs_dirent *sd)
	DECLARE_COMPLETION_ONSTACK(wait);
	int v;

	BUG_ON(sd->s_sibling);
	BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
	sd->s_sibling = (void *)&wait;

	/* 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);

	sysfs_unlink_sibling(sd);
	sd->s_flags |= SYSFS_FLAG_REMOVED;

	pr_debug(" o %s removing done (%d)\n",d->d_name.name,
		 atomic_read(&d->d_count));
@@ -540,6 +541,7 @@ static void __sysfs_remove_dir(struct dentry *dentry)
		struct sysfs_dirent *sd = *pos;

		if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) {
			sd->s_flags |= SYSFS_FLAG_REMOVED;
			*pos = sd->s_sibling;
			sd->s_sibling = removed;
			removed = sd;
+1 −0
Original line number Diff line number Diff line
@@ -296,6 +296,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * name)
		if (!sysfs_type(sd))
			continue;
		if (!strcmp(sd->s_name, name)) {
			sd->s_flags |= SYSFS_FLAG_REMOVED;
			*pos = sd->s_sibling;
			sd->s_sibling = NULL;
			found = 1;
+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ struct sysfs_ops {
#define SYSFS_COPY_NAME		(SYSFS_DIR | SYSFS_KOBJ_LINK)

#define SYSFS_FLAG_MASK		~SYSFS_TYPE_MASK
#define SYSFS_FLAG_REMOVED	0x0100

#ifdef CONFIG_SYSFS