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);
 
        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) {
                /*
 
        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 {     \
        CEPHFS_FEATURE_DELEG_INO,               \
        CEPHFS_FEATURE_METRIC_COLLECT,          \
        CEPHFS_FEATURE_NOTIFY_SESSION_STATE,    \
+       CEPHFS_FEATURE_OP_GETVXATTR,            \
 }
 
 /*
        long long         r_dir_ordered_cnt;
        int               r_readdir_cache_idx;
 
+       int               r_feature_needed;
+
        struct ceph_cap_reservation r_caps_reservation;
 };