From f761d016b62aaba3ee60cc5f6a7d321297507b0a Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Thu, 10 Nov 2016 12:30:34 -0500 Subject: [PATCH] staging: lustre: lov: init LOV stripe type beforehand When lu_object_alloc() reaches to LOV object init, we need initialize its stripe type beforehand, so that if something wrong in the conf buffer, the object chain need to be traversed to free what has been allocated, with LOV object type be set as LLT_EMPTY, and when the LOV part is reached, it won't panic without knowing what stripe type it is. This patch also improves debug messages in lsm_unpackmd_common(), and does not return error if the LOV device is still processing config log while trying to verify a layout buffer. Signed-off-by: Bobi Jam Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6744 Reviewed-on: http://review.whamcloud.com/15362 Reviewed-by: Jinshan Xiong Reviewed-by: Fan Yong Reviewed-by: Andreas Dilger Signed-off-by: James Simmons Signed-off-by: Greg Kroah-Hartman --- drivers/staging/lustre/lustre/lov/lov_ea.c | 12 ++++++++---- drivers/staging/lustre/lustre/lov/lov_internal.h | 5 +++++ drivers/staging/lustre/lustre/lov/lov_object.c | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/staging/lustre/lustre/lov/lov_ea.c b/drivers/staging/lustre/lustre/lov/lov_ea.c index 2e2abed182e5..ac0bf64c08c1 100644 --- a/drivers/staging/lustre/lustre/lov/lov_ea.c +++ b/drivers/staging/lustre/lustre/lov/lov_ea.c @@ -177,17 +177,21 @@ static int lsm_unpackmd_common(struct lov_obd *lov, if (lov_oinfo_is_dummy(loi)) continue; - if (loi->loi_ost_idx >= lov->desc.ld_tgt_count) { - CERROR("OST index %d more than OST count %d\n", + if (loi->loi_ost_idx >= lov->desc.ld_tgt_count && + !lov2obd(lov)->obd_process_conf) { + CERROR("%s: OST index %d more than OST count %d\n", + (char *)lov->desc.ld_uuid.uuid, loi->loi_ost_idx, lov->desc.ld_tgt_count); lov_dump_lmm_v1(D_WARNING, lmm); return -EINVAL; } if (!lov->lov_tgts[loi->loi_ost_idx]) { - CERROR("OST index %d missing\n", loi->loi_ost_idx); + CERROR("%s: OST index %d missing\n", + (char *)lov->desc.ld_uuid.uuid, + loi->loi_ost_idx); lov_dump_lmm_v1(D_WARNING, lmm); - return -EINVAL; + continue; } tgt_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]); diff --git a/drivers/staging/lustre/lustre/lov/lov_internal.h b/drivers/staging/lustre/lustre/lov/lov_internal.h index 5b151bb40ebe..774499c74daa 100644 --- a/drivers/staging/lustre/lustre/lov/lov_internal.h +++ b/drivers/staging/lustre/lustre/lov/lov_internal.h @@ -301,4 +301,9 @@ static inline bool lov_oinfo_is_dummy(const struct lov_oinfo *loi) return false; } +static inline struct obd_device *lov2obd(const struct lov_obd *lov) +{ + return container_of0(lov, struct obd_device, u.lov); +} + #endif diff --git a/drivers/staging/lustre/lustre/lov/lov_object.c b/drivers/staging/lustre/lustre/lov/lov_object.c index 317311ccf2c2..76d4256fa828 100644 --- a/drivers/staging/lustre/lustre/lov/lov_object.c +++ b/drivers/staging/lustre/lustre/lov/lov_object.c @@ -802,6 +802,7 @@ int lov_object_init(const struct lu_env *env, struct lu_object *obj, init_waitqueue_head(&lov->lo_waitq); cl_object_page_init(lu2cl(obj), sizeof(struct lov_page)); + lov->lo_type = LLT_EMPTY; if (cconf->u.coc_layout.lb_buf) { lsm = lov_unpackmd(dev->ld_lov, cconf->u.coc_layout.lb_buf, -- 2.11.0