]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix ENOENT handling during lookup
authorSage Weil <sage@newdream.net>
Wed, 12 Mar 2008 17:51:44 +0000 (10:51 -0700)
committerSage Weil <sage@newdream.net>
Wed, 12 Mar 2008 17:51:44 +0000 (10:51 -0700)
src/kernel/dir.c
src/kernel/inode.c

index 5ee505aa6e5cf5d7ce9d174d775fd14805b8d389..e31f4945c2cba65bcd858b25daad3f0a7e091b7b 100644 (file)
@@ -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;
 }
index 5f5d2acf19e7c684e448619d9c10c7a08c957349..c70e51b1e80d87cbb3497a46aa344eef6342edb0 100644 (file)
@@ -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;
                }