diff --git a/fs/dcache.c b/fs/dcache.c index 83293be48149..54f93f5e6b0f 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -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, struct path *root, 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; } diff --git a/fs/seq_file.c b/fs/seq_file.c index 0e7cb1395a94..05d6b0e78c95 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -462,9 +462,7 @@ int seq_path_root(struct seq_file *m, struct path *path, struct path *root, 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); diff --git a/security/apparmor/path.c b/security/apparmor/path.c index 82396050f186..36cc0cc39e78 100644 --- a/security/apparmor/path.c +++ b/security/apparmor/path.c @@ -72,10 +72,8 @@ static int d_namespace_path(struct path *path, char *buf, int buflen, 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 diff --git a/security/tomoyo/realpath.c b/security/tomoyo/realpath.c index ed8ccd680102..1d0bf8fa1922 100644 --- a/security/tomoyo/realpath.c +++ b/security/tomoyo/realpath.c @@ -127,10 +127,8 @@ char *tomoyo_realpath_from_path(struct path *path) /* 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)) {