[SRU][Precise][PATCH 1/1] Revert "debugfs: leave freeing a symlink body until inode eviction"
Luis Henriques
luis.henriques at canonical.com
Wed Jun 17 16:16:15 UTC 2015
BugLink: https://bugs.launchpad.net/bugs/1465322
This reverts commit df438afe2d93551caf2a568bf1059651b132a64e.
The upstream 3.2.y stable kernel backport seems to be bogus. It
introduced a regression shown by running:
$ df
df: `/sys/kernel/debug': Function not implemented
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
fs/debugfs/inode.c | 46 ++++++++++++++++++----------------------------
1 file changed, 18 insertions(+), 28 deletions(-)
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index a15f1e220a76..6ac0893ca9fe 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -125,30 +125,11 @@ static inline int debugfs_positive(struct dentry *dentry)
return dentry->d_inode && !d_unhashed(dentry);
}
-static void debugfs_evict_inode(struct inode *inode)
-{
- truncate_inode_pages(&inode->i_data, 0);
- end_writeback(inode);
- if (S_ISLNK(inode->i_mode))
- kfree(inode->i_private);
-}
-
-static const struct super_operations debugfs_super_operations = {
- .evict_inode = debugfs_evict_inode,
-};
-
static int debug_fill_super(struct super_block *sb, void *data, int silent)
{
static struct tree_descr debug_files[] = {{""}};
- int err;
- err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
- if (err)
- return err;
-
- sb->s_op = &debugfs_super_operations;
-
- return 0;
+ return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
}
static struct dentry *debug_mount(struct file_system_type *fs_type,
@@ -331,14 +312,23 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
int ret = 0;
if (debugfs_positive(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);
+ 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);
+ }
}
return ret;
}
More information about the kernel-team
mailing list