]> git-server-git.apps.pok.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>
Tue, 16 Aug 2022 00:30:31 +0000 (08:30 +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>
src/client/Client.cc
src/client/Client.h

index 539b7b2d5a16db48684b65fc4c6367212dee251b..fd62c8f8216bb09e27555fcadcb2f1f8739259f2 100644 (file)
@@ -1889,7 +1889,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;
 
@@ -1973,6 +1974,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.get());
 
@@ -1989,7 +1995,7 @@ int Client::make_request(MetaRequest *request,
     request->caller_cond = nullptr;
 
     // did we get a reply?
-    if (request->reply) 
+    if (request->reply)
       break;
   }
 
@@ -7652,10 +7658,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 e0e055b6dd1c7e5ada456df0e2ab802b11da5c4c..044f533ff454cc1e75a1458fe7a88307ba0c1eda 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);