|
@@ -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;
|