]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fail the request if the peer MDS doesn't support getvxattr op
authorXiubo Li <xiubli@redhat.com>
Tue, 12 Jul 2022 14:42:23 +0000 (22:42 +0800)
committerXiubo Li <xiubli@redhat.com>
Mon, 5 Dec 2022 00:52:11 +0000 (08:52 +0800)
Just fail the request instead sending the request out, or the peer
MDS will crash.

Fixes: https://tracker.ceph.com/issues/56529
Signed-off-by: Xiubo Li <xiubli@redhat.com>
(cherry picked from commit 953d637db4b4799b0254c55ab52d2f515d175ff3)

src/client/Client.cc
src/client/Client.h

index c701e0ba0f5472c8b3dcbc35807d07edbdc6617e..ea04a37e1bcbe8a22668d65dbb58fe15d366efa2 100644 (file)
@@ -1874,7 +1874,8 @@ int Client::make_request(MetaRequest *request,
                         const UserPerm& perms,
                         InodeRef *ptarget, bool *pcreated,
                         mds_rank_t use_mds,
-                        bufferlist *pdirbl)
+                        bufferlist *pdirbl,
+                        size_t feature_needed)
 {
   int r = 0;
 
@@ -1958,6 +1959,11 @@ int Client::make_request(MetaRequest *request,
       session = &mds_sessions.at(mds);
     }
 
+    if (feature_needed != ULONG_MAX && !session->mds_features.test(feature_needed)) {
+      request->abort(-CEPHFS_EOPNOTSUPP);
+      break;
+    }
+
     // send request.
     send_request(request, session);
 
@@ -1974,7 +1980,7 @@ int Client::make_request(MetaRequest *request,
     request->caller_cond = nullptr;
 
     // did we get a reply?
-    if (request->reply) 
+    if (request->reply)
       break;
   }
 
@@ -7654,10 +7660,14 @@ int Client::_getvxattr(
   req->set_string2(xattr_name);
 
   bufferlist bl;
-  int res = make_request(req, perms, nullptr, nullptr, rank, &bl);
+  int res = make_request(req, perms, nullptr, nullptr, rank, &bl,
+                         CEPHFS_FEATURE_OP_GETVXATTR);
   ldout(cct, 10) << __func__ << " result=" << res << dendl;
 
   if (res < 0) {
+    if (res == -CEPHFS_EOPNOTSUPP) {
+      return -CEPHFS_ENODATA;
+    }
     return res;
   }
 
index cda4abaf289eed0fa45cfd8dbc23054cc5431cb3..ca398cbdc3ceb9d5b49b80bc297b49d5f6936174 100644 (file)
@@ -934,8 +934,9 @@ protected:
   void dump_mds_sessions(Formatter *f, bool cap_dump=false);
 
   int make_request(MetaRequest *req, const UserPerm& perms,
-                  InodeRef *ptarget = 0, bool *pcreated = 0,
-                  mds_rank_t use_mds=-1, bufferlist *pdirbl=0);
+                   InodeRef *ptarget = 0, bool *pcreated = 0,
+                   mds_rank_t use_mds=-1, bufferlist *pdirbl=0,
+                   size_t feature_needed=ULONG_MAX);
   void put_request(MetaRequest *request);
   void unregister_request(MetaRequest *request);