From ed3da626ab277e438751b524c54b5d9eff2bb742 Mon Sep 17 00:00:00 2001 From: "robert.read" Date: Mon, 27 Apr 2009 21:45:04 +0000 Subject: [PATCH] Branch HEAD b=18818 i=manoj i=rread fix RMF_SETINFO_VAL type and verify all setinfo lengths Relanding Nathan's patch. --- lustre/ost/ost_handler.c | 4 +++- lustre/ptlrpc/layout.c | 28 ++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c index c6cd630..d82ca41 100644 --- a/lustre/ost/ost_handler.c +++ b/lustre/ost/ost_handler.c @@ -1200,8 +1200,10 @@ static int ost_set_info(struct obd_export *exp, struct ptlrpc_request *req) if (KEY_IS(KEY_EVICT_BY_NID)) { if (val && vallen) obd_export_evict_by_nid(exp->exp_obd, val); - GOTO(out, rc = 0); + } else if (KEY_IS(KEY_MDS_CONN) && lustre_msg_swabbed(req->rq_reqmsg)) { + /* Val's are not swabbed automatically */ + __swab32s((__u32 *)val); } rc = obd_set_info_async(exp, keylen, key, vallen, val, NULL); diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index da3c611..ca233cb 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -613,7 +613,8 @@ struct req_msg_field { }; enum rmf_flags { - RMF_F_STRING = 1 << 0 + RMF_F_STRING = 1 << 0, + RMF_F_NO_SIZE_CHECK = 1 << 1 }; struct req_capsule; @@ -646,8 +647,7 @@ const struct req_msg_field RMF_MGS_SEND_PARAM = EXPORT_SYMBOL(RMF_MGS_SEND_PARAM); const struct req_msg_field RMF_SETINFO_VAL = - DEFINE_MSGF("setinfo_val", 0, - sizeof(__u32), lustre_swab_generic_32s); + DEFINE_MSGF("setinfo_val", 0, -1, NULL); EXPORT_SYMBOL(RMF_SETINFO_VAL); const struct req_msg_field RMF_SEQ_OPC = @@ -756,12 +756,13 @@ const struct req_msg_field RMF_CONN = EXPORT_SYMBOL(RMF_CONN); const struct req_msg_field RMF_CONNECT_DATA = - DEFINE_MSGF("cdata", 0, + DEFINE_MSGF("cdata", + RMF_F_NO_SIZE_CHECK /* we allow extra space for interop */, sizeof(struct obd_connect_data), lustre_swab_connect); EXPORT_SYMBOL(RMF_CONNECT_DATA); const struct req_msg_field RMF_DLM_REQ = - DEFINE_MSGF("dlm_req", 0, + DEFINE_MSGF("dlm_req", RMF_F_NO_SIZE_CHECK /* ldlm_request_bufsize */, sizeof(struct ldlm_request), lustre_swab_ldlm_request); EXPORT_SYMBOL(RMF_DLM_REQ); @@ -780,7 +781,7 @@ const struct req_msg_field RMF_DLM_LVB = EXPORT_SYMBOL(RMF_DLM_LVB); const struct req_msg_field RMF_MDT_MD = - DEFINE_MSGF("mdt_md", 0, MIN_MD_SIZE, NULL); + DEFINE_MSGF("mdt_md", RMF_F_NO_SIZE_CHECK, MIN_MD_SIZE, NULL); EXPORT_SYMBOL(RMF_MDT_MD); const struct req_msg_field RMF_REC_REINT = @@ -798,11 +799,13 @@ const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, -1, NULL); EXPORT_SYMBOL(RMF_EADATA); const struct req_msg_field RMF_ACL = - DEFINE_MSGF("acl", 0, LUSTRE_POSIX_ACL_MAX_SIZE, NULL); + DEFINE_MSGF("acl", RMF_F_NO_SIZE_CHECK, + LUSTRE_POSIX_ACL_MAX_SIZE, NULL); EXPORT_SYMBOL(RMF_ACL); const struct req_msg_field RMF_LOGCOOKIES = - DEFINE_MSGF("logcookies", 0, sizeof(struct llog_cookie), NULL); + DEFINE_MSGF("logcookies", RMF_F_NO_SIZE_CHECK /* multiple cookies */, + sizeof(struct llog_cookie), NULL); EXPORT_SYMBOL(RMF_LOGCOOKIES); const struct req_msg_field RMF_CAPA1 = @@ -1501,6 +1504,15 @@ void req_capsule_set_size(struct req_capsule *pill, { LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT); + if ((size != field->rmf_size) && + (field->rmf_size != -1) && + !(field->rmf_flags & RMF_F_NO_SIZE_CHECK) && + (size > 0)) { + CERROR("%s: field size mismatch %d != %d (%d)\n", + field->rmf_name, size, field->rmf_size, loc); + LBUG(); + } + pill->rc_area[loc][__req_capsule_offset(pill, field, loc)] = size; } EXPORT_SYMBOL(req_capsule_set_size); -- 1.8.3.1