From: tappro Date: Wed, 24 May 2006 00:44:29 +0000 (+0000) Subject: add mdo_create support in mdd, cmm. small fix in mdt_reint. X-Git-Tag: v1_8_0_110~486^2~1777 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=2b4cfb177d45d895b570515b09554220f27b164a;p=fs%2Flustre-release.git add mdo_create support in mdd, cmm. small fix in mdt_reint. --- diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index a14faa2..b9fddd7 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -195,6 +195,31 @@ static int cmm_lookup(const struct lu_context *ctx, struct md_object *mo_p, } +static int cmm_create(const struct lu_context *ctx, + struct md_object *mo_p, const char *name, + struct md_object *mo_c, struct lu_attr *attr) +{ + struct md_object *ch_c = cmm2child_obj(md2cmm_obj(mo_c)); + struct md_object *ch_p = cmm2child_obj(md2cmm_obj(mo_p)); + int rc; + + ENTRY; + + if (cmm_is_local_obj(md2cmm_obj(mo_c))) { + rc = mdo_create(ctx, ch_p, name, ch_c, attr); + } else { + const struct lu_fid *lf = lu_object_fid(&mo_c->mo_lu); + + /* remote object creation and local name insert */ + rc = mo_object_create(ctx, ch_c, attr); + if (rc == 0) { + rc = mdo_name_insert(ctx, ch_p, name, lf, attr); + } + } + + RETURN(rc); +} + static int cmm_mkdir(const struct lu_context *ctx, struct lu_attr *attr, struct md_object *mo_p, const char *name, struct md_object *mo_c) @@ -224,6 +249,7 @@ static int cmm_mkdir(const struct lu_context *ctx, struct lu_attr *attr, static struct md_dir_operations cmm_dir_ops = { .mdo_lookup = cmm_lookup, .mdo_mkdir = cmm_mkdir, + .mdo_create = cmm_create }; diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index fa6e6b4..6443705 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -756,6 +756,37 @@ static int mdd_lookup(const struct lu_context *ctxt, struct md_object *pobj, return mdd_dt_lookup(ctxt, mdo2mdd(pobj), mdo2mddo(pobj), name, fid); } +static int mdd_create(const struct lu_context *ctxt, + struct md_object *pobj, const char *name, + struct md_object *child, struct lu_attr* attr) +{ + struct mdd_device *mdd = mdo2mdd(pobj); + struct mdd_object *mdo = mdo2mddo(pobj); + struct thandle *handle; + int rc = 0; + ENTRY; + + mdd_txn_param_build(ctxt, &MDD_TXN_MKDIR); + handle = mdd_trans_start(ctxt, mdd); + if (IS_ERR(handle)) + RETURN(PTR_ERR(handle)); + + mdd_lock(ctxt, mdo, DT_WRITE_LOCK); + + rc = __mdd_object_create(ctxt, mdo2mddo(child), attr, handle); + if (rc) + GOTO(cleanup, rc); + + rc = __mdd_index_insert(ctxt, mdo, lu_object_fid(&child->mo_lu), + name, handle); + if (rc) + GOTO(cleanup, rc); +cleanup: + mdd_unlock(ctxt, mdo, DT_WRITE_LOCK); + mdd_trans_stop(ctxt, mdd, handle); + RETURN(rc); +} + static int mdd_mkdir(const struct lu_context *ctxt, struct lu_attr* attr, struct md_object *pobj, const char *name, struct md_object *child) @@ -852,6 +883,7 @@ struct md_device_operations mdd_ops = { static struct md_dir_operations mdd_dir_ops = { .mdo_lookup = mdd_lookup, + .mdo_create = mdd_create, .mdo_mkdir = mdd_mkdir, .mdo_rename = mdd_rename, .mdo_link = mdd_link, diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 65c00ae..fe7d5ca 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -66,9 +66,10 @@ static int mdt_md_create(struct mdt_thread_info *info) if (!IS_ERR(child)) { struct md_object *next = mdt_object_child(parent); - result = mdo_create(info->mti_ctxt, &info->mti_attr, next, + result = mdo_create(info->mti_ctxt, next, info->mti_rr.rr_name, - mdt_object_child(child)); + mdt_object_child(child), + &info->mti_attr); mdt_object_put(info->mti_ctxt, child); } else result = PTR_ERR(child); @@ -233,10 +234,11 @@ static int mdt_reint_open(struct mdt_thread_info *info) if (info->mti_rr.rr_flags & MDS_OPEN_CREAT) { if (result == -ENOENT) { /* let's create something */ - result = mdo_create(info->mti_ctxt, &info->mti_attr, + result = mdo_create(info->mti_ctxt, mdt_object_child(parent), info->mti_rr.rr_name, - mdt_object_child(child)); + mdt_object_child(child), + &info->mti_attr); } else if (info->mti_rr.rr_flags & MDS_OPEN_EXCL) { result = -EEXIST; }