RETURN(-EINVAL);
/* adjust hash for dir merge, which may not be set in user command */
- if (lmv_is_merging(lmv) && !lmv->lmv_migrate_hash)
- lmv->lmv_merge_hash =
- lod->lod_mdt_descs.ltd_lmv_desc.ld_pattern;
+ if (lmv_is_merging(lmv) &&
+ !(lmv->lmv_migrate_hash & LMV_HASH_TYPE_MASK))
+ lmv->lmv_merge_hash |=
+ lod->lod_mdt_descs.ltd_lmv_desc.ld_pattern &
+ LMV_HASH_TYPE_MASK;
LMV_DEBUG(D_INFO, lmv, "set");
return lod->lod_ost_count;
else
return lod_get_stripe_count(lod, lo, comp_idx,
- entry->llc_stripe_count, false);
+ entry->llc_stripe_count,
+ entry->llc_pattern &
+ LOV_PATTERN_OVERSTRIPING);
}
static int lod_comp_md_size(struct lod_object *lo, bool is_dir)
ENTRY;
+ lds->lds_def_striping_set = 0;
+
rc = lod_get_lov_ea(env, lo);
if (rc < 0)
RETURN(rc);
*/
if (likely(lp != NULL)) {
lod_get_default_striping(env, lp, lds);
-
+ if (lds->lds_def_striping_set) {
+ rc = lod_verify_striping(env, d, lp,
+ &info->lti_buf, false);
+ if (rc)
+ lds->lds_def_striping_set = 0;
+ }
/* inherit default striping except ROOT */
if ((lds->lds_def_striping_set ||
lds->lds_dir_def_striping_set) &&
*/
if (likely(lp != NULL)) {
rc = lod_get_default_lov_striping(env, lp, lds, ah);
- if (rc == 0)
- lod_striping_from_default(lc, lds, child_mode);
+ if (rc == 0 && lds->lds_def_striping_set) {
+ rc = lod_verify_striping(env, d, lp, &info->lti_buf,
+ false);
+ if (rc == 0)
+ lod_striping_from_default(lc, lds, child_mode);
+ }
}
/* Initialize lod_device::lod_md_root object reference */
lod_need_inherit_more(lc, true, ah->dah_append_pool)) {
rc = lod_get_default_lov_striping(env, d->lod_md_root, lds,
ah);
+ if (rc || !lds->lds_def_striping_set)
+ goto out;
+
+ rc = lod_verify_striping(env, d, d->lod_md_root, &info->lti_buf,
+ false);
if (rc)
goto out;
+
if (lc->ldo_comp_cnt == 0) {
lod_striping_from_default(lc, lds, child_mode);
} else if (!lds->lds_def_striping_is_composite) {
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_STALE_DIR_LAYOUT))
GOTO(out, rc = -EREMOTE);
- if (lo->ldo_dir_stripe_offset == LMV_OFFSET_DEFAULT) {
- struct lod_default_striping *lds;
-
- lds = lo->ldo_def_striping;
- /*
- * child and parent should be on the same MDT,
- * but if parent has default LMV, and the start
- * MDT offset is -1, it's allowed. This check
- * is not necessary after 2.12.22 because client
- * follows this already, but old client may not.
- */
- if (hint->dah_parent &&
- dt_object_remote(hint->dah_parent) && lds &&
- lds->lds_dir_def_stripe_offset !=
- LMV_OFFSET_DEFAULT)
- GOTO(out, rc = -EREMOTE);
- } else if (lo->ldo_dir_stripe_offset !=
- ss->ss_node_id) {
+ if (lo->ldo_dir_stripe_offset != LMV_OFFSET_DEFAULT &&
+ lo->ldo_dir_stripe_offset != ss->ss_node_id) {
struct lod_device *lod;
struct lu_tgt_desc *mdt = NULL;
bool found_mdt = false;
* cluster.
*/
lod_qos_statfs_update(env, lod, &lod->lod_ost_descs);
+
+ rc = lod_fill_mirrors(lo);
+ if (rc)
+ RETURN(rc);
+
for (i = 0; i < lo->ldo_mirror_count; i++) {
bool ost_avail = true;
int index = (i + seq) % lo->ldo_mirror_count;
struct lod_object *lo = lod_dt_obj(dt);
struct dt_object *next = dt_object_child(dt);
struct lmv_user_md *lmu = mlc->mlc_buf.lb_buf;
- __u32 final_stripe_count;
char *stripe_name = info->lti_key;
struct lu_buf *lmv_buf = &info->lti_buf;
+ __u32 final_stripe_count;
struct dt_object *dto;
int i;
int rc;
continue;
if (i < final_stripe_count) {
- if (final_stripe_count == 1)
- continue;
-
rc = lod_sub_declare_xattr_set(env, dto, lmv_buf,
XATTR_NAME_LMV,
LU_XATTR_REPLACE, th);
lmv->lmv_magic = cpu_to_le32(LMV_MAGIC_STRIPE);
lmv->lmv_stripe_count = cpu_to_le32(final_stripe_count);
lmv->lmv_hash_type = cpu_to_le32(lo->ldo_dir_hash_type) &
- cpu_to_le32(LMV_HASH_TYPE_MASK);
+ cpu_to_le32(LMV_HASH_TYPE_MASK |
+ LMV_HASH_FLAG_FIXED);
lmv->lmv_layout_version =
cpu_to_le32(lo->ldo_dir_layout_version + 1);
+ lmv->lmv_migrate_offset = 0;
+ lmv->lmv_migrate_hash = 0;
for (i = 0; i < lo->ldo_dir_stripe_count; i++) {
dto = lo->ldo_stripe[i];
continue;
if (i < final_stripe_count) {
- /* if only one stripe left, no need to update
- * LMV because this stripe will replace master
- * object and act as a plain directory.
- */
- if (final_stripe_count == 1)
- continue;
-
-
rc = lod_fld_lookup(env, lod,
lu_object_fid(&dto->do_lu),
&mdtidx, &type);