X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flod%2Flod_object.c;h=d7fdad2ff9646e92c6a018d979486a43a53e020b;hb=622a94d5e27ed3e596918863c08b304a6be9a646;hp=69da6a304eac7fb52e376a66df7ef2883f030b60;hpb=bd596fbe449f4fbab18ed184ccce1e141928b116;p=fs%2Flustre-release.git diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 69da6a3..d7fdad2 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -1662,9 +1662,6 @@ int lod_parse_dir_striping(const struct lu_env *env, struct lod_object *lo, 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); @@ -1895,9 +1892,8 @@ static int lod_prep_md_striped_create(const struct lu_env *env, /* 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) @@ -5326,6 +5322,23 @@ out: 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. * @@ -5348,7 +5361,8 @@ static int lod_create(const struct lu_env *env, struct dt_object *dt, 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); } @@ -6121,6 +6135,30 @@ static int lod_primary_pick(const struct lu_env *env, struct lod_object *lo, 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. */ @@ -6236,23 +6274,33 @@ static int lod_declare_update_rdonly(const struct lu_env *env, * 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; } @@ -6376,16 +6424,26 @@ static int lod_declare_update_write_pending(const struct lu_env *env, 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; }