LASSERT(mutex_is_locked(&lo->ldo_layout_mutex));
- if (le32_to_cpu(lmv1->lmv_hash_type) & LMV_HASH_FLAG_MIGRATION)
- RETURN(0);
-
if (le32_to_cpu(lmv1->lmv_magic) == LMV_MAGIC_STRIPE) {
lo->ldo_dir_slave_stripe = 1;
RETURN(0);
/* The lum has been verifed in lod_verify_md_striping */
LASSERT(le32_to_cpu(lum->lum_magic) == LMV_USER_MAGIC ||
le32_to_cpu(lum->lum_magic) == LMV_USER_MAGIC_SPECIFIC);
- LASSERT(le32_to_cpu(lum->lum_stripe_count) > 0);
- stripe_count = le32_to_cpu(lum->lum_stripe_count);
+ stripe_count = lo->ldo_dir_stripe_count;
OBD_ALLOC(idx_array, sizeof(idx_array[0]) * stripe_count);
if (idx_array == NULL)
RETURN(rc);
}
+static inline bool lod_obj_is_dom(struct dt_object *dt)
+{
+ struct lod_object *lo = lod_dt_obj(dt);
+
+ if (!dt_object_exists(dt_object_child(dt)))
+ return false;
+
+ if (S_ISDIR(dt->do_lu.lo_header->loh_attr))
+ return false;
+
+ if (!lo->ldo_comp_cnt)
+ return false;
+
+ return (lov_pattern(lo->ldo_comp_entries[0].llc_pattern) ==
+ LOV_PATTERN_MDT);
+}
+
/**
* Implementation of dt_object_operations::do_create.
*
RETURN(rc);
if (S_ISREG(dt->do_lu.lo_header->loh_attr) &&
- lod_obj_is_striped(dt) && dof->u.dof_reg.striped != 0) {
+ (lod_obj_is_striped(dt) || lod_obj_is_dom(dt)) &&
+ dof->u.dof_reg.striped != 0) {
LASSERT(lod_dt_obj(dt)->ldo_comp_cached == 0);
rc = lod_striped_create(env, dt, attr, dof, th);
}
RETURN(picked);
}
+static int lod_prepare_resync_mirror(const struct lu_env *env,
+ struct lod_object *lo,
+ __u16 mirror_id)
+{
+ struct lod_thread_info *info = lod_env_info(env);
+ struct lod_layout_component *lod_comp;
+ int i;
+
+ for (i = 0; i < lo->ldo_mirror_count; i++) {
+ if (lo->ldo_mirrors[i].lme_id != mirror_id)
+ continue;
+
+ lod_foreach_mirror_comp(lod_comp, lo, i) {
+ if (lod_comp_inited(lod_comp))
+ continue;
+
+ info->lti_comp_idx[info->lti_count++] =
+ lod_comp_index(lo, lod_comp);
+ }
+ }
+
+ return 0;
+}
+
/**
* figure out the components should be instantiated for resync.
*/
* prep uninited all components assuming any non-stale mirror
* could be picked as the primary mirror.
*/
- for (i = 0; i < lo->ldo_mirror_count; i++) {
- if (lo->ldo_mirrors[i].lme_stale)
- continue;
+ if (mlc->mlc_mirror_id == 0) {
+ /* normal resync */
+ for (i = 0; i < lo->ldo_mirror_count; i++) {
+ if (lo->ldo_mirrors[i].lme_stale)
+ continue;
- lod_foreach_mirror_comp(lod_comp, lo, i) {
- if (!lod_comp_inited(lod_comp))
- break;
+ lod_foreach_mirror_comp(lod_comp, lo, i) {
+ if (!lod_comp_inited(lod_comp))
+ break;
- if (extent.e_end < lod_comp->llc_extent.e_end)
- extent.e_end =
- lod_comp->llc_extent.e_end;
+ if (extent.e_end <
+ lod_comp->llc_extent.e_end)
+ extent.e_end =
+ lod_comp->llc_extent.e_end;
+ }
}
+ rc = lod_prepare_resync(env, lo, &extent);
+ if (rc)
+ GOTO(out, rc);
+ } else {
+ /* mirror write, try to init its all components */
+ rc = lod_prepare_resync_mirror(env, lo,
+ mlc->mlc_mirror_id);
+ if (rc)
+ GOTO(out, rc);
}
- rc = lod_prepare_resync(env, lo, &extent);
- if (rc)
- GOTO(out, rc);
/* change the file state to SYNC_PENDING */
lo->ldo_flr_state = LCM_FL_SYNC_PENDING;
}
lod_comp_index(lo, lod_comp);
}
} else { /* MD_LAYOUT_RESYNC */
- lod_foreach_mirror_comp(lod_comp, lo, primary) {
- if (!lod_comp_inited(lod_comp))
- break;
+ if (mlc->mlc_mirror_id == 0) {
+ /* normal resync */
+ lod_foreach_mirror_comp(lod_comp, lo, primary) {
+ if (!lod_comp_inited(lod_comp))
+ break;
+
+ extent.e_end = lod_comp->llc_extent.e_end;
+ }
- extent.e_end = lod_comp->llc_extent.e_end;
+ rc = lod_prepare_resync(env, lo, &extent);
+ if (rc)
+ GOTO(out, rc);
+ } else {
+ /* mirror write, try to init its all components */
+ rc = lod_prepare_resync_mirror(env, lo,
+ mlc->mlc_mirror_id);
+ if (rc)
+ GOTO(out, rc);
}
- rc = lod_prepare_resync(env, lo, &extent);
- if (rc)
- GOTO(out, rc);
/* change the file state to SYNC_PENDING */
lo->ldo_flr_state = LCM_FL_SYNC_PENDING;
}