Whamcloud - gitweb
LU-13465 mgs: re-introduce mgs_set_info for interop purpose 11/38311/4
authorSebastien Buisson <sbuisson@ddn.com>
Wed, 22 Apr 2020 13:54:53 +0000 (22:54 +0900)
committerOleg Drokin <green@whamcloud.com>
Thu, 7 May 2020 05:45:31 +0000 (05:45 +0000)
Older clients might send MGS_SET_INFO requests to the MGS. Newer MGS
needs to handle that gracefully by returning:
- -EINVAL for anything other than lov.stripe*
- 0 for those parameters without doing anything, rather than
  returning -ENOTSUPP.

Test-Parameters: clientversion=2.12 envdefinitions=SANITY_EXCEPT="27M 56ra 151 156 802"
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: Iba75c788eaefabd98bbb65a657f9a0150e20fafb
Reviewed-on: https://review.whamcloud.com/38311
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/uapi/linux/lustre/lustre_idl.h
lustre/mgs/mgs_handler.c
lustre/ptlrpc/layout.c
lustre/ptlrpc/wiretest.c
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index bf04057..fc351f8 100644 (file)
@@ -2512,6 +2512,15 @@ enum mgs_cmd {
        MGS_FIRST_OPC   = MGS_CONNECT
 };
 
        MGS_FIRST_OPC   = MGS_CONNECT
 };
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+#define MGS_PARAM_MAXLEN 1024
+#define KEY_SET_INFO "set_info"
+
+struct mgs_send_param {
+       char            mgs_param[MGS_PARAM_MAXLEN];
+};
+#endif
+
 /* We pass this info to the MGS so it can write config logs */
 #define MTI_NAME_MAXLEN  64
 #define MTI_PARAM_MAXLEN 4096
 /* We pass this info to the MGS so it can write config logs */
 #define MTI_NAME_MAXLEN  64
 #define MTI_PARAM_MAXLEN 4096
index 99ca391..5427e12 100644 (file)
@@ -96,6 +96,45 @@ static inline bool str_starts_with(const char *str, const char *prefix)
        return strncmp(str, prefix, strlen(prefix)) == 0;
 }
 
        return strncmp(str, prefix, strlen(prefix)) == 0;
 }
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+static int mgs_set_info(struct tgt_session_info *tsi)
+{
+       struct mgs_thread_info *mgi;
+       struct mgs_send_param *msp;
+       size_t param_len;
+       char *s;
+
+       ENTRY;
+
+       mgi = mgs_env_info(tsi->tsi_env);
+       if (IS_ERR(mgi))
+               RETURN(err_serious(PTR_ERR(mgi)));
+
+       msp = req_capsule_client_get(tsi->tsi_pill, &RMF_MGS_SEND_PARAM);
+       if (msp == NULL)
+               RETURN(err_serious(-EFAULT));
+
+       param_len = strnlen(msp->mgs_param, sizeof(msp->mgs_param));
+       if (param_len == 0 || param_len == sizeof(msp->mgs_param))
+               RETURN(-EINVAL);
+
+       /* We only allow '*.lov.stripe{size,count,offset}=*' from an RPC. */
+       s = strchr(msp->mgs_param, '.');
+       if (s == NULL)
+               RETURN(-EINVAL);
+
+       if (!str_starts_with(s + 1, "lov.stripesize=") &&
+           !str_starts_with(s + 1, "lov.stripecount=") &&
+           !str_starts_with(s + 1, "lov.stripeoffset="))
+               RETURN(-EINVAL);
+
+       /* do nothing */
+       CDEBUG(D_MGS, "%s: ignoring set info '%s'\n",
+              tgt_name(tsi->tsi_tgt), msp->mgs_param);
+       RETURN(0);
+}
+#endif
+
 enum ast_type {
        AST_CONFIG      = 1,
        AST_PARAMS      = 2,
 enum ast_type {
        AST_CONFIG      = 1,
        AST_PARAMS      = 2,
@@ -1141,6 +1180,9 @@ TGT_RPC_HANDLER(MGS_FIRST_OPC,
                0,                      MGS_DISCONNECT,  mgs_disconnect,
                &RQF_MDS_DISCONNECT, LUSTRE_OBD_VERSION),
 TGT_MGS_HDL_VAR(0,                     MGS_EXCEPTION,   mgs_exception),
                0,                      MGS_DISCONNECT,  mgs_disconnect,
                &RQF_MDS_DISCONNECT, LUSTRE_OBD_VERSION),
 TGT_MGS_HDL_VAR(0,                     MGS_EXCEPTION,   mgs_exception),
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+TGT_MGS_HDL(HAS_REPLY | IS_MUTABLE,    MGS_SET_INFO,    mgs_set_info),
+#endif
 TGT_MGS_HDL(HAS_REPLY | IS_MUTABLE,    MGS_TARGET_REG,  mgs_target_reg),
 TGT_MGS_HDL_VAR(0,                     MGS_TARGET_DEL,  mgs_target_del),
 TGT_MGS_HDL(HAS_REPLY,                 MGS_CONFIG_READ, mgs_config_read),
 TGT_MGS_HDL(HAS_REPLY | IS_MUTABLE,    MGS_TARGET_REG,  mgs_target_reg),
 TGT_MGS_HDL_VAR(0,                     MGS_TARGET_DEL,  mgs_target_del),
 TGT_MGS_HDL(HAS_REPLY,                 MGS_CONFIG_READ, mgs_config_read),
index cabb8dc..67a4884 100644 (file)
@@ -71,6 +71,13 @@ static const struct req_msg_field *mgs_target_info_only[] = {
         &RMF_MGS_TARGET_INFO
 };
 
         &RMF_MGS_TARGET_INFO
 };
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+static const struct req_msg_field *mgs_set_info[] = {
+       &RMF_PTLRPC_BODY,
+       &RMF_MGS_SEND_PARAM
+};
+#endif
+
 static const struct req_msg_field *mgs_config_read_client[] = {
         &RMF_PTLRPC_BODY,
         &RMF_MGS_CONFIG_BODY
 static const struct req_msg_field *mgs_config_read_client[] = {
         &RMF_PTLRPC_BODY,
         &RMF_MGS_CONFIG_BODY
@@ -759,6 +766,9 @@ static struct req_format *req_formats[] = {
        &RQF_OBD_IDX_READ,
        &RQF_SEC_CTX,
        &RQF_MGS_TARGET_REG,
        &RQF_OBD_IDX_READ,
        &RQF_SEC_CTX,
        &RQF_MGS_TARGET_REG,
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+       &RQF_MGS_SET_INFO,
+#endif
        &RQF_MGS_CONFIG_READ,
        &RQF_SEQ_QUERY,
        &RQF_FLD_QUERY,
        &RQF_MGS_CONFIG_READ,
        &RQF_SEQ_QUERY,
        &RQF_FLD_QUERY,
@@ -915,6 +925,14 @@ struct req_msg_field RMF_MGS_TARGET_INFO =
                     lustre_swab_mgs_target_info, NULL);
 EXPORT_SYMBOL(RMF_MGS_TARGET_INFO);
 
                     lustre_swab_mgs_target_info, NULL);
 EXPORT_SYMBOL(RMF_MGS_TARGET_INFO);
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+struct req_msg_field RMF_MGS_SEND_PARAM =
+       DEFINE_MSGF("mgs_send_param", 0,
+                   sizeof(struct mgs_send_param),
+                   NULL, NULL);
+EXPORT_SYMBOL(RMF_MGS_SEND_PARAM);
+#endif
+
 struct req_msg_field RMF_MGS_CONFIG_BODY =
         DEFINE_MSGF("mgs_config_read request", 0,
                     sizeof(struct mgs_config_body),
 struct req_msg_field RMF_MGS_CONFIG_BODY =
         DEFINE_MSGF("mgs_config_read request", 0,
                     sizeof(struct mgs_config_body),
@@ -1356,6 +1374,13 @@ struct req_format RQF_MGS_TARGET_REG =
                          mgs_target_info_only);
 EXPORT_SYMBOL(RQF_MGS_TARGET_REG);
 
                          mgs_target_info_only);
 EXPORT_SYMBOL(RQF_MGS_TARGET_REG);
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+struct req_format RQF_MGS_SET_INFO =
+       DEFINE_REQ_FMT0("MGS_SET_INFO", mgs_set_info,
+                       mgs_set_info);
+EXPORT_SYMBOL(RQF_MGS_SET_INFO);
+#endif
+
 struct req_format RQF_MGS_CONFIG_READ =
         DEFINE_REQ_FMT0("MGS_CONFIG_READ", mgs_config_read_client,
                          mgs_config_read_server);
 struct req_format RQF_MGS_CONFIG_READ =
         DEFINE_REQ_FMT0("MGS_CONFIG_READ", mgs_config_read_client,
                          mgs_config_read_server);
index 998d34c..b37e059 100644 (file)
@@ -3812,6 +3812,15 @@ void lustre_assert_wire_constants(void)
        LASSERTF((int)sizeof(((struct barrier_lvb *)0)->lvb_padding) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct barrier_lvb *)0)->lvb_padding));
 
        LASSERTF((int)sizeof(((struct barrier_lvb *)0)->lvb_padding) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct barrier_lvb *)0)->lvb_padding));
 
+       /* Checks for struct mgs_send_param */
+       LASSERTF((int)sizeof(struct mgs_send_param) == 1024, "found %lld\n",
+                (long long)(int)sizeof(struct mgs_send_param));
+       BUILD_BUG_ON(MGS_PARAM_MAXLEN != 1024);
+       LASSERTF((int)offsetof(struct mgs_send_param, mgs_param[1024]) == 1024, "found %lld\n",
+                (long long)(int)offsetof(struct mgs_send_param, mgs_param[1024]));
+       LASSERTF((int)sizeof(((struct mgs_send_param *)0)->mgs_param[1024]) == 1, "found %lld\n",
+                (long long)(int)sizeof(((struct mgs_send_param *)0)->mgs_param[1024]));
+
        /* Checks for struct cfg_marker */
        LASSERTF((int)sizeof(struct cfg_marker) == 160, "found %lld\n",
                 (long long)(int)sizeof(struct cfg_marker));
        /* Checks for struct cfg_marker */
        LASSERTF((int)sizeof(struct cfg_marker) == 160, "found %lld\n",
                 (long long)(int)sizeof(struct cfg_marker));
index 54d653b..250212d 100644 (file)
@@ -1657,6 +1657,17 @@ static void check_ldlm_barrier_lvb(void)
        CHECK_MEMBER(barrier_lvb, lvb_padding);
 }
 
        CHECK_MEMBER(barrier_lvb, lvb_padding);
 }
 
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+static void
+check_mgs_send_param(void)
+{
+       BLANK_LINE();
+       CHECK_STRUCT(mgs_send_param);
+       CHECK_CVALUE(MGS_PARAM_MAXLEN);
+       CHECK_MEMBER(mgs_send_param, mgs_param[MGS_PARAM_MAXLEN]);
+}
+#endif
+
 static void
 check_cfg_marker(void)
 {
 static void
 check_cfg_marker(void)
 {
@@ -2959,6 +2970,9 @@ main(int argc, char **argv)
        check_ldlm_gl_lquota_desc();
        check_ldlm_gl_barrier_desc();
        check_ldlm_barrier_lvb();
        check_ldlm_gl_lquota_desc();
        check_ldlm_gl_barrier_desc();
        check_ldlm_barrier_lvb();
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)
+       check_mgs_send_param();
+#endif
        check_cfg_marker();
        check_llog_logid();
        check_llog_catid();
        check_cfg_marker();
        check_llog_logid();
        check_llog_catid();
index 0e7d314..1755067 100644 (file)
@@ -3844,6 +3844,15 @@ void lustre_assert_wire_constants(void)
        LASSERTF((int)sizeof(((struct barrier_lvb *)0)->lvb_padding) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct barrier_lvb *)0)->lvb_padding));
 
        LASSERTF((int)sizeof(((struct barrier_lvb *)0)->lvb_padding) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct barrier_lvb *)0)->lvb_padding));
 
+       /* Checks for struct mgs_send_param */
+       LASSERTF((int)sizeof(struct mgs_send_param) == 1024, "found %lld\n",
+                (long long)(int)sizeof(struct mgs_send_param));
+       BUILD_BUG_ON(MGS_PARAM_MAXLEN != 1024);
+       LASSERTF((int)offsetof(struct mgs_send_param, mgs_param[1024]) == 1024, "found %lld\n",
+                (long long)(int)offsetof(struct mgs_send_param, mgs_param[1024]));
+       LASSERTF((int)sizeof(((struct mgs_send_param *)0)->mgs_param[1024]) == 1, "found %lld\n",
+                (long long)(int)sizeof(((struct mgs_send_param *)0)->mgs_param[1024]));
+
        /* Checks for struct cfg_marker */
        LASSERTF((int)sizeof(struct cfg_marker) == 160, "found %lld\n",
                 (long long)(int)sizeof(struct cfg_marker));
        /* Checks for struct cfg_marker */
        LASSERTF((int)sizeof(struct cfg_marker) == 160, "found %lld\n",
                 (long long)(int)sizeof(struct cfg_marker));