diff mbox

[SRU,Precise,1/1] Revert "debugfs: leave freeing a symlink body until inode eviction"

Message ID 1434557775-12789-2-git-send-email-luis.henriques@canonical.com
State New
Headers show

Commit Message

Luis Henriques June 17, 2015, 4:16 p.m. UTC
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@canonical.com>
---
 fs/debugfs/inode.c | 46 ++++++++++++++++++----------------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

Comments

Tim Gardner June 17, 2015, 4:22 p.m. UTC | #1

Kamal Mostafa June 17, 2015, 4:58 p.m. UTC | #2

Luis Henriques June 18, 2015, 4:04 p.m. UTC | #3
Applied to Precise master-next branch.

Cheers,
--
Luís
diff mbox

Patch

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;
 }