From: Mikhal Pershin Date: Thu, 26 Oct 2017 19:13:32 +0000 (+0300) Subject: LU-3285 llite: check layout size after cl_object_layout_get X-Git-Tag: 2.10.56~64^2~4 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=877669a282efe8fea173b59723d121c25f91ee7b;p=fs%2Flustre-release.git LU-3285 llite: check layout size after cl_object_layout_get Check that layout size is not zero before doing flush for DoM object. Also patch does that: - initializes all values in cl_layout explicitly in lov_object_layout_get(). - changes cl_dom_comp_size to u64 for future needs, e.g. importing an existing filesystem image directly. Test-Parameters: mdssizegb=20 testlist=sanity-dom,dom-performance Signed-off-by: Mikhal Pershin Change-Id: Ic6ff06ad4022f85686fda238eae34ad38ff2dcd0 Reviewed-on: https://review.whamcloud.com/29810 Tested-by: Jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo --- diff --git a/lustre/include/cl_object.h b/lustre/include/cl_object.h index a5c302d..fbaabf6 100644 --- a/lustre/include/cl_object.h +++ b/lustre/include/cl_object.h @@ -290,7 +290,7 @@ struct cl_layout { /** size of layout in lov_mds_md format. */ size_t cl_size; /** size of DoM component if exists or zero otherwise */ - u32 cl_dom_comp_size; + u64 cl_dom_comp_size; /** Layout generation. */ u32 cl_layout_gen; /** whether layout is a composite one */ diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 8e71233..f4f8911 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -207,10 +207,9 @@ int ll_dom_lock_cancel(struct inode *inode, struct ldlm_lock *lock) CDEBUG(D_INODE, "Cannot get layout for "DFID"\n", PFID(ll_inode2fid(inode))); rc = -ENODATA; - } else if (clt.cl_dom_comp_size == 0) { + } else if (clt.cl_size == 0 || clt.cl_dom_comp_size == 0) { CDEBUG(D_INODE, "DOM lock without DOM layout for "DFID"\n", PFID(ll_inode2fid(inode))); - rc = -EINVAL; } else { enum cl_fsync_mode mode; loff_t end = clt.cl_dom_comp_size - 1; diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index 0b65bc7..5c52b2c 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.c @@ -1886,6 +1886,7 @@ static int lov_object_layout_get(const struct lu_env *env, cl->cl_size = lov_comp_md_size(lsm); cl->cl_layout_gen = lsm->lsm_layout_gen; + cl->cl_dom_comp_size = 0; if (lsm_is_composite(lsm->lsm_magic)) { struct lov_stripe_md_entry *lsme = lsm->lsm_entries[0]; @@ -1893,7 +1894,10 @@ static int lov_object_layout_get(const struct lu_env *env, if (lsme_is_dom(lsme)) cl->cl_dom_comp_size = lsme->lsme_extent.e_end; + } else { + cl->cl_is_composite = false; } + rc = lov_lsm_pack(lsm, buf->lb_buf, buf->lb_len); lov_lsm_put(lsm);