ceph: don't abuse d_delete() on failure exits
[deliverable/linux.git] / fs / ceph / inode.c
index 9fff9f3b17e4a5206a9073cec2be714fba44bda0..ba95eea201bf1ef8e809159d6b41019fb9169752 100644 (file)
@@ -992,11 +992,15 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
        if (rinfo->head->is_dentry) {
                struct inode *dir = req->r_locked_dir;
 
-               err = fill_inode(dir, &rinfo->diri, rinfo->dirfrag,
-                                session, req->r_request_started, -1,
-                                &req->r_caps_reservation);
-               if (err < 0)
-                       return err;
+               if (dir) {
+                       err = fill_inode(dir, &rinfo->diri, rinfo->dirfrag,
+                                        session, req->r_request_started, -1,
+                                        &req->r_caps_reservation);
+                       if (err < 0)
+                               return err;
+               } else {
+                       WARN_ON_ONCE(1);
+               }
        }
 
        /*
@@ -1004,6 +1008,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
         * will have trouble splicing in the virtual snapdir later
         */
        if (rinfo->head->is_dentry && !req->r_aborted &&
+           req->r_locked_dir &&
            (rinfo->head->is_target || strncmp(req->r_dentry->d_name.name,
                                               fsc->mount_options->snapdir_name,
                                               req->r_dentry->d_name.len))) {
@@ -1099,7 +1104,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                                pr_err("fill_trace bad get_inode "
                                       "%llx.%llx\n", vino.ino, vino.snap);
                                err = PTR_ERR(in);
-                               d_delete(dn);
+                               d_drop(dn);
                                goto done;
                        }
                        dn = splice_dentry(dn, in, &have_lease, true);
@@ -1272,7 +1277,7 @@ retry_lookup:
                        in = ceph_get_inode(parent->d_sb, vino);
                        if (IS_ERR(in)) {
                                dout("new_inode badness\n");
-                               d_delete(dn);
+                               d_drop(dn);
                                dput(dn);
                                err = PTR_ERR(in);
                                goto out;
This page took 0.027722 seconds and 5 git commands to generate.