From 2585407bb98cde5aa046d338fda0c759f8723932 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 12 Mar 2008 10:51:44 -0700 Subject: [PATCH] client: fix ENOENT handling during lookup --- src/kernel/dir.c | 11 +++++++---- src/kernel/inode.c | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 5ee505aa6e5cf..e31f4945c2cba 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -280,12 +280,15 @@ int ceph_request_lookup(struct super_block *sb, struct dentry *dentry) kfree(path); if (IS_ERR(req)) return PTR_ERR(req); - dget(dentry); + 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); - if (err != -ENOENT) - dput(dentry); + ceph_mdsc_put_request(req); /* will dput(dentry) */ + if (err == -ENOENT) { + ceph_touch_dentry(dentry); + d_add(dentry, NULL); + err = 0; + } dout(20, "request_lookup result=%d\n", err); return err; } diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 5f5d2acf19e7c..c70e51b1e80d8 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -216,10 +216,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) } } if (!rinfo->trace_in[i].in) { - dout(10, "fill_trace enoent\n"); + dout(10, "fill_trace has dentry but no inode\n"); err = -ENOENT; - d_delete(dn); - dn = NULL; + d_add(dn, NULL); + ceph_touch_dentry(dn); break; } -- 2.39.5