From: Jinshan Xiong Date: Fri, 15 Sep 2017 20:37:46 +0000 (+0000) Subject: LU-9771 mdt: revise layout_change() to take md_layout_change X-Git-Tag: 2.10.56~9^2^2~22 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=96d7758c5f4f5ec0cdd70b62844e0bcdab434c0d;ds=sidebyside LU-9771 mdt: revise layout_change() to take md_layout_change This is a preparation patch for FLR write support. Test-Parameters: testlist=sanity-flr Signed-off-by: Jinshan Xiong Change-Id: I6323c260a636d31f683c035b45536374faa10746 Reviewed-on: https://review.whamcloud.com/29090 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Bobi Jam --- diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index 98873e8..130a4c4 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -415,6 +415,8 @@ typedef __u64 dt_obj_version_t; union ldlm_policy_data; +struct md_layout_change; + /** * A dt_object provides common operations to create and destroy * objects and to manage regular and extended attributes. @@ -1039,8 +1041,7 @@ struct dt_object_operations { */ int (*do_declare_layout_change)(const struct lu_env *env, struct dt_object *dt, - struct layout_intent *layout, - const struct lu_buf *buf, + struct md_layout_change *mlc, struct thandle *th); /** @@ -1056,8 +1057,8 @@ struct dt_object_operations { * \retval -ne error code */ int (*do_layout_change)(const struct lu_env *env, struct dt_object *dt, - struct layout_intent *layout, - const struct lu_buf *buf, struct thandle *th); + struct md_layout_change *mlc, + struct thandle *th); }; enum dt_bufs_type { @@ -2748,26 +2749,24 @@ static inline int dt_lookup(const struct lu_env *env, static inline int dt_declare_layout_change(const struct lu_env *env, struct dt_object *o, - struct layout_intent *layout, - const struct lu_buf *buf, + struct md_layout_change *mlc, struct thandle *th) { LASSERT(o); LASSERT(o->do_ops); LASSERT(o->do_ops->do_declare_layout_change); - return o->do_ops->do_declare_layout_change(env, o, layout, buf, th); + return o->do_ops->do_declare_layout_change(env, o, mlc, th); } static inline int dt_layout_change(const struct lu_env *env, struct dt_object *o, - struct layout_intent *layout, - const struct lu_buf *buf, + struct md_layout_change *mlc, struct thandle *th) { LASSERT(o); LASSERT(o->do_ops); LASSERT(o->do_ops->do_layout_change); - return o->do_ops->do_layout_change(env, o, layout, buf, th); + return o->do_ops->do_layout_change(env, o, mlc, th); } struct dt_find_hint { diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 3cd7bee..707a07a 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -156,6 +156,20 @@ struct md_op_spec { const struct dt_index_features *sp_feat; }; +enum md_layout_opc { + MD_LAYOUT_NOP = 0, + MD_LAYOUT_WRITE, /* FLR: write the file */ +}; + +/** + * Parameters for layout change API. + */ +struct md_layout_change { + enum md_layout_opc mlc_opc; + struct layout_intent *mlc_intent; + struct lu_buf mlc_buf; +}; + union ldlm_policy_data; /** * Operations implemented for each md object (both directory and leaf). @@ -222,19 +236,26 @@ struct md_object_operations { * * The caller should have held layout lock. * + * This API can be extended to support every other layout changing + * operations, such as component {add,del,change}, layout swap, + * layout merge, etc. One of the benefits by doing this is that the MDT + * no longer needs to understand layout. + * + * However, layout creation, removal, and fetch should still use + * xattr_{get,set}() because they don't interpret layout on the + * MDT layer. + * * \param[in] env execution environment * \param[in] obj MD object * \param[in] layout data structure to describe the changes to * the MD object's layout - * \param[in] buf buffer containing the client's lovea * * \retval 0 success * \retval -ne error code */ int (*moo_layout_change)(const struct lu_env *env, struct md_object *obj, - struct layout_intent *layout, - const struct lu_buf *buf); + struct md_layout_change *layout); }; /** @@ -448,12 +469,11 @@ static inline int mo_invalidate(const struct lu_env *env, struct md_object *m) static inline int mo_layout_change(const struct lu_env *env, struct md_object *m, - struct layout_intent *layout, - const struct lu_buf *buf) + struct md_layout_change *layout) { /* need instantiate objects which in the access range */ LASSERT(m->mo_ops->moo_layout_change); - return m->mo_ops->moo_layout_change(env, m, layout, buf); + return m->mo_ops->moo_layout_change(env, m, layout); } static inline int mo_swap_layouts(const struct lu_env *env, diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index e53a438..e59d82f 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -5057,8 +5057,7 @@ static int lod_invalidate(const struct lu_env *env, struct dt_object *dt) static int lod_declare_layout_change(const struct lu_env *env, struct dt_object *dt, - struct layout_intent *layout, - const struct lu_buf *buf, + struct md_layout_change *mlc, struct thandle *th) { struct lod_thread_info *info = lod_env_info(env); @@ -5066,6 +5065,8 @@ static int lod_declare_layout_change(const struct lu_env *env, struct lod_device *d = lu2lod_dev(dt->do_lu.lo_dev); struct dt_object *next = dt_object_child(dt); struct ost_pool *inuse = &info->lti_inuse_osts; + struct layout_intent *layout = mlc->mlc_intent; + struct lu_buf *buf = &mlc->mlc_buf; struct lod_layout_component *lod_comp; struct lov_comp_md_v1 *comp_v1 = NULL; bool replay = false; @@ -5200,8 +5201,7 @@ unlock: * Instantiate layout component objects which covers the intent write offset. */ static int lod_layout_change(const struct lu_env *env, struct dt_object *dt, - struct layout_intent *layout, - const struct lu_buf *buf, struct thandle *th) + struct md_layout_change *mlc, struct thandle *th) { struct lu_attr *attr = &lod_env_info(env)->lti_attr; diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 7d1d8e6..b95ad51 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -574,20 +574,17 @@ mdo_invalidate(const struct lu_env *env, struct mdd_object *obj) static inline int mdo_declare_layout_change(const struct lu_env *env, struct mdd_object *obj, - struct layout_intent *layout, - const struct lu_buf *buf, struct thandle *handle) + struct md_layout_change *mlc, struct thandle *handle) { return dt_declare_layout_change(env, mdd_object_child(obj), - layout, buf, handle); + mlc, handle); } static inline int mdo_layout_change(const struct lu_env *env, struct mdd_object *obj, - struct layout_intent *layout, const struct lu_buf *buf, - struct thandle *handle) + struct md_layout_change *mlc, struct thandle *handle) { - return dt_layout_change(env, mdd_object_child(obj), - layout, buf, handle); + return dt_layout_change(env, mdd_object_child(obj), mlc, handle); } static inline diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index d16f363..c45c86b 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -1852,13 +1852,12 @@ stop: static int mdd_declare_layout_change(const struct lu_env *env, struct mdd_device *mdd, struct mdd_object *obj, - struct layout_intent *layout, - const struct lu_buf *buf, + struct md_layout_change *mlc, struct thandle *handle) { int rc; - rc = mdo_declare_layout_change(env, obj, layout, buf, handle); + rc = mdo_declare_layout_change(env, obj, mlc, handle); if (rc) return rc; @@ -1867,7 +1866,7 @@ static int mdd_declare_layout_change(const struct lu_env *env, /* For PFL, this is used to instantiate necessary component objects. */ int mdd_layout_change(const struct lu_env *env, struct md_object *obj, - struct layout_intent *layout, const struct lu_buf *buf) + struct md_layout_change *mlc) { struct mdd_object *mdd_obj = md2mdd_obj(obj); struct mdd_device *mdd = mdo2mdd(obj); @@ -1879,7 +1878,7 @@ int mdd_layout_change(const struct lu_env *env, struct md_object *obj, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - rc = mdd_declare_layout_change(env, mdd, mdd_obj, layout, buf, handle); + rc = mdd_declare_layout_change(env, mdd, mdd_obj, mlc, handle); /** * It's possible that another layout write intent has already * instantiated our objects, so a -EALREADY returned, and we need to @@ -1893,7 +1892,7 @@ int mdd_layout_change(const struct lu_env *env, struct md_object *obj, GOTO(stop, rc); mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); - rc = mdo_layout_change(env, mdd_obj, layout, buf, handle); + rc = mdo_layout_change(env, mdd_obj, mlc, handle); mdd_write_unlock(env, mdd_obj); if (rc) GOTO(stop, rc); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 9f34149..c2533e4 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -1341,33 +1341,33 @@ out: * * \param[in] info thread environment * \param[in] obj object - * \param[in] layout layout intent - * \param[in] buf buffer containing client's lovea, could be empty + * \param[in] layout layout change descriptor * * \retval 0 on success * \retval < 0 error code */ static int mdt_layout_change(struct mdt_thread_info *info, struct mdt_object *obj, - struct layout_intent *layout, - const struct lu_buf *buf) + struct md_layout_change *layout) { struct mdt_lock_handle *lh = &info->mti_lh[MDT_LH_LOCAL]; + struct layout_intent *intent = layout->mlc_intent; int rc; ENTRY; CDEBUG(D_INFO, "got layout change request from client: " "opc:%u flags:%#x extent "DEXT"\n", - layout->li_opc, layout->li_flags, - PEXT(&layout->li_extent)); + intent->li_opc, intent->li_flags, PEXT(&intent->li_extent)); - if (layout->li_extent.e_start >= layout->li_extent.e_end) { - CERROR("Recieved an invalid layout change range "DEXT - "for "DFID"\n", - PEXT(&layout->li_extent), PFID(mdt_object_fid(obj))); + if (intent->li_extent.e_start >= intent->li_extent.e_end) { + CERROR(DFID ":invalid range of layout change "DEXT"\n", + PFID(mdt_object_fid(obj)), PEXT(&intent->li_extent)); RETURN(-EINVAL); } + if (!mdt_object_exists(obj)) + GOTO(out, rc = -ENOENT); + if (!S_ISREG(lu_object_attr(&obj->mot_obj))) GOTO(out, rc = -EINVAL); @@ -1378,13 +1378,11 @@ static int mdt_layout_change(struct mdt_thread_info *info, /* take layout lock to prepare layout change */ mdt_lock_reg_init(lh, LCK_EX); - rc = mdt_object_lock(info, obj, lh, - MDS_INODELOCK_LAYOUT | MDS_INODELOCK_XATTR); + rc = mdt_object_lock(info, obj, lh, MDS_INODELOCK_LAYOUT); if (rc) GOTO(out, rc); - rc = mo_layout_change(info->mti_env, mdt_object_child(obj), layout, - buf); + rc = mo_layout_change(info->mti_env, mdt_object_child(obj), layout); mdt_object_unlock(info, obj, lh, 1); out: @@ -3745,10 +3743,10 @@ static int mdt_intent_layout(enum mdt_it_code opcode, __u64 flags) { struct mdt_lock_handle *lhc = &info->mti_lh[MDT_LH_LAYOUT]; - struct layout_intent *layout; + struct md_layout_change layout = { .mlc_opc = MD_LAYOUT_NOP }; + struct layout_intent *intent; struct lu_fid *fid; struct mdt_object *obj = NULL; - bool layout_change = false; int layout_size = 0; int rc = 0; ENTRY; @@ -3759,14 +3757,15 @@ static int mdt_intent_layout(enum mdt_it_code opcode, RETURN(-EINVAL); } - layout = req_capsule_client_get(info->mti_pill, &RMF_LAYOUT_INTENT); - if (layout == NULL) + intent = req_capsule_client_get(info->mti_pill, &RMF_LAYOUT_INTENT); + if (intent == NULL) RETURN(-EPROTO); - switch (layout->li_opc) { + switch (intent->li_opc) { case LAYOUT_INTENT_TRUNC: case LAYOUT_INTENT_WRITE: - layout_change = true; + layout.mlc_opc = MD_LAYOUT_WRITE; + layout.mlc_intent = intent; break; case LAYOUT_INTENT_ACCESS: break; @@ -3775,12 +3774,12 @@ static int mdt_intent_layout(enum mdt_it_code opcode, case LAYOUT_INTENT_RELEASE: case LAYOUT_INTENT_RESTORE: CERROR("%s: Unsupported layout intent opc %d\n", - mdt_obd_name(info->mti_mdt), layout->li_opc); + mdt_obd_name(info->mti_mdt), intent->li_opc); rc = -ENOTSUPP; break; default: CERROR("%s: Unknown layout intent opc %d\n", - mdt_obd_name(info->mti_mdt), layout->li_opc); + mdt_obd_name(info->mti_mdt), intent->li_opc); rc = -EINVAL; break; } @@ -3818,8 +3817,8 @@ static int mdt_intent_layout(enum mdt_it_code opcode, GOTO(out_obj, rc); - if (layout_change) { - struct lu_buf *buf = &info->mti_buf; + if (layout.mlc_opc != MD_LAYOUT_NOP) { + struct lu_buf *buf = &layout.mlc_buf; /** * mdt_layout_change is a reint operation, when the request @@ -3863,7 +3862,7 @@ static int mdt_intent_layout(enum mdt_it_code opcode, * lovea, then it's a replay of the layout intent write * RPC. */ - rc = mdt_layout_change(info, obj, layout, buf); + rc = mdt_layout_change(info, obj, &layout); if (rc) GOTO(out_obj, rc); }