* Author: Alex Zhuravlev <alexey.zhuravlev@intel.com>
*/
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_MDS
#include <obd_class.h>
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;
ENTRY;
LASSERT(lo);
- LASSERT(lo->ldo_stripenr > 0);
- magic = lo->ldo_pool ? LOV_MAGIC_V3 : LOV_MAGIC_V1;
+ magic = lo->ldo_pool != NULL ? LOV_MAGIC_V3 : LOV_MAGIC_V1;
lmm_size = lov_mds_md_size(lo->ldo_stripenr, magic);
if (info->lti_ea_store_size < lmm_size) {
rc = lod_ea_store_resize(info, lmm_size);
RETURN(rc);
}
+ if (lo->ldo_pattern == 0) /* default striping */
+ lo->ldo_pattern = LOV_PATTERN_RAID0;
+
lmm = info->lti_ea_store;
lmm->lmm_magic = cpu_to_le32(magic);
- lmm->lmm_pattern = cpu_to_le32(LOV_PATTERN_RAID0);
+ lmm->lmm_pattern = cpu_to_le32(lo->ldo_pattern);
fid_to_lmm_oi(fid, &lmm->lmm_oi);
lmm_oi_cpu_to_le(&lmm->lmm_oi, &lmm->lmm_oi);
lmm->lmm_stripe_size = cpu_to_le32(lo->ldo_stripe_size);
lmm->lmm_stripe_count = cpu_to_le16(lo->ldo_stripenr);
+ if (lo->ldo_pattern & LOV_PATTERN_F_RELEASED)
+ lmm->lmm_stripe_count = cpu_to_le16(lo->ldo_released_stripenr);
lmm->lmm_layout_gen = 0;
if (magic == LOV_MAGIC_V1) {
objs = &lmm->lmm_objects[0];
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;
int i, idx, rc = 0;
ENTRY;
- LASSERT(lo);
+ 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);
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);
struct lov_mds_md_v1 *lmm;
struct lov_ost_data_v1 *objs;
__u32 magic;
+ __u32 pattern;
int rc = 0;
ENTRY;
lmm = (struct lov_mds_md_v1 *) buf->lb_buf;
magic = le32_to_cpu(lmm->lmm_magic);
+ pattern = le32_to_cpu(lmm->lmm_pattern);
if (magic != LOV_MAGIC_V1 && magic != LOV_MAGIC_V3)
GOTO(out, rc = -EINVAL);
- if (le32_to_cpu(lmm->lmm_pattern) != LOV_PATTERN_RAID0)
+ if (lov_pattern(pattern) != LOV_PATTERN_RAID0)
GOTO(out, rc = -EINVAL);
+ lo->ldo_pattern = pattern;
lo->ldo_stripe_size = le32_to_cpu(lmm->lmm_stripe_size);
- lo->ldo_stripenr = le16_to_cpu(lmm->lmm_stripe_count);
lo->ldo_layout_gen = le16_to_cpu(lmm->lmm_layout_gen);
+ lo->ldo_stripenr = le16_to_cpu(lmm->lmm_stripe_count);
+ /* released file stripenr fixup. */
+ if (pattern & LOV_PATTERN_F_RELEASED)
+ lo->ldo_stripenr = 0;
LASSERT(buf->lb_len >= lov_mds_md_size(lo->ldo_stripenr, magic));
objs = &lmm->lmm_objects[0];
}
- rc = lod_initialize_objects(env, lo, objs);
+ if (lo->ldo_stripenr > 0)
+ rc = lod_initialize_objects(env, lo, objs);
out:
RETURN(rc);
*/
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);
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,