Whamcloud - gitweb
LU-3161 lod: Added proper error handling instead of LASSERT
[fs/lustre-release.git] / lustre / lod / lod_lov.c
index 03efa26..5d74c88 100644 (file)
@@ -247,7 +247,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                spin_lock(&imp->imp_lock);
                imp->imp_server_timeout = 1;
                spin_unlock(&imp->imp_lock);
-               imp->imp_client->cli_request_portal = MDS_MDS_PORTAL;
+               imp->imp_client->cli_request_portal = OUT_PORTAL;
                CDEBUG(D_OTHER, "%s: Set 'mds' portal and timeout\n",
                      obd->obd_name);
                ltd = &lod->lod_mdt_descs;
@@ -663,6 +663,30 @@ int lod_store_def_striping(const struct lu_env *env, struct dt_object *dt,
        RETURN(rc);
 }
 
+static int validate_lod_and_idx(struct lod_device *md, int idx)
+{
+       if (unlikely(idx >= md->lod_ost_descs.ltd_tgts_size ||
+                    !cfs_bitmap_check(md->lod_ost_bitmap, idx))) {
+               CERROR("%s: bad idx: %d of %d\n", lod2obd(md)->obd_name, idx,
+                      md->lod_ost_descs.ltd_tgts_size);
+               return -EINVAL;
+       }
+
+       if (unlikely(OST_TGT(md, idx) == NULL)) {
+               CERROR("%s: bad lod_tgt_desc for idx: %d\n",
+                      lod2obd(md)->obd_name, idx);
+               return -EINVAL;
+       }
+
+       if (unlikely(OST_TGT(md, idx)->ltd_ost == NULL)) {
+               CERROR("%s: invalid lod device, for idx: %d\n",
+                      lod2obd(md)->obd_name , idx);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /*
  * allocate array of objects pointers, find/create objects
  * stripenr and other fields should be initialized by this moment
@@ -697,16 +721,14 @@ int lod_initialize_objects(const struct lu_env *env, struct lod_object *lo,
                        GOTO(out, rc);
                LASSERTF(fid_is_sane(&info->lti_fid), ""DFID" insane!\n",
                         PFID(&info->lti_fid));
-               /*
-                * XXX: assertion is left for testing, to make
-                * sure we never process requests till configuration
-                * is completed. to be changed to -EINVAL
-                */
-
                lod_getref(&md->lod_ost_descs);
-               LASSERT(cfs_bitmap_check(md->lod_ost_bitmap, idx));
-               LASSERT(OST_TGT(md,idx));
-               LASSERTF(OST_TGT(md,idx)->ltd_ost, "idx %d\n", idx);
+
+               rc = validate_lod_and_idx(md, idx);
+               if (unlikely(rc != 0)) {
+                       lod_putref(md, &md->lod_ost_descs);
+                       GOTO(out, rc);
+               }
+
                nd = &OST_TGT(md,idx)->ltd_ost->dd_lu_dev;
                lod_putref(md, &md->lod_ost_descs);
 
@@ -806,13 +828,8 @@ int lod_load_striping(const struct lu_env *env, struct lod_object *lo)
         */
        dt_write_lock(env, next, 0);
        /* already initialized? */
-       if (lo->ldo_stripe) {
-               int i;
-               /* check validity */
-               for (i = 0; i < lo->ldo_stripenr; i++)
-                       LASSERTF(lo->ldo_stripe[i], "stripe %d is NULL\n", i);
+       if (lo->ldo_stripe != NULL)
                GOTO(out, rc = 0);
-       }
 
        if (!dt_object_exists(next))
                GOTO(out, rc = 0);
@@ -821,8 +838,6 @@ int lod_load_striping(const struct lu_env *env, struct lod_object *lo)
        if (!(lu_object_attr(lod2lu_obj(lo)) & S_IFREG))
                GOTO(out, rc = 0);
 
-       LASSERT(lo->ldo_stripenr == 0);
-
        rc = lod_get_lov_ea(env, lo);
        if (rc <= 0)
                GOTO(out, rc);
@@ -1063,7 +1078,7 @@ int lod_pools_init(struct lod_device *lod, struct lustre_cfg *lcfg)
        OBD_ALLOC_PTR(lod->lod_qos.lq_statfs_data);
        if (NULL == lod->lod_qos.lq_statfs_data)
                RETURN(-ENOMEM);
-       cfs_waitq_init(&lod->lod_qos.lq_statfs_waitq);
+       init_waitqueue_head(&lod->lod_qos.lq_statfs_waitq);
 
        /* Set up OST pool environment */
        lod->lod_pools_hash_body = cfs_hash_create("POOLS", HASH_POOLS_CUR_BITS,