d_drop(dentry);
return PTR_ERR(req);
}
+
+ dget(dentry); /* to match put_request below */
+ req->r_last_dentry = dentry; /* use this dentry in fill_trace */
+ igrab(old_dentry->d_inode);
+ req->r_last_inode = old_dentry->d_inode;
+
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
err = ceph_mdsc_do_request(mdsc, req);
ceph_mdsc_put_request(req);
if ((!dn->d_inode) ||
(ceph_ino(dn->d_inode) != ininfo->ino)) {
dout(10, "fill_trace new_inode\n");
- in = new_inode(dn->d_sb);
+ if (req->r_last_inode &&
+ ceph_ino(req->r_last_inode) == ininfo->ino) {
+ in = req->r_last_inode;
+ igrab(in);
+ inc_nlink(in);
+ } else {
+ in = new_inode(dn->d_sb);
+ }
+
if (in == NULL) {
dout(30, "new_inode badness\n");
err = -ENOMEM;