objs[i].l_ost_gen = cpu_to_le32(0);
rc = lod_fld_lookup(env, lod, fid, &index, LU_SEQ_RANGE_OST);
if (rc < 0) {
+ lod_object_free_striping(env, lo);
CERROR("%s: Can not locate "DFID": rc = %d\n",
lod2obd(lod)->obd_name, PFID(fid), rc);
RETURN(rc);
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
struct lov_ost_data_v1 *objs)
{
struct lod_thread_info *info = lod_env_info(env);
- struct lod_device *md = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
+ struct lod_device *md;
struct lu_object *o, *n;
struct lu_device *nd;
struct dt_object **stripe;
ENTRY;
LASSERT(lo != NULL);
+ md = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
LASSERT(lo->ldo_stripe == NULL);
LASSERT(lo->ldo_stripenr > 0);
LASSERT(lo->ldo_stripe_size > 0);
for (i = 0; i < lo->ldo_stripenr; i++) {
ostid_le_to_cpu(&objs[i].l_ost_oi, &info->lti_ostid);
- idx = le64_to_cpu(objs[i].l_ost_idx);
+ idx = le32_to_cpu(objs[i].l_ost_idx);
rc = ostid_to_fid(&info->lti_fid, &info->lti_ostid, idx);
if (rc != 0)
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);
*/
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);
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);
lod->lod_qos.lq_prio_free = 232;
/* Default threshold for rr (roughly 17%) */
lod->lod_qos.lq_threshold_rr = 43;
- /* Init statfs fields */
- 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);
/* Set up OST pool environment */
lod->lod_pools_hash_body = cfs_hash_create("POOLS", HASH_POOLS_CUR_BITS,
CFS_HASH_MAX_THETA,
&pool_hash_operations,
CFS_HASH_DEFAULT);
- if (!lod->lod_pools_hash_body)
- GOTO(out_statfs, rc = -ENOMEM);
+ if (lod->lod_pools_hash_body == NULL)
+ RETURN(-ENOMEM);
+
CFS_INIT_LIST_HEAD(&lod->lod_pool_list);
lod->lod_pool_count = 0;
rc = lod_ost_pool_init(&lod->lod_pool_info, 0);
lod_ost_pool_free(&lod->lod_pool_info);
out_hash:
cfs_hash_putref(lod->lod_pools_hash_body);
-out_statfs:
- OBD_FREE_PTR(lod->lod_qos.lq_statfs_data);
+
return rc;
}
cfs_hash_putref(lod->lod_pools_hash_body);
lod_ost_pool_free(&(lod->lod_qos.lq_rr.lqr_pool));
lod_ost_pool_free(&lod->lod_pool_info);
- OBD_FREE_PTR(lod->lod_qos.lq_statfs_data);
+
RETURN(0);
}