]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: set the proper extra bl for the create request
authorXiubo Li <xiubli@redhat.com>
Tue, 28 May 2024 04:35:17 +0000 (12:35 +0800)
committerJos Collin <jcollin@redhat.com>
Thu, 11 Jul 2024 01:36:27 +0000 (07:06 +0530)
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)

src/mds/Server.cc

index c89dffd1c2379c048bafb570919a30432c8fd1c2..17a409d89f139921e444379c6c616b34d7e53f6e 100644 (file)
@@ -2783,10 +2783,18 @@ void Server::dispatch_client_request(const MDRequestRef& mdr)
 
     // 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: