]> git.apps.os.sepia.ceph.com Git - ceph-client.git/commitdiff
ceph: fail the request if the peer MDS doesn't support getvxattr op
authorXiubo Li <xiubli@redhat.com>
Wed, 27 Jul 2022 04:29:10 +0000 (12:29 +0800)
committerXiubo Li <xiubli@redhat.com>
Fri, 26 Aug 2022 23:51:58 +0000 (07:51 +0800)
Just fail the request instead sending the request out, or the peer
MDS will crash.

URL: https://tracker.ceph.com/issues/56529
Signed-off-by: Xiubo Li <xiubli@redhat.com>
fs/ceph/inode.c
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index 79ff197c7cc5653f709c9827d698c88c408adc54..cfa0b550eef2fbab0d53e4a6f7dfacde32768315 100644 (file)
@@ -2607,6 +2607,7 @@ int ceph_do_getvxattr(struct inode *inode, const char *name, void *value,
                goto out;
        }
 
+       req->r_feature_needed = CEPHFS_FEATURE_OP_GETVXATTR;
        req->r_path2 = kstrdup(name, GFP_NOFS);
        if (!req->r_path2) {
                err = -ENOMEM;
index 598012ddc4018f697854b55976adf03fffde72e8..e3683305445ce947996ffd63d04dd76142515450 100644 (file)
@@ -2501,6 +2501,7 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode)
        INIT_LIST_HEAD(&req->r_unsafe_dir_item);
        INIT_LIST_HEAD(&req->r_unsafe_target_item);
        req->r_fmode = -1;
+       req->r_feature_needed = -1;
        kref_init(&req->r_kref);
        RB_CLEAR_NODE(&req->r_node);
        INIT_LIST_HEAD(&req->r_wait);
@@ -3255,6 +3256,16 @@ static void __do_request(struct ceph_mds_client *mdsc,
 
        dout("do_request mds%d session %p state %s\n", mds, session,
             ceph_session_state_name(session->s_state));
+
+       /*
+        * The old ceph will crash the MDSs when see unknown OPs
+        */
+       if (req->r_feature_needed > 0 &&
+           !test_bit(req->r_feature_needed, &session->s_features)) {
+               err = -EOPNOTSUPP;
+               goto out_session;
+       }
+
        if (session->s_state != CEPH_MDS_SESSION_OPEN &&
            session->s_state != CEPH_MDS_SESSION_HUNG) {
                /*
index e15ee2858fef9f533ce40ba197b6c4350294c0bf..728b7d72bf7688ad68dacf94ead95234962c0ecd 100644 (file)
@@ -31,8 +31,9 @@ enum ceph_feature_type {
        CEPHFS_FEATURE_METRIC_COLLECT,
        CEPHFS_FEATURE_ALTERNATE_NAME,
        CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
+       CEPHFS_FEATURE_OP_GETVXATTR,
 
-       CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
+       CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_OP_GETVXATTR,
 };
 
 #define CEPHFS_FEATURES_CLIENT_SUPPORTED {     \
@@ -45,6 +46,7 @@ enum ceph_feature_type {
        CEPHFS_FEATURE_METRIC_COLLECT,          \
        CEPHFS_FEATURE_ALTERNATE_NAME,          \
        CEPHFS_FEATURE_NOTIFY_SESSION_STATE,    \
+       CEPHFS_FEATURE_OP_GETVXATTR,            \
 }
 
 /*
@@ -352,6 +354,8 @@ struct ceph_mds_request {
        long long         r_dir_ordered_cnt;
        int               r_readdir_cache_idx;
 
+       int               r_feature_needed;
+
        struct ceph_cap_reservation r_caps_reservation;
 };