Just in case a create request was totally completed but the client
didn't receive any unsafe and safe responses, and then when it's
retried in the MDS side it will be treated as a open request and
will miss setting the create ino for the reply message.
Finally for client it just sent a create request and then the MDS
just sent back a open reply, which will let the client miss setting
the CREATED flag and then the VFS will fail the create by returnning
a -EEXIST errno.
Fixes: https://tracker.ceph.com/issues/63265
Signed-off-by: Xiubo Li <xiubli@redhat.com>
(cherry picked from commit
3482100e8ce174d2fd3a2e7f7ed0333ae2c0a166)
// funky.
case CEPH_MDS_OP_CREATE:
- if (mdr->has_completed)
+ if (mdr->has_completed) {
+ inodeno_t created;
+
+ ceph_assert(mdr->session);
+ mdr->session->have_completed_request(req->get_reqid().tid, &created);
+ ceph_assert(created != inodeno_t());
+
+ set_reply_extra_bl(req, created, mdr->reply_extra_bl);
handle_client_open(mdr); // already created.. just open
- else
+ } else {
handle_client_openc(mdr);
+ }
break;
case CEPH_MDS_OP_OPEN: