|
@@ -169,10 +169,19 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void debugfs_evict_inode(struct inode *inode)
|
|
|
+{
|
|
|
+ truncate_inode_pages_final(&inode->i_data);
|
|
|
+ clear_inode(inode);
|
|
|
+ if (S_ISLNK(inode->i_mode))
|
|
|
+ kfree(inode->i_private);
|
|
|
+}
|
|
|
+
|
|
|
static const struct super_operations debugfs_super_operations = {
|
|
|
.statfs = simple_statfs,
|
|
|
.remount_fs = debugfs_remount,
|
|
|
.show_options = debugfs_show_options,
|
|
|
+ .evict_inode = debugfs_evict_inode,
|
|
|
};
|
|
|
|
|
|
static struct vfsmount *debugfs_automount(struct path *path)
|
|
@@ -511,23 +520,14 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
|
|
|
int ret = 0;
|
|
|
|
|
|
if (debugfs_positive(dentry)) {
|
|
|
- if (dentry->d_inode) {
|
|
|
- dget(dentry);
|
|
|
- switch (dentry->d_inode->i_mode & S_IFMT) {
|
|
|
- case S_IFDIR:
|
|
|
- ret = simple_rmdir(parent->d_inode, dentry);
|
|
|
- break;
|
|
|
- case S_IFLNK:
|
|
|
- kfree(dentry->d_inode->i_private);
|
|
|
- /* fall through */
|
|
|
- default:
|
|
|
- simple_unlink(parent->d_inode, dentry);
|
|
|
- break;
|
|
|
- }
|
|
|
- if (!ret)
|
|
|
- d_delete(dentry);
|
|
|
- dput(dentry);
|
|
|
- }
|
|
|
+ dget(dentry);
|
|
|
+ if (S_ISDIR(dentry->d_inode->i_mode))
|
|
|
+ ret = simple_rmdir(parent->d_inode, dentry);
|
|
|
+ else
|
|
|
+ simple_unlink(parent->d_inode, dentry);
|
|
|
+ if (!ret)
|
|
|
+ d_delete(dentry);
|
|
|
+ dput(dentry);
|
|
|
}
|
|
|
return ret;
|
|
|
}
|