- Don't d_delete() files when removing a directory - they must still be
hashed when dput() reaps them, and it will __d_drop() them anyway.
- Don't d_invalidate() the directory on removal.
- do simple_rmdir() after d_delete() on directory.
- Remove extra dput(), which was causing refcount to go negative, causing
an oops when someone tried to create the directory again.
- Make sure we don't d_delete() or do extra dput() on file when updating,
either.
* Unlink and unhash.
*/
spin_unlock(&dcache_lock);
- d_delete(d);
simple_unlink(dentry->d_inode,d);
dput(d);
spin_lock(&dcache_lock);
}
spin_unlock(&dcache_lock);
up(&dentry->d_inode->i_sem);
- d_invalidate(dentry);
- simple_rmdir(parent->d_inode,dentry);
d_delete(dentry);
+ simple_rmdir(parent->d_inode,dentry);
pr_debug(" o %s removing done (%d)\n",dentry->d_name.name,
atomic_read(&dentry->d_count));
- /**
- * Drop reference from initial sysfs_get_dentry().
- */
- dput(dentry);
/**
* Drop reference from dget() on entrance.
/* make sure dentry is really there */
if (victim->d_inode &&
(victim->d_parent->d_inode == dir->d_inode)) {
- simple_unlink(dir->d_inode,victim);
- d_delete(victim);
-
pr_debug("sysfs: Removing %s (%d)\n", victim->d_name.name,
atomic_read(&victim->d_count));
- /*
- * Drop reference from initial sysfs_get_dentry().
- */
- dput(victim);
+
+ simple_unlink(dir->d_inode,victim);
+
}
-
- /**
- * Drop the reference acquired from sysfs_get_dentry() above.
+ /*
+ * Drop reference from sysfs_get_dentry() above.
*/
dput(victim);
}