diff options
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index eb9bc0a8717b..f2ea00683ec9 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -171,7 +171,7 @@ void sysfs_deactivate(struct sysfs_dirent *sd) | |||
171 | DECLARE_COMPLETION_ONSTACK(wait); | 171 | DECLARE_COMPLETION_ONSTACK(wait); |
172 | int v; | 172 | int v; |
173 | 173 | ||
174 | BUG_ON(sd->s_sibling); | 174 | BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED)); |
175 | sd->s_sibling = (void *)&wait; | 175 | sd->s_sibling = (void *)&wait; |
176 | 176 | ||
177 | /* atomic_add_return() is a mb(), put_active() will always see | 177 | /* atomic_add_return() is a mb(), put_active() will always see |
@@ -506,6 +506,7 @@ static void remove_dir(struct dentry * d) | |||
506 | mutex_lock(&parent->d_inode->i_mutex); | 506 | mutex_lock(&parent->d_inode->i_mutex); |
507 | 507 | ||
508 | sysfs_unlink_sibling(sd); | 508 | sysfs_unlink_sibling(sd); |
509 | sd->s_flags |= SYSFS_FLAG_REMOVED; | ||
509 | 510 | ||
510 | pr_debug(" o %s removing done (%d)\n",d->d_name.name, | 511 | pr_debug(" o %s removing done (%d)\n",d->d_name.name, |
511 | atomic_read(&d->d_count)); | 512 | atomic_read(&d->d_count)); |
@@ -540,6 +541,7 @@ static void __sysfs_remove_dir(struct dentry *dentry) | |||
540 | struct sysfs_dirent *sd = *pos; | 541 | struct sysfs_dirent *sd = *pos; |
541 | 542 | ||
542 | if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) { | 543 | if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) { |
544 | sd->s_flags |= SYSFS_FLAG_REMOVED; | ||
543 | *pos = sd->s_sibling; | 545 | *pos = sd->s_sibling; |
544 | sd->s_sibling = removed; | 546 | sd->s_sibling = removed; |
545 | removed = sd; | 547 | removed = sd; |