X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flod%2Flod_lov.c;h=f601afee4ab03a24596c75caadbe9699bea22e10;hb=0098396983e1075668414aa5298a4990e61ffbda;hp=6590d3c3982dbbc624fd5934b774db15f791622f;hpb=45222b2ef279d62ac3aab0e7babc55d77e3c93a2;p=fs%2Flustre-release.git diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 6590d3c..f601afe 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -76,23 +76,19 @@ void lod_putref(struct lod_device *lod, struct lod_tgt_descs *ltd) ltd->ltd_refcount--; if (ltd->ltd_refcount == 0 && ltd->ltd_death_row) { struct lod_tgt_desc *tgt_desc, *tmp; - struct list_head kill; + LIST_HEAD(kill); CDEBUG(D_CONFIG, "destroying %d ltd desc\n", ltd->ltd_death_row); - INIT_LIST_HEAD(&kill); - ltd_foreach_tgt_safe(ltd, tgt_desc, tmp) { LASSERT(tgt_desc); if (!tgt_desc->ltd_reap) continue; list_add(&tgt_desc->ltd_kill, &kill); - /*FIXME: only support ost pool for now */ - if (ltd == &lod->lod_ost_descs) - lod_ost_pool_remove(<d->ltd_tgt_pool, - tgt_desc->ltd_index); + lod_tgt_pool_remove(<d->ltd_tgt_pool, + tgt_desc->ltd_index); ltd_del_tgt(ltd, tgt_desc); ltd->ltd_death_row--; } @@ -256,15 +252,12 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod, if (rc) GOTO(out_del_tgt, rc); - if (for_ost) { - /* pool is not supported for MDS stack yet */ - rc = lod_ost_pool_add(<d->ltd_tgt_pool, index, - ltd->ltd_tgts_size); - if (rc) { - CERROR("%s: can't set up pool, failed with %d\n", - obd->obd_name, rc); - GOTO(out_del_tgt, rc); - } + rc = lod_tgt_pool_add(<d->ltd_tgt_pool, index, + ltd->ltd_lov_desc.ld_tgt_count); + if (rc) { + CERROR("%s: can't set up pool, failed with %d\n", + obd->obd_name, rc); + GOTO(out_del_tgt, rc); } mutex_unlock(<d->ltd_mutex); @@ -301,7 +294,7 @@ out_ltd: thread = LTD_TGT(ltd, index)->ltd_recovery_thread; OBD_FREE_PTR(thread); } - lod_ost_pool_remove(<d->ltd_tgt_pool, index); + lod_tgt_pool_remove(<d->ltd_tgt_pool, index); out_del_tgt: ltd_del_tgt(ltd, tgt_desc); out_mutex: @@ -1918,6 +1911,24 @@ recheck: RETURN(rc); } } + /* Any stripe count is forbidden on DoM component */ + if (lum->lmm_stripe_count) { + CDEBUG(D_LAYOUT, + "invalid DoM layout stripe count %u, must be 0\n", + le16_to_cpu(lum->lmm_stripe_count)); + RETURN(-EINVAL); + } + + /* Any pool is forbidden on DoM component */ + if (lum->lmm_magic == LOV_USER_MAGIC_V3) { + struct lov_user_md_v3 *v3 = (void *)lum; + + if (v3->lmm_pool_name[0] != '\0') { + CDEBUG(D_LAYOUT, + "DoM component cannot have pool assigned\n"); + RETURN(-EINVAL); + } + } } prev_end = le64_to_cpu(ext->e_end); @@ -2006,6 +2017,14 @@ void lod_fix_desc_pattern(__u32 *val) } } +void lod_fix_lmv_desc_pattern(__u32 *val) +{ + if ((*val) && !lmv_is_known_hash_type(*val)) { + LCONSOLE_WARN("lod: Unknown md stripe pattern: %#x\n", *val); + *val = 0; + } +} + void lod_fix_desc_qos_maxage(__u32 *val) { /* fix qos_maxage */ @@ -2026,6 +2045,14 @@ void lod_fix_desc(struct lov_desc *desc) lod_fix_desc_qos_maxage(&desc->ld_qos_maxage); } +static void lod_fix_lmv_desc(struct lmv_desc *desc) +{ + desc->ld_active_tgt_count = 0; + lod_fix_desc_stripe_count(&desc->ld_default_stripe_count); + lod_fix_lmv_desc_pattern(&desc->ld_pattern); + lod_fix_desc_qos_maxage(&desc->ld_qos_maxage); +} + /** * Initialize the structures used to store pools and default striping. * @@ -2076,6 +2103,9 @@ int lod_pools_init(struct lod_device *lod, struct lustre_cfg *lcfg) desc->ld_active_tgt_count = 0; lod->lod_ost_descs.ltd_lov_desc = *desc; + /* NB: config doesn't contain lmv_desc, alter it via sysfs. */ + lod_fix_lmv_desc(&lod->lod_mdt_descs.ltd_lmv_desc); + lod->lod_sp_me = LUSTRE_SP_CLI; /* Set up OST pool environment */ @@ -2091,17 +2121,30 @@ int lod_pools_init(struct lod_device *lod, struct lustre_cfg *lcfg) INIT_LIST_HEAD(&lod->lod_pool_list); lod->lod_pool_count = 0; - rc = lod_ost_pool_init(&lod->lod_ost_descs.ltd_tgt_pool, 0); + rc = lod_tgt_pool_init(&lod->lod_mdt_descs.ltd_tgt_pool, 0); if (rc) GOTO(out_hash, rc); - rc = lod_ost_pool_init(&lod->lod_ost_descs.ltd_qos.lq_rr.lqr_pool, 0); + + rc = lod_tgt_pool_init(&lod->lod_mdt_descs.ltd_qos.lq_rr.lqr_pool, 0); + if (rc) + GOTO(out_mdt_pool, rc); + + rc = lod_tgt_pool_init(&lod->lod_ost_descs.ltd_tgt_pool, 0); + if (rc) + GOTO(out_mdt_rr_pool, rc); + + rc = lod_tgt_pool_init(&lod->lod_ost_descs.ltd_qos.lq_rr.lqr_pool, 0); if (rc) - GOTO(out_pool_info, rc); + GOTO(out_ost_pool, rc); RETURN(0); -out_pool_info: - lod_ost_pool_free(&lod->lod_ost_descs.ltd_tgt_pool); +out_ost_pool: + lod_tgt_pool_free(&lod->lod_ost_descs.ltd_tgt_pool); +out_mdt_rr_pool: + lod_tgt_pool_free(&lod->lod_mdt_descs.ltd_qos.lq_rr.lqr_pool); +out_mdt_pool: + lod_tgt_pool_free(&lod->lod_mdt_descs.ltd_tgt_pool); out_hash: cfs_hash_putref(lod->lod_pools_hash_body); @@ -2131,8 +2174,10 @@ int lod_pools_fini(struct lod_device *lod) } cfs_hash_putref(lod->lod_pools_hash_body); - lod_ost_pool_free(&(lod->lod_ost_descs.ltd_qos.lq_rr.lqr_pool)); - lod_ost_pool_free(&lod->lod_ost_descs.ltd_tgt_pool); + lod_tgt_pool_free(&lod->lod_ost_descs.ltd_qos.lq_rr.lqr_pool); + lod_tgt_pool_free(&lod->lod_ost_descs.ltd_tgt_pool); + lod_tgt_pool_free(&lod->lod_mdt_descs.ltd_qos.lq_rr.lqr_pool); + lod_tgt_pool_free(&lod->lod_mdt_descs.ltd_tgt_pool); RETURN(0); }