From: huanghua Date: Mon, 31 Jul 2006 10:31:31 +0000 (+0000) Subject: fixed a bug introduced by altering xxx_attr_get() interface in mdd_create(): X-Git-Tag: v1_8_0_110~486^2~1312 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=642bd8a9f590163c5249900cf3a4b9d9feee21f2;p=fs%2Flustre-release.git fixed a bug introduced by altering xxx_attr_get() interface in mdd_create(): only do moo_attr_get() when everything is ready. --- diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 6e4967d..47f3295 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -131,7 +131,7 @@ static int mdd_attr_get(const struct lu_context *ctxt, { struct mdd_object *mdd_obj = md2mdd_obj(obj); struct dt_object *next; - int rc; + int rc; ENTRY; @@ -151,6 +151,8 @@ static int mdd_attr_get(const struct lu_context *ctxt, } /*TODO: get DIREA for directory */ } + CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n", + rc, ma->ma_valid); RETURN(rc); } @@ -414,8 +416,6 @@ static int __mdd_object_create(const struct lu_context *ctxt, if (!lu_object_exists(ctxt, mdd2lu_obj(obj))) { next = mdd_object_child(obj); rc = next->do_ops->do_create(ctxt, next, attr, handle); - if (rc == 0) - rc = mdd_attr_get(ctxt, &obj->mod_obj, ma); } else rc = -EEXIST; @@ -694,6 +694,7 @@ static int mdd_unlink(const struct lu_context *ctxt, struct md_object *pobj, GOTO(cleanup, rc); __mdd_ref_del(ctxt, mdd_cobj, handle, ma); + mdd_attr_get(ctxt, cobj, ma); if (S_ISDIR(ma->ma_attr.la_mode)) { /* unlink dot */ @@ -930,12 +931,6 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, rc = mdd_lov_create(ctxt, mdd, son, &lmm, &lmm_size); if (rc) RETURN(rc); - if (lmm_size < ma->ma_lmm_size) - ma->ma_lmm_size = lmm_size; - if (ma->ma_lmm_size > 0) { - memcpy(ma->ma_lmm, lmm, ma->ma_lmm_size); - ma->ma_valid |= MA_LOV; - } } mdd_txn_param_build(ctxt, &MDD_TXN_MKDIR); @@ -990,7 +985,6 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, rc = __mdd_object_create(ctxt, son, ma, handle); if (rc) GOTO(cleanup, rc); - created = 1; rc = __mdd_object_initialize(ctxt, mdo, son, ma, handle); @@ -1010,9 +1004,10 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, inserted = 1; rc = mdd_lov_set_md(ctxt, pobj, child, lmm, lmm_size); - if (rc) { + if (rc == 0) + rc = mdd_attr_get(ctxt, child, ma); + else CERROR("error on stripe info copy %d \n", rc); - } cleanup: if (rc && created) { int rc2 = 0; @@ -1183,8 +1178,6 @@ __mdd_ref_del(const struct lu_context *ctxt, struct mdd_object *obj, LASSERT(lu_object_exists(ctxt, mdd2lu_obj(obj))); next->do_ops->do_ref_del(ctxt, next, handle); - if (ma != NULL) - mdd_attr_get(ctxt, &obj->mod_obj, ma); } static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj, @@ -1202,6 +1195,7 @@ static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj, mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK); __mdd_ref_del(ctxt, mdd_obj, handle, ma); + mdd_attr_get(ctxt, obj, ma); mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK); mdd_trans_stop(ctxt, mdd, handle); diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index df6b9a6..0391ffb 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -363,6 +363,7 @@ int mdt_done_writing(struct mdt_thread_info *info); void mdt_shrink_reply(struct mdt_thread_info *info); int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *); +void mdt_dump_lmm(int level, struct lov_mds_md *lmm); extern struct lu_context_key mdt_thread_key; /* debug issues helper starts here*/ diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index da0ca11..47eb327 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -42,7 +42,7 @@ /* copied from lov/lov_ea.c, just for debugging, will be removed later */ -static void mdt_dump_lmm(int level, struct lov_mds_md *lmm) +void mdt_dump_lmm(int level, struct lov_mds_md *lmm) { struct lov_ost_data_v1 *lod; int i; diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 6592783..539d9f3 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -111,6 +111,10 @@ static int mdt_mfd_open(struct mdt_thread_info *info, } if (rc != 0) RETURN(rc); + + CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64"\n", ma->ma_valid); + CDEBUG(D_INODE, "after open, lmm_size = %d\n", ma->ma_lmm_size); + if (ma->ma_valid & MA_INODE) mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) { @@ -132,7 +136,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, * (2) we need to record the transaction related stuff onto disk; * But, question is: when do a rean only open, do we still need transno? */ - if (1) { + if (!created) { struct txn_param txn; struct thandle *th; struct dt_device *dt = info->mti_mdt->mdt_bottom;