aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r--fs/sysfs/dir.c4
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;