From 180e7bf8aea4415fa75daa8677722000016ff35c Mon Sep 17 00:00:00 2001 From: huanghua Date: Mon, 11 Sep 2006 10:52:05 +0000 Subject: [PATCH] handle NULL parent in open replay. --- lustre/mdd/mdd_lov.c | 14 ++++++----- lustre/mdt/mdt_open.c | 70 +++++++++++++++++++++++---------------------------- 2 files changed, 39 insertions(+), 45 deletions(-) diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 6ad425b..ac7099e 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -290,20 +290,22 @@ int mdd_lov_set_md(const struct lu_context *ctxt, struct mdd_object *pobj, if (lmmp == NULL && lmm_size == 0) { struct lov_mds_md *lmm = &mdd_ctx_info(ctxt)->mti_lmm; int size = sizeof(lmm); + /* Get parent dir stripe and set */ - rc = mdd_get_md(ctxt, pobj, &lmm, &size, - MDS_LOV_MD_NAME); + if (pobj != NULL) + rc = mdd_get_md(ctxt, pobj, &lmm, &size, + MDS_LOV_MD_NAME); if (rc > 0) { rc = mdd_xattr_set_txn(ctxt, child, lmm, size, MDS_LOV_MD_NAME, 0, handle); if (rc) - CERROR("error on copy stripe info: rc = %d\n", - rc); + CERROR("error on copy stripe info: rc " + "= %d\n", rc); } } else { LASSERT(lmmp != NULL && lmm_size > 0); - /* delete lmm */ - rc = mdd_lov_set_dir_md(ctxt, child, lmmp, lmm_size, handle); + rc = mdd_lov_set_dir_md(ctxt, child, lmmp, + lmm_size, handle); } } CDEBUG(D_INFO, "Set lov md %p size %d for fid "DFID" rc %d\n", diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 67426d8..4ad6472 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -82,7 +82,7 @@ static int mdt_create_data(struct mdt_thread_info *info, struct md_create_spec *spec = &info->mti_spec; ma->ma_need = MA_INODE | MA_LOV; - return mdo_create_data(info->mti_ctxt, mdt_object_child(p), + return mdo_create_data(info->mti_ctxt, p ? mdt_object_child(p) : NULL, mdt_object_child(o), spec, ma); } @@ -180,21 +180,26 @@ static void mdt_open_transno(struct mdt_thread_info* info) struct mdt_device *mdt = info->mti_mdt; struct ptlrpc_request *req = mdt_info_req(info); - if (info->mti_transno != 0) + if (info->mti_transno != 0) { + /* This request has created something, so we have transno */ + CDEBUG(D_INODE, "open | create: transno = %llu," + " last_committed = %llu\n", + info->mti_transno, + req->rq_export->exp_obd->obd_last_committed); return; - - CDEBUG(D_INODE, "open transno = %llu, last_committed = %llu\n", - info->mti_transno, - req->rq_export->exp_obd->obd_last_committed); + } spin_lock(&mdt->mdt_transno_lock); info->mti_transno = ++ mdt->mdt_last_transno; + spin_unlock(&mdt->mdt_transno_lock); + + CDEBUG(D_INODE, "open only: transno = %llu, last_committed = %llu\n", + info->mti_transno, + req->rq_export->exp_obd->obd_last_committed); + req->rq_transno = info->mti_transno; lustre_msg_set_transno(req->rq_repmsg, info->mti_transno); - target_committed_to_req(req); - - spin_unlock(&mdt->mdt_transno_lock); lustre_msg_set_last_xid(req->rq_repmsg, req->rq_xid); } @@ -265,7 +270,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); - /* TODO: handle REPLAY (p == NULL)*/ + /* in replay case, p == NULL */ rc = mdt_create_data(info, p, o); if (rc) RETURN(rc); @@ -319,9 +324,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, spin_unlock(&med->med_open_lock); repbody->handle.cookie = mfd->mfd_handle.h_cookie; - mdt_open_transno(info); - } else rc = -ENOMEM; RETURN(rc); @@ -508,46 +511,36 @@ out: } static int mdt_open_by_fid(struct mdt_thread_info* info, - const struct lu_fid *fid, - struct ldlm_reply *rep, - __u32 flags) + struct ldlm_reply *rep) { - struct md_attr *ma = &info->mti_attr; - struct mdt_object *o; - int rc; + __u32 flags = info->mti_spec.sp_cr_flags; + struct mdt_reint_record *rr = &info->mti_rr; + struct md_attr *ma = &info->mti_attr; + struct mdt_object *o; + int rc; ENTRY; - o = mdt_object_find(info->mti_ctxt, info->mti_mdt, fid); + o = mdt_object_find(info->mti_ctxt, info->mti_mdt, rr->rr_fid2); if (IS_ERR(o)) RETURN(rc = PTR_ERR(o)); rc = lu_object_exists(&o->mot_obj.mo_lu); if (rc > 0) { - /* successfully found the child object */ - if (flags & MDS_OPEN_EXCL && flags & MDS_OPEN_CREAT) - rc = -EEXIST; - else { - const struct lu_context *ctxt = info->mti_ctxt; - struct mdt_device *mdt = info->mti_mdt; - - spin_lock(&mdt->mdt_transno_lock); - info->mti_transno = ++ mdt->mdt_last_transno; - spin_unlock(&mdt->mdt_transno_lock); - - mdt_set_disposition(info, rep, DISP_LOOKUP_EXECD); - mdt_set_disposition(info, rep, DISP_LOOKUP_POS); - rc = mo_attr_get(ctxt, mdt_object_child(o), ma); - if (rc == 0) - rc = mdt_mfd_open(info, NULL, o, flags, 0, rep); - } + const struct lu_context *ctxt = info->mti_ctxt; + + mdt_set_disposition(info, rep, DISP_LOOKUP_EXECD); + mdt_set_disposition(info, rep, DISP_LOOKUP_POS); + rc = mo_attr_get(ctxt, mdt_object_child(o), ma); + if (rc == 0) + rc = mdt_mfd_open(info, NULL, o, flags, 0, rep); } else if (rc == 0) { rc = -ENOENT; } else { /* the child object was created on remote server */ struct mdt_body *repbody; repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); - repbody->fid1 = *fid; + repbody->fid1 = *rr->rr_fid2; repbody->valid |= (OBD_MD_FLID | OBD_MD_MDS); rc = 0; } @@ -638,8 +631,7 @@ int mdt_open(struct mdt_thread_info *info) if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { /* this is a replay request. */ - result = mdt_open_by_fid(info, rr->rr_fid2, ldlm_rep, - create_flags); + result = mdt_open_by_fid(info, ldlm_rep); if (result != -ENOENT) RETURN(result); -- 1.8.3.1