From 5501c414dc13a01004825a532079cbb21a036cc4 Mon Sep 17 00:00:00 2001 From: Sebastien Buisson Date: Wed, 22 Apr 2020 22:54:53 +0900 Subject: [PATCH] LU-13465 mgs: re-introduce mgs_set_info for interop purpose 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 Change-Id: Iba75c788eaefabd98bbb65a657f9a0150e20fafb Reviewed-on: https://review.whamcloud.com/38311 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lustre/include/uapi/linux/lustre/lustre_idl.h | 9 ++++++ lustre/mgs/mgs_handler.c | 42 +++++++++++++++++++++++++++ lustre/ptlrpc/layout.c | 25 ++++++++++++++++ lustre/ptlrpc/wiretest.c | 9 ++++++ lustre/utils/wirecheck.c | 14 +++++++++ lustre/utils/wiretest.c | 9 ++++++ 6 files changed, 108 insertions(+) diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index bf04057..fc351f8 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -2512,6 +2512,15 @@ enum mgs_cmd { 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 diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 99ca391..5427e12 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -96,6 +96,45 @@ static inline bool str_starts_with(const char *str, const char *prefix) 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, @@ -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), +#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), diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index cabb8dc..67a4884 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -71,6 +71,13 @@ static const struct req_msg_field *mgs_target_info_only[] = { &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 @@ -759,6 +766,9 @@ static struct req_format *req_formats[] = { &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, @@ -915,6 +925,14 @@ struct req_msg_field 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), @@ -1356,6 +1374,13 @@ struct req_format 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); diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index 998d34c..b37e059 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -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)); + /* 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)); diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index 54d653b..250212d 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -1657,6 +1657,17 @@ static void check_ldlm_barrier_lvb(void) 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) { @@ -2959,6 +2970,9 @@ main(int argc, char **argv) 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(); diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index 0e7d314..1755067 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -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)); + /* 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)); -- 1.8.3.1