X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_lov.c;h=197ffd63f253df05417bfa3a47ca13e1eb13adee;hb=790e6203e88f2f9ec78b41463d66f102f58c5451;hp=8b6ce98c1b82db81104d44173393d3e08ad52612;hpb=90d8e7fd28746a572c8de488222f5312fe927fc3;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 8b6ce98..197ffd6 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -206,7 +206,7 @@ int mdd_get_md(const struct lu_env *env, struct mdd_object *obj, *md_size = 0; rc = 0; } else if (rc < 0) { - CERROR("Error %d reading eadata \n", rc); + CERROR("Error %d reading eadata - %d\n", rc, *md_size); } else { /* XXX: Convert lov EA but fixed after verification test. */ *md_size = rc; @@ -243,7 +243,7 @@ static int mdd_lov_set_stripe_md(const struct lu_env *env, RETURN(rc); obd_free_memmd(lov_exp, &lsm); - rc = mdd_xattr_set_txn(env, obj, buf, MDS_LOV_MD_NAME, 0, handle); + rc = mdd_xattr_set_txn(env, obj, buf, XATTR_NAME_LOV, 0, handle); CDEBUG(D_INFO, "set lov ea of "DFID" rc %d \n", PFID(mdo2fid(obj)), rc); RETURN(rc); @@ -270,7 +270,7 @@ static int mdd_lov_set_dir_md(const struct lu_env *env, lum->lmm_stripe_offset == (typeof(lum->lmm_stripe_offset))(-1) && lum->lmm_magic != LOV_USER_MAGIC_V3) { rc = mdd_xattr_set_txn(env, obj, &LU_BUF_NULL, - MDS_LOV_MD_NAME, 0, handle); + XATTR_NAME_LOV, 0, handle); if (rc == -ENODATA) rc = 0; CDEBUG(D_INFO, "delete lov ea of "DFID" rc %d \n", @@ -316,7 +316,7 @@ int mdd_lov_set_md(const struct lu_env *env, struct mdd_object *pobj, rc = mdd_lov_set_stripe_md(env, child, buf, handle); } else { rc = mdd_xattr_set_txn(env, child, buf, - MDS_LOV_MD_NAME, 0, handle); + XATTR_NAME_LOV, 0, handle); } } else if (S_ISDIR(mode)) { if (lmmp == NULL && lmm_size == 0) { @@ -327,11 +327,11 @@ int mdd_lov_set_md(const struct lu_env *env, struct mdd_object *pobj, /* Get parent dir stripe and set */ if (pobj != NULL) rc = mdd_get_md_locked(env, pobj, lmm, &size, - MDS_LOV_MD_NAME); + XATTR_NAME_LOV); if (rc > 0) { buf = mdd_buf_get(env, lmm, size); rc = mdd_xattr_set_txn(env, child, buf, - MDS_LOV_MD_NAME, 0, handle); + XATTR_NAME_LOV, 0, handle); if (rc) CERROR("error on copy stripe info: rc " "= %d\n", rc); @@ -356,49 +356,23 @@ static obd_id mdd_lov_create_id(const struct lu_fid *fid) return fid_flatten(fid); } -static void mdd_lov_update_objids(struct obd_device *obd, struct lov_mds_md *lmm) +int mdd_lov_objid_prepare(struct mdd_device *mdd, struct lov_mds_md *lmm) { - struct mds_obd *mds = &obd->u.mds; - int j; - struct lov_ost_data_v1 *lmm_objects; - ENTRY; - - /* if we create file without objects - lmm is NULL */ - if (lmm == NULL) - return; - - if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_V3) - lmm_objects = ((struct lov_mds_md_v3 *)lmm)->lmm_objects; - else - lmm_objects = lmm->lmm_objects; - - for (j = 0; j < le32_to_cpu(lmm->lmm_stripe_count); j++) { - int i = le32_to_cpu(lmm_objects[j].l_ost_idx); - obd_id id = le64_to_cpu(lmm_objects[j].l_object_id); - int page = i / OBJID_PER_PAGE(); - int idx = i % OBJID_PER_PAGE(); - obd_id *data = mds->mds_lov_page_array[page]; - - CDEBUG(D_INODE,"update last object for ost %d - new %llu" - " old %llu\n", i, id, data[idx]); - if (id > data[idx]) { - data[idx] = id; - cfs_bitmap_set(mds->mds_lov_page_dirty, page); - } - } - EXIT; + /* copy mds_lov code is using wrong layer */ + return mds_lov_prepare_objids(mdd->mdd_obd_dev, lmm); } void mdd_lov_objid_update(struct mdd_device *mdd, struct lov_mds_md *lmm) { - mdd_lov_update_objids(mdd->mdd_obd_dev, lmm); + /* copy mds_lov code is using wrong layer */ + mds_lov_update_objids(mdd->mdd_obd_dev, lmm); } void mdd_lov_create_finish(const struct lu_env *env, struct mdd_device *mdd, struct lov_mds_md *lmm, int lmm_size, const struct md_op_spec *spec) { - if (lmm && !spec->u.sp_ea.no_lov_create) + if (lmm && !spec->no_create) OBD_FREE(lmm, lmm_size); } @@ -424,7 +398,7 @@ int mdd_lov_create(const struct lu_env *env, struct mdd_device *mdd, oti_init(oti, NULL); /* replay case, has objects already, only get lov from eadata */ - if (spec->u.sp_ea.no_lov_create != 0) { + if (spec->no_create != 0) { *lmm = (struct lov_mds_md *)spec->u.sp_ea.eadata; *lmm_size = spec->u.sp_ea.eadatalen; RETURN(0); @@ -467,7 +441,7 @@ int mdd_lov_create(const struct lu_env *env, struct mdd_device *mdd, rc = mdd_get_md_locked(env, parent, _lmm, &_lmm_size, - MDS_LOV_MD_NAME); + XATTR_NAME_LOV); if (rc > 0) rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE, lov_exp, 0, &lsm, _lmm); @@ -546,6 +520,12 @@ int mdd_lov_create(const struct lu_env *env, struct mdd_device *mdd, CERROR("Cannot pack lsm, err = %d\n", rc); GOTO(out_oti, rc); } + if (mdd_lov_objid_prepare(mdd, *lmm) != 0) { + CERROR("Not have memory for update objid\n"); + OBD_FREE(*lmm, rc); + *lmm = NULL; + GOTO(out_oti, rc = -ENOMEM); + } *lmm_size = rc; rc = 0; EXIT; @@ -604,7 +584,7 @@ int mdd_lovobj_unlink(const struct lu_env *env, struct mdd_device *mdd, CDEBUG(D_INFO, "destroying OSS object %d/%d\n", (int)oa->o_id, (int)oa->o_gr); - rc = obd_destroy(lov_exp, oa, lsm, oti, NULL, BYPASS_CAPA); + rc = obd_destroy(lov_exp, oa, lsm, oti, NULL, NULL); obd_free_memmd(lov_exp, &lsm); RETURN(rc); @@ -637,7 +617,7 @@ int mdd_lov_destroy(const struct lu_env *env, struct mdd_device *mdd, /* get lov ea */ rc = mdd_get_md_locked(env, obj, ma->ma_lmm, &ma->ma_lmm_size, - MDS_LOV_MD_NAME); + XATTR_NAME_LOV); if (rc <= 0) { CWARN("Get lov ea failed for "DFID" rc = %d\n",