summaryrefslogtreecommitdiffstats
path: root/runtime/relayfs/inode.c
diff options
context:
space:
mode:
authortrz <trz>2005-10-19 14:20:38 +0000
committertrz <trz>2005-10-19 14:20:38 +0000
commit0e1e055939eb528f1d2ec28b47faf6dd12ede0fa (patch)
tree01800f773443cb076b1d33864517e3fae38e2509 /runtime/relayfs/inode.c
parentce3187ac2f3f71f348fd7d4694b49c44f42337f3 (diff)
downloadsystemtap-steved-0e1e055939eb528f1d2ec28b47faf6dd12ede0fa.tar.gz
systemtap-steved-0e1e055939eb528f1d2ec28b47faf6dd12ede0fa.tar.xz
systemtap-steved-0e1e055939eb528f1d2ec28b47faf6dd12ede0fa.zip
bugfix patch applied
Diffstat (limited to 'runtime/relayfs/inode.c')
-rw-r--r--runtime/relayfs/inode.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/runtime/relayfs/inode.c b/runtime/relayfs/inode.c
index 3bff01e2..26faf9fb 100644
--- a/runtime/relayfs/inode.c
+++ b/runtime/relayfs/inode.c
@@ -198,26 +198,39 @@ struct dentry *relayfs_create_dir(const char *name, struct dentry *parent)
/**
* relayfs_remove - remove a file or directory in the relay filesystem
* @dentry: file or directory dentry
+ *
+ * Returns 0 if successful, negative otherwise.
*/
int relayfs_remove(struct dentry *dentry)
{
- struct dentry *parent = dentry->d_parent;
+ struct dentry *parent;
+ int error = 0;
+
+ if (!dentry)
+ return -EINVAL;
+ parent = dentry->d_parent;
if (!parent)
return -EINVAL;
parent = dget(parent);
down(&parent->d_inode->i_sem);
if (dentry->d_inode) {
- simple_unlink(parent->d_inode, dentry);
- d_delete(dentry);
+ if (S_ISDIR(dentry->d_inode->i_mode))
+ error = simple_rmdir(parent->d_inode, dentry);
+ else
+ error = simple_unlink(parent->d_inode, dentry);
+ if (!error)
+ d_delete(dentry);
}
- dput(dentry);
+ if (!error)
+ dput(dentry);
up(&parent->d_inode->i_sem);
dput(parent);
- simple_release_fs(&relayfs_mount, &relayfs_mount_count);
+ if (!error)
+ simple_release_fs(&relayfs_mount, &relayfs_mount_count);
- return 0;
+ return error;
}
/**
@@ -228,9 +241,6 @@ int relayfs_remove(struct dentry *dentry)
*/
int relayfs_remove_dir(struct dentry *dentry)
{
- if (!dentry)
- return -EINVAL;
-
return relayfs_remove(dentry);
}