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