rhead->args.mknod.mode = cpu_to_le32(mode);
rhead->args.mknod.rdev = cpu_to_le32(rdev);
err = ceph_mdsc_do_request(mdsc, req);
+ if (!err && req->r_reply_info.trace_numd == 0) {
+ /* no trace. do lookup, in case we are called from create. */
+ struct dentry *d;
+ d = ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_MASK_INODE_ALL,
+ 0);
+ if (d) {
+ /* ick. this is untested... */
+ dput(d);
+ err = -ESTALE;
+ dentry = 0;
+ }
+ }
ceph_mdsc_put_request(req);
- if (err < 0)
+ if (err)
d_drop(dentry);
return err;
}
dout(5, "create in dir %p dentry %p name '%.*s'\n",
dir, dentry, dentry->d_name.len, dentry->d_name.name);
- if (nd) {
+ if (0 && nd) {
BUG_ON((nd->flags & LOOKUP_OPEN) == 0);
err = ceph_lookup_open(dir, dentry, nd, mode);
return err;
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
err = ceph_mdsc_do_request(mdsc, req);
ceph_mdsc_put_request(req);
- if (err < 0)
+ if (err)
d_drop(dentry);
return err;
}
d_drop(dentry);
else if (req->r_reply_info.trace_numd == 0) {
/* no trace */
- inc_nlink(old_dentry->d_inode);
- d_instantiate(dentry, old_dentry->d_inode);
+ struct inode *inode = old_dentry->d_inode;
+ inc_nlink(inode);
+ atomic_inc(&inode->i_count);
+ dget(dentry);
+ d_instantiate(dentry, inode);
}
return err;
}
if (err == -ENOENT)
dout(10, "HMMM!\n");
+ else if (req->r_reply_info.trace_numd == 0) {
+ /* no trace */
+ drop_nlink(dentry->d_inode);
+ dput(dentry);
+ }
return err;
}
ceph_mdsc_lease_release(mdsc, new_dentry->d_inode, 0,
CEPH_LOCK_ILINK);
err = ceph_mdsc_do_request(mdsc, req);
+ if (!err && req->r_reply_info.trace_numd == 0) {
+ /* no trace */
+ if (new_dentry->d_inode)
+ dput(new_dentry);
+ d_move(old_dentry, new_dentry);
+ }
ceph_mdsc_put_request(req);
return err;
}
dout(10, "fill_trace reply has empty trace!\n");
return 0;
}
+
+#if 0
+ /*
+ * to test op resends against a recovering mds, we pretend that
+ * write ops have no trace...
+ */
+ if (rinfo->head->op & CEPH_MDS_OP_WRITE) {
+ dout(0, "fill_trace faking empty trace on %d %s\n",
+ rinfo->head->op,
+ ceph_mds_op_name(rinfo->head->op));
+ rinfo->trace_numi = 0;
+ rinfo->trace_numd = 0;
+ return 0;
+ }
+#endif
ino = le64_to_cpu(rinfo->trace_in[0].in->ino);
if (dn) {