summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Triplett <josht@us.ibm.com>2006-07-25 03:30:00 +0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-08-04 00:55:01 +0400
commitce510193272c295b891e45525a83b543ae3207c1 (patch)
tree4b343858aa43e2a1e549ea23c5cff4cf86aeff47
parent3f2792ffbd88dc1cd41d226674cc428914981e98 (diff)
downloadlinux-ce510193272c295b891e45525a83b543ae3207c1.tar.xz
NFS: Release dcache_lock in an error path of nfs_path
In one of the error paths of nfs_path, it may return with dcache_lock still held; fix this by adding and using a new error path Elong_unlock which unlocks dcache_lock. Signed-off-by: Josh Triplett <josh@freedesktop.org> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> (cherry picked from f4b90b43677fb23297c56802c3056fc304f988d9 commit)
-rw-r--r--fs/nfs/namespace.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index 19b98ca468eb..86b3169c8cac 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -51,7 +51,7 @@ char *nfs_path(const char *base, const struct dentry *dentry,
namelen = dentry->d_name.len;
buflen -= namelen + 1;
if (buflen < 0)
- goto Elong;
+ goto Elong_unlock;
end -= namelen;
memcpy(end, dentry->d_name.name, namelen);
*--end = '/';
@@ -68,6 +68,8 @@ char *nfs_path(const char *base, const struct dentry *dentry,
end -= namelen;
memcpy(end, base, namelen);
return end;
+Elong_unlock:
+ spin_unlock(&dcache_lock);
Elong:
return ERR_PTR(-ENAMETOOLONG);
}