From 46d59655baa32a246c8f50299b7fa52f3667ca47 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 27 Apr 2008 19:20:29 -0700 Subject: [PATCH] kclient: d_add only in do_lookup --- src/kernel/dir.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 5dfb63f2639fd..8795dcb30d169 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -233,12 +233,15 @@ int ceph_do_lookup(struct super_block *sb, struct dentry *dentry, int mask, dget(dentry); /* to match put_request below */ req->r_last_dentry = dentry; /* use this dentry in fill_trace */ err = ceph_mdsc_do_request(mdsc, req); - ceph_mdsc_put_request(req); /* will dput(dentry) */ - if (err == -ENOENT) { + /* no trace? */ + if (err == -ENOENT && req->r_reply_info.trace_numd == 0) { + dout(20, "ENOENT and no trace, dentry %p inode %p\n", + dentry, dentry->d_inode); ceph_init_dentry(dentry); d_add(dentry, NULL); err = 0; } + ceph_mdsc_put_request(req); /* will dput(dentry) */ dout(20, "do_lookup %p result=%d\n", dentry, err); return err; } @@ -260,9 +263,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, } err = ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_MASK_INODE_ALL, 0); - if (err == -ENOENT) - d_add(dentry, NULL); - else if (err < 0) + if (err < 0) return ERR_PTR(err); return NULL; -- 2.39.5