From: Sergey Cheremencev Date: Fri, 18 Dec 2020 13:18:13 +0000 (+0300) Subject: LU-14777 lod: fix E2BIG on create X-Git-Tag: 2.14.55~4 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=226efad21a9e47dfb19b7b300e8d9786e5c9a184 LU-14777 lod: fix E2BIG on create A fix solves 2 cases that caused create to fail with -E2BIG. 1. Stripe count number should be calculated depending on LOV_PATTERN_OVERSTRIPING flag. 2. In a case of failover lod_comp_entry_stripe_count may return 0 if all OST targets have been disconnected. Return EAGAIN in such case to calculate this later, when at least one OST would be connected. HPE-bug-id: LUS-9485 Fixes: aa72de32 ("LU-11691 lov: Limit layout size to max ea size") Change-Id: I26cad4903d5dd6197fe1384013fbba8b2c76487c Signed-off-by: Sergey Cheremencev Reviewed-on: https://review.whamcloud.com/44043 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Alexander Boyko Reviewed-by: Alexander Zarochentsev Reviewed-by: Oleg Drokin --- diff --git a/lustre/lod/lod_internal.h b/lustre/lod/lod_internal.h index 0e41743..3060e7a 100644 --- a/lustre/lod/lod_internal.h +++ b/lustre/lod/lod_internal.h @@ -157,6 +157,7 @@ struct lod_device { #define lod_ost_bitmap lod_ost_descs.ltd_tgt_bitmap #define lod_ost_count lod_ost_descs.ltd_lov_desc.ld_tgt_count +#define lod_ost_active_count lod_ost_descs.ltd_lov_desc.ld_active_tgt_count #define lod_remote_mdt_count lod_mdt_descs.ltd_lmv_desc.ld_tgt_count struct lod_layout_component { diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index ae80072..ab139b7 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -745,11 +745,18 @@ static int lod_gen_component_ea(const struct lu_env *env, RETURN(-E2BIG); objs = &v3->lmm_objects[0]; } + lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); stripe_count = lod_comp_entry_stripe_count(lo, comp_idx, is_dir); if (stripe_count == 0 && !is_dir && !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) && - !(lod_comp->llc_pattern & LOV_PATTERN_MDT)) + !(lod_comp->llc_pattern & LOV_PATTERN_MDT)) { + /* Try again if all active targets are disconnected. + * It is possible when MDS does failover. */ + if (!lod->lod_ost_active_count && + lod->lod_ost_count) + RETURN(-EAGAIN); RETURN(-E2BIG); + } if (!is_dir && lo->ldo_is_composite) lod_comp_shrink_stripe_count(lod_comp, &stripe_count); @@ -758,7 +765,6 @@ static int lod_gen_component_ea(const struct lu_env *env, GOTO(done, rc = 0); /* generate ost_idx of this component stripe */ - lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); for (i = 0; i < stripe_count; i++) { struct dt_object *object; __u32 ost_idx = (__u32)-1UL; diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 5729d2f..21d9a03 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -2658,7 +2658,9 @@ __u16 lod_comp_entry_stripe_count(struct lod_object *lo, return lod->lod_ost_count; else return lod_get_stripe_count(lod, lo, comp_idx, - entry->llc_stripe_count, false); + entry->llc_stripe_count, + entry->llc_pattern & + LOV_PATTERN_OVERSTRIPING); } static int lod_comp_md_size(struct lod_object *lo, bool is_dir)