From: Al Viro Date: Wed, 20 Apr 2016 20:31:31 +0000 (-0400) Subject: proc_fill_cache(): switch to d_alloc_parallel() X-Git-Tag: v4.7-rc1~144^2~49 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3781764b5cb109152af180a4f17cd3a24d5bc51f;p=platform%2Fkernel%2Flinux-exynos.git proc_fill_cache(): switch to d_alloc_parallel() ... making it usable with directory locked shared Signed-off-by: Al Viro --- diff --git a/fs/proc/base.c b/fs/proc/base.c index b1755b2..15b60f1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1819,12 +1819,17 @@ bool proc_fill_cache(struct file *file, struct dir_context *ctx, child = d_hash_and_lookup(dir, &qname); if (!child) { - child = d_alloc(dir, &qname); - if (!child) - goto end_instantiate; - if (instantiate(d_inode(dir), child, task, ptr) < 0) { - dput(child); + DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); + child = d_alloc_parallel(dir, &qname, &wq); + if (IS_ERR(child)) goto end_instantiate; + if (d_in_lookup(child)) { + int err = instantiate(d_inode(dir), child, task, ptr); + d_lookup_done(child); + if (err < 0) { + dput(child); + goto end_instantiate; + } } } inode = d_inode(child);