From 687a868cc1d88ea8a10c69d9dd0a9307d9cde368 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Fri, 11 May 2018 09:01:32 -0500 Subject: [PATCH] LU-11014 mdt: intent handling simplification Remove the obsolete constants MDT_IT_CREATE, MDT_IT_READDIR, MDT_IT_UNLINK, and MDT_IT_TRUNC from enum mdt_it_code. Also remove MDT_IT_OCREAT, since (at this level) it can be handled identically to MDT_IT_OPEN. Rename mdt_intent_reint() to mdt_intent_open() since it only handles open. Move the definition of the mdt_it_flavor array down and remove the then unneeded forward declarations of mdt_intent_*(). In struct mdt_it_flavor, remove the obsolete it_reint member and rename the it_flags member to it_handler_flags to avoid confusion with LDLM flags. Use 'enum tgt_handler_flags' rather than __u32 for several parameters used to hold values of that type. Signed-off-by: John L. Hammond Change-Id: I297ef397c879fcc7711d725e0315e73439d95826 Reviewed-on: https://review.whamcloud.com/32357 Reviewed-by: Mike Pershin Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_handler.c | 235 +++++++++++++++++------------------------------ 1 file changed, 86 insertions(+), 149 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 66ad174..508aafa 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -94,7 +94,6 @@ enum ldlm_mode mdt_dlm_lock_modes[] = { }; static struct mdt_device *mdt_dev(struct lu_device *d); -static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags); static const struct lu_object_operations mdt_obj_ops; @@ -3193,7 +3192,8 @@ void mdt_object_unlock_put(struct mdt_thread_info * info, * actually exists on storage (lu_object_exists()). * */ -static int mdt_body_unpack(struct mdt_thread_info *info, __u32 flags) +static int mdt_body_unpack(struct mdt_thread_info *info, + enum tgt_handler_flags flags) { const struct mdt_body *body; struct mdt_object *obj; @@ -3232,7 +3232,8 @@ static int mdt_body_unpack(struct mdt_thread_info *info, __u32 flags) RETURN(rc); } -static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags) +static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, + enum tgt_handler_flags flags) { struct req_capsule *pill = info->mti_pill; int rc; @@ -3377,39 +3378,16 @@ static int mdt_tgt_connect(struct tgt_session_info *tsi) } enum mdt_it_code { - MDT_IT_OPEN, - MDT_IT_OCREAT, - MDT_IT_CREATE, - MDT_IT_GETATTR, - MDT_IT_READDIR, - MDT_IT_LOOKUP, - MDT_IT_UNLINK, - MDT_IT_TRUNC, - MDT_IT_GETXATTR, - MDT_IT_LAYOUT, + MDT_IT_OPEN, + MDT_IT_GETATTR, + MDT_IT_LOOKUP, + MDT_IT_GETXATTR, + MDT_IT_LAYOUT, MDT_IT_QUOTA, MDT_IT_GLIMPSE, MDT_IT_BRW, - MDT_IT_NR }; -static int mdt_intent_getattr(enum mdt_it_code opcode, - struct mdt_thread_info *info, - struct ldlm_lock **, __u64); - -static int mdt_intent_getxattr(enum mdt_it_code opcode, - struct mdt_thread_info *info, - struct ldlm_lock **lockp, - __u64 flags); - -static int mdt_intent_layout(enum mdt_it_code opcode, - struct mdt_thread_info *info, - struct ldlm_lock **, - __u64); -static int mdt_intent_reint(enum mdt_it_code opcode, - struct mdt_thread_info *info, - struct ldlm_lock **, - __u64); static int mdt_intent_glimpse(enum mdt_it_code opcode, struct mdt_thread_info *info, struct ldlm_lock **lockp, __u64 flags) @@ -3425,68 +3403,6 @@ static int mdt_intent_brw(enum mdt_it_code opcode, lockp, flags); } -static struct mdt_it_flavor { - const struct req_format *it_fmt; - __u32 it_flags; - int (*it_act)(enum mdt_it_code , - struct mdt_thread_info *, - struct ldlm_lock **, - __u64); - long it_reint; -} mdt_it_flavor[] = { - [MDT_IT_OPEN] = { - .it_fmt = &RQF_LDLM_INTENT, - /*.it_flags = HABEO_REFERO,*/ - .it_flags = 0, - .it_act = mdt_intent_reint, - .it_reint = REINT_OPEN - }, - [MDT_IT_OCREAT] = { - .it_fmt = &RQF_LDLM_INTENT, - /* - * OCREAT is not a MUTABOR request as if the file - * already exists. - * We do the extra check of OBD_CONNECT_RDONLY in - * mdt_reint_open() when we really need to create - * the object. - */ - .it_flags = 0, - .it_act = mdt_intent_reint, - .it_reint = REINT_OPEN - }, - [MDT_IT_GETATTR] = { - .it_fmt = &RQF_LDLM_INTENT_GETATTR, - .it_flags = HABEO_REFERO, - .it_act = mdt_intent_getattr - }, - [MDT_IT_LOOKUP] = { - .it_fmt = &RQF_LDLM_INTENT_GETATTR, - .it_flags = HABEO_REFERO, - .it_act = mdt_intent_getattr - }, - [MDT_IT_GETXATTR] = { - .it_fmt = &RQF_LDLM_INTENT_GETXATTR, - .it_flags = HABEO_CORPUS, - .it_act = mdt_intent_getxattr - }, - [MDT_IT_LAYOUT] = { - .it_fmt = &RQF_LDLM_INTENT_LAYOUT, - .it_flags = 0, - .it_act = mdt_intent_layout - }, - [MDT_IT_GLIMPSE] = { - .it_fmt = &RQF_LDLM_INTENT, - .it_flags = 0, - .it_act = mdt_intent_glimpse, - }, - [MDT_IT_BRW] = { - .it_fmt = &RQF_LDLM_INTENT, - .it_flags = 0, - .it_act = mdt_intent_brw, - }, - -}; - int mdt_intent_lock_replace(struct mdt_thread_info *info, struct ldlm_lock **lockp, struct mdt_lock_handle *lh, @@ -3898,10 +3814,10 @@ out: return rc; } -static int mdt_intent_reint(enum mdt_it_code opcode, - struct mdt_thread_info *info, - struct ldlm_lock **lockp, - __u64 flags) +static int mdt_intent_open(enum mdt_it_code opcode, + struct mdt_thread_info *info, + struct ldlm_lock **lockp, + __u64 flags) { struct mdt_lock_handle *lhc = &info->mti_lh[MDT_LH_RMT]; struct ldlm_reply *rep = NULL; @@ -3919,12 +3835,6 @@ static int mdt_intent_reint(enum mdt_it_code opcode, if (opc < 0) RETURN(opc); - if (mdt_it_flavor[opcode].it_reint != opc) { - CERROR("Reint code %ld doesn't match intent: %d\n", - opc, opcode); - RETURN(err_serious(-EPROTO)); - } - /* Get lock from request for possible resent case. */ mdt_intent_fixup_resent(info, *lockp, lhc, flags); @@ -3974,73 +3884,97 @@ static int mdt_intent_reint(enum mdt_it_code opcode, RETURN(ELDLM_LOCK_ABORTED); } -static int mdt_intent_code(enum ldlm_intent_flags itcode) +static struct mdt_it_flavor { + const struct req_format *it_fmt; + int (*it_act)(enum mdt_it_code, + struct mdt_thread_info *, + struct ldlm_lock **, + __u64); + enum tgt_handler_flags it_handler_flags; +} mdt_it_flavor[] = { + [MDT_IT_OPEN] = { + /* + * OCREAT is not a MUTABOR request as if the file + * already exists. + * We do the extra check of OBD_CONNECT_RDONLY in + * mdt_reint_open() when we really need to create + * the object. + */ + .it_fmt = &RQF_LDLM_INTENT, + .it_act = mdt_intent_open, + }, + [MDT_IT_GETATTR] = { + .it_fmt = &RQF_LDLM_INTENT_GETATTR, + .it_act = mdt_intent_getattr, + .it_handler_flags = HABEO_REFERO, + }, + [MDT_IT_LOOKUP] = { + .it_fmt = &RQF_LDLM_INTENT_GETATTR, + .it_act = mdt_intent_getattr, + .it_handler_flags = HABEO_REFERO, + }, + [MDT_IT_GETXATTR] = { + .it_fmt = &RQF_LDLM_INTENT_GETXATTR, + .it_act = mdt_intent_getxattr, + .it_handler_flags = HABEO_CORPUS, + }, + [MDT_IT_LAYOUT] = { + .it_fmt = &RQF_LDLM_INTENT_LAYOUT, + .it_act = mdt_intent_layout, + }, + [MDT_IT_GLIMPSE] = { + .it_fmt = &RQF_LDLM_INTENT, + .it_act = mdt_intent_glimpse, + }, + [MDT_IT_BRW] = { + .it_fmt = &RQF_LDLM_INTENT, + .it_act = mdt_intent_brw, + }, +}; + +static int mdt_intent_opc(enum ldlm_intent_flags it_code, + struct mdt_thread_info *info, + struct ldlm_lock **lockp, __u64 flags) { + struct req_capsule *pill = info->mti_pill; + struct ptlrpc_request *req = mdt_info_req(info); + struct mdt_it_flavor *flv; + enum mdt_it_code opc; int rc; + ENTRY; - switch (itcode) { + switch (it_code) { case IT_OPEN: - rc = MDT_IT_OPEN; - break; case IT_OPEN|IT_CREAT: - rc = MDT_IT_OCREAT; - break; - case IT_CREAT: - rc = MDT_IT_CREATE; - break; - case IT_READDIR: - rc = MDT_IT_READDIR; + opc = MDT_IT_OPEN; break; case IT_GETATTR: - rc = MDT_IT_GETATTR; + opc = MDT_IT_GETATTR; break; case IT_LOOKUP: - rc = MDT_IT_LOOKUP; - break; - case IT_UNLINK: - rc = MDT_IT_UNLINK; - break; - case IT_TRUNC: - rc = MDT_IT_TRUNC; + opc = MDT_IT_LOOKUP; break; case IT_GETXATTR: - rc = MDT_IT_GETXATTR; + opc = MDT_IT_GETXATTR; break; case IT_LAYOUT: - rc = MDT_IT_LAYOUT; + opc = MDT_IT_LAYOUT; break; case IT_QUOTA_DQACQ: case IT_QUOTA_CONN: - rc = MDT_IT_QUOTA; + opc = MDT_IT_QUOTA; break; case IT_GLIMPSE: - rc = MDT_IT_GLIMPSE; + opc = MDT_IT_GLIMPSE; break; case IT_BRW: - rc = MDT_IT_BRW; + opc = MDT_IT_BRW; break; default: - CERROR("Unknown intent opcode: 0x%08x\n", itcode); - rc = -EINVAL; - break; + CERROR("%s: unknown intent code %#x\n", + mdt_obd_name(info->mti_mdt), it_code); + RETURN(-EPROTO); } - return rc; -} - -static int mdt_intent_opc(enum ldlm_intent_flags itopc, - struct mdt_thread_info *info, - struct ldlm_lock **lockp, __u64 flags) -{ - struct req_capsule *pill = info->mti_pill; - struct ptlrpc_request *req = mdt_info_req(info); - struct mdt_it_flavor *flv; - int opc; - int rc; - ENTRY; - - opc = mdt_intent_code(itopc); - if (opc < 0) - RETURN(-EINVAL); if (opc == MDT_IT_QUOTA) { struct lu_device *qmt = info->mti_mdt->mdt_qmt_dev; @@ -4059,6 +3993,9 @@ static int mdt_intent_opc(enum ldlm_intent_flags itopc, RETURN(rc); } + if (!(0 <= opc && opc < ARRAY_SIZE(mdt_it_flavor))) + RETURN(-EPROTO); + flv = &mdt_it_flavor[opc]; /* Fail early on unknown requests. */ @@ -4067,11 +4004,11 @@ static int mdt_intent_opc(enum ldlm_intent_flags itopc, req_capsule_extend(pill, flv->it_fmt); - rc = mdt_unpack_req_pack_rep(info, flv->it_flags); + rc = mdt_unpack_req_pack_rep(info, flv->it_handler_flags); if (rc < 0) RETURN(rc); - if (flv->it_flags & MUTABOR && mdt_rdonly(req->rq_export)) + if (flv->it_handler_flags & MUTABOR && mdt_rdonly(req->rq_export)) RETURN(-EROFS); if (flv->it_act != NULL) { -- 1.8.3.1