All callers take dcache_lock just around the call to __d_path, so take the lock into it in preparation of getting rid of dcache_lock. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: linux-2.6/fs/dcache.c =================================================================== --- linux-2.6.orig/fs/dcache.c 2010-10-09 22:59:55.482254091 +0200 +++ linux-2.6/fs/dcache.c 2010-10-10 09:36:07.338004055 +0200 @@ -1994,7 +1994,7 @@ global_root: * Returns a pointer into the buffer or an error code if the * path was too long. * - * "buflen" should be positive. Caller holds the dcache_lock. + * "buflen" should be positive. * * If path is not reachable from the supplied root, then the value of * root is changed (without modifying refcounts). @@ -2006,10 +2006,12 @@ char *__d_path(const struct path *path, int error; prepend(&res, &buflen, "\0", 1); + spin_lock(&dcache_lock); error = prepend_path(path, root, &res, &buflen); + spin_unlock(&dcache_lock); + if (error) return ERR_PTR(error); - return res; } Index: linux-2.6/fs/seq_file.c =================================================================== --- linux-2.6.orig/fs/seq_file.c 2010-10-09 22:59:55.490010272 +0200 +++ linux-2.6/fs/seq_file.c 2010-10-09 23:00:38.952004057 +0200 @@ -462,9 +462,7 @@ int seq_path_root(struct seq_file *m, st if (size) { char *p; - spin_lock(&dcache_lock); p = __d_path(path, root, buf, size); - spin_unlock(&dcache_lock); res = PTR_ERR(p); if (!IS_ERR(p)) { char *end = mangle_path(buf, p, esc); Index: linux-2.6/security/apparmor/path.c =================================================================== --- linux-2.6.orig/security/apparmor/path.c 2010-10-09 22:59:55.500012996 +0200 +++ linux-2.6/security/apparmor/path.c 2010-10-09 23:00:38.958004057 +0200 @@ -72,10 +72,8 @@ static int d_namespace_path(struct path path_get(&root); } - spin_lock(&dcache_lock); tmp = root; res = __d_path(path, &tmp, buf, buflen); - spin_unlock(&dcache_lock); *name = res; /* handle error conditions - and still allow a partial path to Index: linux-2.6/security/tomoyo/realpath.c =================================================================== --- linux-2.6.orig/security/tomoyo/realpath.c 2010-10-09 22:59:55.518025777 +0200 +++ linux-2.6/security/tomoyo/realpath.c 2010-10-09 23:00:38.961023403 +0200 @@ -127,10 +127,8 @@ char *tomoyo_realpath_from_path(struct p /* If we don't have a vfsmount, we can't calculate. */ if (!path->mnt) break; - spin_lock(&dcache_lock); /* go to whatever namespace root we are under */ pos = __d_path(path, &ns_root, buf, buf_len); - spin_unlock(&dcache_lock); /* Prepend "/proc" prefix if using internal proc vfs mount. */ if (!IS_ERR(pos) && (path->mnt->mnt_flags & MNT_INTERNAL) && (path->mnt->mnt_sb->s_magic == PROC_SUPER_MAGIC)) { -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html