/* The ent->lde_name is composed of ${FID}:${index} */
if (ent->lde_namelen < len + 1 ||
memcmp(ent->lde_name, name, len) != 0) {
- CDEBUG(lod->lod_lmv_failout ? D_ERROR : D_INFO,
- "%s: invalid shard name %.*s with the FID "DFID
- " for the striped directory "DFID", %s\n",
- lod2obd(lod)->obd_name, ent->lde_namelen,
- ent->lde_name, PFID(&fid),
- PFID(lu_object_fid(&obj->do_lu)),
- lod->lod_lmv_failout ? "failout" : "skip");
+ CDEBUG_LIMIT(lod->lod_lmv_failout ? D_ERROR : D_INFO,
+ "%s: invalid shard name %.*s with the FID "DFID" for the striped directory "DFID", %s\n",
+ lod2obd(lod)->obd_name, ent->lde_namelen,
+ ent->lde_name, PFID(&fid),
+ PFID(lu_object_fid(&obj->do_lu)),
+ lod->lod_lmv_failout ? "failout" : "skip");
if (lod->lod_lmv_failout)
break;
do {
if (ent->lde_name[len] < '0' ||
ent->lde_name[len] > '9') {
- CDEBUG(lod->lod_lmv_failout ? D_ERROR : D_INFO,
- "%s: invalid shard name %.*s with the "
- "FID "DFID" for the striped directory "
- DFID", %s\n",
- lod2obd(lod)->obd_name, ent->lde_namelen,
- ent->lde_name, PFID(&fid),
- PFID(lu_object_fid(&obj->do_lu)),
- lod->lod_lmv_failout ?
- "failout" : "skip");
+ CDEBUG_LIMIT(lod->lod_lmv_failout ?
+ D_ERROR : D_INFO,
+ "%s: invalid shard name %.*s with the FID "DFID" for the striped directory "DFID", %s\n",
+ lod2obd(lod)->obd_name,
+ ent->lde_namelen,
+ ent->lde_name, PFID(&fid),
+ PFID(lu_object_fid(&obj->do_lu)),
+ lod->lod_lmv_failout ?
+ "failout" : "skip");
if (lod->lod_lmv_failout)
break;
}
/* check stripe size is multiplier of comp_end */
if (comp_end != LUSTRE_EOF &&
+ comp_end != comp->llc_extent.e_start &&
comp_end % comp->llc_stripe_size) {
/* fix that even for defined stripe size but warn
* about the problem, that must not happen
struct lod_obj_stripe_cb_data *data)
{
struct lod_layout_component *lod_comp;
- int i, j, rc;
+ int i, j, rc = 0;
ENTRY;
- LASSERT(lo->ldo_comp_cnt != 0 && lo->ldo_comp_entries != NULL);
+ mutex_lock(&lo->ldo_layout_mutex);
for (i = 0; i < lo->ldo_comp_cnt; i++) {
lod_comp = &lo->ldo_comp_entries[i];
if (data->locd_comp_cb) {
rc = data->locd_comp_cb(env, lo, i, data);
if (rc)
- RETURN(rc);
+ GOTO(unlock, rc);
}
/* could used just to do sth about component, not each
continue;
rc = data->locd_stripe_cb(env, lo, dt, th, i, j, data);
if (rc != 0)
- RETURN(rc);
+ GOTO(unlock, rc);
}
}
- RETURN(0);
+unlock:
+ mutex_unlock(&lo->ldo_layout_mutex);
+ RETURN(rc);
}
static bool lod_obj_attr_set_comp_skip_cb(const struct lu_env *env,
if (magic != LOV_USER_MAGIC_COMP_V1)
RETURN(-EINVAL);
+ mutex_lock(&lo->ldo_layout_mutex);
+
array_cnt = lo->ldo_comp_cnt + comp_v1->lcm_entry_count;
OBD_ALLOC_PTR_ARRAY(comp_array, array_cnt);
- if (comp_array == NULL)
+ if (comp_array == NULL) {
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-ENOMEM);
+ }
+
memcpy(comp_array, lo->ldo_comp_entries,
sizeof(*comp_array) * lo->ldo_comp_cnt);
LASSERT(lo->ldo_mirror_count == 1);
lo->ldo_mirrors[0].lme_end = array_cnt - 1;
+ mutex_unlock(&lo->ldo_layout_mutex);
+
RETURN(0);
error:
}
}
OBD_FREE_PTR_ARRAY(comp_array, array_cnt);
+ mutex_unlock(&lo->ldo_layout_mutex);
+
RETURN(rc);
}
RETURN(-EINVAL);
}
+ mutex_lock(&lo->ldo_layout_mutex);
for (i = 0; i < comp_v1->lcm_entry_count; i++) {
__u32 id = comp_v1->lcm_entries[i].lcme_id;
__u32 flags = comp_v1->lcm_entries[i].lcme_flags;
if (flags & LCME_FL_INIT) {
if (changed)
- lod_striping_free(env, lo);
+ lod_striping_free_nolock(env, lo);
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-EINVAL);
}
if (flags) {
if ((flags & LCME_FL_STALE) &&
lod_last_non_stale_mirror(mirror_id,
- lo))
+ lo)) {
+ mutex_unlock(
+ &lo->ldo_layout_mutex);
RETURN(-EUCLEAN);
+ }
lod_comp->llc_flags |= flags;
}
if (mirror_flag) {
changed = true;
}
}
+ mutex_unlock(&lo->ldo_layout_mutex);
if (!changed) {
CDEBUG(D_LAYOUT, "%s: requested component(s) not found.\n",
flags = 0;
}
+ mutex_lock(&lo->ldo_layout_mutex);
+
left = lo->ldo_comp_cnt;
- if (left <= 0)
+ if (left <= 0) {
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-EINVAL);
+ }
for (i = (lo->ldo_comp_cnt - 1); i >= 0; i--) {
struct lod_layout_component *lod_comp;
if (left != (i + 1)) {
CDEBUG(D_LAYOUT, "%s: this deletion will create "
"a hole.\n", lod2obd(d)->obd_name);
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-EINVAL);
}
left--;
if (obj == NULL)
continue;
rc = lod_sub_declare_destroy(env, obj, th);
- if (rc)
+ if (rc) {
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(rc);
+ }
}
}
if (left == lo->ldo_comp_cnt) {
CDEBUG(D_LAYOUT, "%s: requested component id:%#x not found\n",
lod2obd(d)->obd_name, id);
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-EINVAL);
}
+ mutex_unlock(&lo->ldo_layout_mutex);
+
memset(attr, 0, sizeof(*attr));
attr->la_valid = LA_SIZE;
rc = lod_sub_declare_attr_set(env, next, attr, th);
{
struct lod_thread_info *info = lod_env_info(env);
struct lod_device *d = lu2lod_dev(dt->do_lu.lo_dev);
+ struct lod_object *lo = lod_dt_obj(dt);
struct lov_comp_md_v1 *comp_v1 = buf->lb_buf;
struct lov_comp_md_entry_v1 *entry;
struct lov_mds_md_v1 *lmm;
ENTRY;
+ /**
+ * other ops (like lod_declare_destroy) could destroying sub objects
+ * as well.
+ */
+ mutex_lock(&lo->ldo_layout_mutex);
+
if (!declare) {
/* prepare sub-objects array */
for (i = 0; i < comp_v1->lcm_entry_count; i++) {
array_count += lmm->lmm_stripe_count;
}
OBD_ALLOC_PTR_ARRAY(sub_objs, array_count);
- if (sub_objs == NULL)
+ if (sub_objs == NULL) {
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(-ENOMEM);
+ }
}
k = 0; /* sub_objs index */
OBD_FREE_PTR_ARRAY(sub_objs, array_count);
}
+ mutex_unlock(&lo->ldo_layout_mutex);
RETURN(rc);
}
LASSERT(lo);
if (lo->ldo_comp_cnt == 0 && !lo->ldo_is_foreign) {
- lod_striping_free(env, lo);
+ lod_striping_free_nolock(env, lo);
rc = lod_sub_xattr_del(env, next, XATTR_NAME_LOV, th);
RETURN(rc);
}
LASSERT(lo->ldo_mirror_count == 1);
+ mutex_lock(&lo->ldo_layout_mutex);
+
rc = lod_layout_del_prep_layout(env, lo, th);
if (rc < 0)
GOTO(out, rc);
EXIT;
out:
if (rc)
- lod_striping_free(env, lo);
+ lod_striping_free_nolock(env, lo);
+
+ mutex_unlock(&lo->ldo_layout_mutex);
+
return rc;
}
int rc = 0, i, j;
ENTRY;
+ mutex_lock(&lo->ldo_layout_mutex);
+
LASSERT((lo->ldo_comp_cnt != 0 && lo->ldo_comp_entries != NULL) ||
lo->ldo_is_foreign);
if (rc)
GOTO(out, rc);
+ lo->ldo_comp_cached = 1;
+
rc = lod_generate_and_set_lovea(env, lo, th);
if (rc)
GOTO(out, rc);
- lo->ldo_comp_cached = 1;
+ mutex_unlock(&lo->ldo_layout_mutex);
+
RETURN(0);
out:
- lod_striping_free(env, lo);
+ lod_striping_free_nolock(env, lo);
+ mutex_unlock(&lo->ldo_layout_mutex);
+
RETURN(rc);
}
{
if (data->locd_declare)
return lod_sub_declare_destroy(env, dt, th);
- else if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LOST_SPEOBJ) ||
- stripe_idx == cfs_fail_val)
+
+ if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LOST_SPEOBJ) ||
+ stripe_idx == cfs_fail_val)
return lod_sub_destroy(env, dt, th);
- else
- return 0;
+
+ return 0;
}
/**
}
/* 2nd pick is for the primary mirror containing unavail OST */
- if (lo->ldo_mirrors[index].lme_primary && second_pick < 0)
+ if (lo->ldo_mirrors[index].lme_prefer && second_pick < 0)
second_pick = index;
/* 3rd pick is for non-primary mirror containing unavail OST */
* we found a non-primary 1st pick, we'd like to find a
* potential pirmary mirror.
*/
- if (picked >= 0 && !lo->ldo_mirrors[index].lme_primary)
+ if (picked >= 0 && !lo->ldo_mirrors[index].lme_prefer)
continue;
/* check the availability of OSTs */
* primary with all OSTs are available, this is the perfect
* 1st pick.
*/
- if (lo->ldo_mirrors[index].lme_primary)
+ if (lo->ldo_mirrors[index].lme_prefer)
break;
} /* for all mirrors */
LASSERT(mlc->mlc_opc == MD_LAYOUT_WRITE ||
mlc->mlc_opc == MD_LAYOUT_RESYNC);
- /* look for the primary mirror */
+ /* look for the first preferred mirror */
for (i = 0; i < lo->ldo_mirror_count; i++) {
if (lo->ldo_mirrors[i].lme_stale)
continue;
- if (lo->ldo_mirrors[i].lme_primary == 0)
+ if (lo->ldo_mirrors[i].lme_prefer == 0)
continue;
- if (unlikely(primary >= 0)) {
- CERROR(DFID " has multiple primary: %u / %u\n",
- PFID(lod_object_fid(lo)),
- lo->ldo_mirrors[i].lme_id,
- lo->ldo_mirrors[primary].lme_id);
- RETURN(-EIO);
- }
-
primary = i;
+ break;
}
if (primary < 0) {
/* no primary, use any in-sync */