Index: 2.6.x-xfs/fs/relayfs/inode.c =================================================================== --- 2.6.x-xfs.orig/fs/relayfs/inode.c 2005-08-29 13:30:07.622353247 +1000 +++ 2.6.x-xfs/fs/relayfs/inode.c 2005-09-06 08:59:51.140825967 +1000 @@ -189,26 +189,39 @@ /** * 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; } /** @@ -219,9 +232,6 @@ */ int relayfs_remove_dir(struct dentry *dentry) { - if (!dentry) - return -EINVAL; - return relayfs_remove(dentry); }