staging: lustre: lov: init LOV stripe type beforehand
authorBobi Jam <bobijam.xu@intel.com>
Thu, 10 Nov 2016 17:30:34 +0000 (12:30 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Nov 2016 14:54:02 +0000 (15:54 +0100)
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 <bobijam.xu@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6744
Reviewed-on: http://review.whamcloud.com/15362
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/lov/lov_ea.c
drivers/staging/lustre/lustre/lov/lov_internal.h
drivers/staging/lustre/lustre/lov/lov_object.c

index 2e2abed182e55bd9e56080af02800777f005c465..ac0bf64c08c1d47dc1d412fb68472f3fe241fe39 100644 (file)
@@ -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]);
index 5b151bb40ebe9084e8a3f31e261b12c2ffa648b1..774499c74daa8cf9e292aaab6f4e38cbf3b1d21e 100644 (file)
@@ -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
index 317311ccf2c2ad8f18ce71aba8f3295f5a98065a..76d4256fa828f6e6c6ca6f4132aa096de072130e 100644 (file)
@@ -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,