[PATCH 4/7] vfs: __d_path: dont prepend the name of the root dentry

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Miklos Szeredi
Date: Monday, August 2, 2010 - 4:19 am

From: Miklos Szeredi <mszeredi@suse.cz>

In the old times pseudo-filesystems set the name of theroot dentry to
some prefix like "pipe:" and the name of the child dentry to "[123]"
and relied on a hack in __d_path() to replace the preceding slash with
the root's name to get "pipe:[123]".

Then the d_dname() dentry operation was introduced which solved the
same problem without having to pre-fill the name in each dentry.

Currently the following pseudo filesystems exist in the kernel:

perfmon
mtd
anon_inode
bdev
pipe
socket

Of these only perfmon, anon_inode, pipe and socket create
sub-dentries, all of which have now been switched to using d_dname().

bdev and mtd only create inodes.

This means that now the hack to overwrite the slash can be removed, so
for unreachable paths (e.g. within a detached mount) the path string
won't be polluted with garbage.  For these cases a subsequent patch
will add a prefix, indicating that the path is unreachable.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
---
 fs/dcache.c |   12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Index: linux-2.6/fs/dcache.c
===================================================================
--- linux-2.6.orig/fs/dcache.c	2010-07-06 18:08:06.000000000 +0200
+++ linux-2.6/fs/dcache.c	2010-07-06 18:08:12.000000000 +0200
@@ -1968,9 +1968,15 @@ out:
 	return retval;
 
 global_root:
-	retval += 1;	/* hit the slash */
-	if (prepend_name(&retval, &buflen, &dentry->d_name) != 0)
-		goto Elong;
+	/*
+	 * Filesystems needing to implement special "root names"
+	 * should do so with ->d_dname()
+	 */
+	if (IS_ROOT(dentry) &&
+	    (dentry->d_name.len != 1 || dentry->d_name.name[0] != '/')) {
+		WARN(1, "Root dentry has weird name <%.*s>\n",
+		     (int) dentry->d_name.len, dentry->d_name.name);
+	}
 	root->mnt = vfsmnt;
 	root->dentry = dentry;
 	goto out;

-- 
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/7] dcache fixes and cleanups, Miklos Szeredi, (Mon Aug 2, 4:19 am)
[PATCH 1/7] cachefiles: use path_get instead of lone dget, Miklos Szeredi, (Mon Aug 2, 4:19 am)
[PATCH 2/7] vfs: add helpers to get root and pwd, Miklos Szeredi, (Mon Aug 2, 4:19 am)
[PATCH 3/7] ia64: perfmon: add d_dname method, Miklos Szeredi, (Mon Aug 2, 4:19 am)
[PATCH 4/7] vfs: __d_path: dont prepend the name of the ro ..., Miklos Szeredi, (Mon Aug 2, 4:19 am)
[PATCH 5/7] vfs: add prepend_path() helper, Miklos Szeredi, (Mon Aug 2, 4:20 am)