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;
}
- filter_fid_le_to_cpu(ff, ff, sizeof(*ff));
-
/*
- * mdd_declare_migrate_create() declares this via source object because
- * target is not ready yet, so declare anyway.
+ * locd_buf is set if it's called by dir migration, which doesn't check
+ * pfid and comp id.
*/
- if (!data->locd_declare &&
- lu_fid_eq(lu_object_fid(&lo->ldo_obj.do_lu), &ff->ff_parent) &&
- ff->ff_layout.ol_comp_id == comp->llc_id)
- return 0;
+ if (data->locd_buf) {
+ memset(ff, 0, sizeof(*ff));
+ ff->ff_parent = *(struct lu_fid *)data->locd_buf->lb_buf;
+ } else {
+ filter_fid_le_to_cpu(ff, ff, sizeof(*ff));
+
+ if (lu_fid_eq(lod_object_fid(lo), &ff->ff_parent) &&
+ ff->ff_layout.ol_comp_id == comp->llc_id)
+ return 0;
+
+ memset(ff, 0, sizeof(*ff));
+ ff->ff_parent = *lu_object_fid(&lo->ldo_obj.do_lu);
+ }
/* rewrite filter_fid */
- memset(ff, 0, sizeof(*ff));
- ff->ff_parent = *lu_object_fid(&lo->ldo_obj.do_lu);
ff->ff_parent.f_ver = stripe_idx;
ff->ff_layout.ol_stripe_size = comp->llc_stripe_size;
ff->ff_layout.ol_stripe_count = comp->llc_stripe_count;
*/
static int lod_replace_parent_fid(const struct lu_env *env,
struct dt_object *dt,
+ const struct lu_buf *buf,
struct thandle *th, bool declare)
{
struct lod_object *lo = lod_dt_obj(dt);
struct lod_thread_info *info = lod_env_info(env);
- struct lu_buf *buf = &info->lti_buf;
struct filter_fid *ff;
struct lod_obj_stripe_cb_data data = { { 0 } };
int rc;
RETURN(rc);
}
- buf->lb_buf = info->lti_ea_store;
- buf->lb_len = info->lti_ea_store_size;
-
data.locd_declare = declare;
data.locd_stripe_cb = lod_obj_stripe_replace_parent_fid_cb;
+ data.locd_buf = buf;
rc = lod_obj_for_each_stripe(env, lo, th, &data);
RETURN(rc);
} else if (S_ISDIR(mode)) {
rc = lod_dir_declare_xattr_set(env, dt, buf, name, fl, th);
} else if (strcmp(name, XATTR_NAME_FID) == 0) {
- rc = lod_replace_parent_fid(env, dt, th, true);
+ rc = lod_replace_parent_fid(env, dt, buf, th, true);
} else {
rc = lod_sub_declare_xattr_set(env, next, buf, name, fl, th);
}
}
RETURN(rc);
} else if (strcmp(name, XATTR_NAME_FID) == 0) {
- rc = lod_replace_parent_fid(env, dt, th, false);
+ rc = lod_replace_parent_fid(env, dt, buf, th, false);
RETURN(rc);
}
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;
}