aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <compudj@krystal.dyndns.org>2006-11-24 13:51:14 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-12-13 18:38:45 -0500
commit29a7f3ada7fea5510504c5359c3f70d109aeb055 (patch)
treefde6accdce93eece0b513a0ad129dba870acb912
parent65c333367b1aea57d58168ad3dc1df27b0227401 (diff)
DebugFS : file/directory removal fix
Fix file and directory removal in debugfs. Add inotify support for file removal. The following scenario : create dir a create dir a/b cd a/b (some process goes in cwd a/b) rmdir a/b rmdir a fails due to the fact that "a" appears to be non empty. It is because the "b" dentry is not deleted from "a" and still in use. The same problem happens if "b" is a file. d_delete is nice enough to know when it needs to unhash and free the dentry if nothing else is using it or, if someone is using it, to remove it from the hash queues and wait for it to be deleted when it has no users. The nice side-effect of this fix is that it calls the file removal notification. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--fs/debugfs/inode.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 554f4a9dfaf8..c692487346ea 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -286,6 +286,7 @@ void debugfs_remove(struct dentry *dentry)
286 mutex_lock(&parent->d_inode->i_mutex); 286 mutex_lock(&parent->d_inode->i_mutex);
287 if (debugfs_positive(dentry)) { 287 if (debugfs_positive(dentry)) {
288 if (dentry->d_inode) { 288 if (dentry->d_inode) {
289 dget(dentry);
289 if (S_ISDIR(dentry->d_inode->i_mode)) { 290 if (S_ISDIR(dentry->d_inode->i_mode)) {
290 ret = simple_rmdir(parent->d_inode, dentry); 291 ret = simple_rmdir(parent->d_inode, dentry);
291 if (ret) 292 if (ret)
@@ -295,6 +296,9 @@ void debugfs_remove(struct dentry *dentry)
295 dentry->d_name.name); 296 dentry->d_name.name);
296 } else 297 } else
297 simple_unlink(parent->d_inode, dentry); 298 simple_unlink(parent->d_inode, dentry);
299 if (!ret)
300 d_delete(dentry);
301 dput(dentry);
298 } 302 }
299 } 303 }
300 mutex_unlock(&parent->d_inode->i_mutex); 304 mutex_unlock(&parent->d_inode->i_mutex);