From c2dfcb95e30c9c9f3f4681ade0239cd6c3197736 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Wed, 26 Mar 2003 18:57:29 -0800 Subject: [PATCH] [PATCH] kNFSd: Be more careful with readlock in exp_parent We currently hold a read_lock of dparent_lock while calling exp_get_by_name on several ancestors of a given dentry. However exp_get_by_name can malloc(GFP_KERNEL), so that isn't a good idea. Now we only claim the lock while actually stepping up the parent chain. This addresses bug 29 @ bugme.osdl.org --- fs/nfsd/export.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 4ea38a35403ef..835d996497cb3 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -496,13 +496,19 @@ exp_parent(svc_client *clp, struct vfsmount *mnt, struct dentry *dentry, { svc_export *exp; - read_lock(&dparent_lock); + dget(dentry); exp = exp_get_by_name(clp, mnt, dentry, reqp); + while (exp == NULL && dentry != dentry->d_parent) { - dentry = dentry->d_parent; + struct dentry *parent; + read_lock(&dparent_lock); + parent = dget(dentry->d_parent); + dput(dentry); + dentry = parent; + read_unlock(&dparent_lock); exp = exp_get_by_name(clp, mnt, dentry, reqp); } - read_unlock(&dparent_lock); + dput(dentry); return exp; } -- 2.53.0