From 3e982f96071d6f9acf8d61bc992d5a10444b22ec Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Tue, 28 May 2024 12:35:17 +0800 Subject: [PATCH] mds: set the proper extra bl for the create request 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 (cherry picked from commit 3482100e8ce174d2fd3a2e7f7ed0333ae2c0a166) --- src/mds/Server.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 90b1169dcae..29bfcca6a33 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2780,10 +2780,18 @@ void Server::dispatch_client_request(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: -- 2.39.5