}
+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)
static struct md_dir_operations cmm_dir_ops = {
.mdo_lookup = cmm_lookup,
.mdo_mkdir = cmm_mkdir,
+ .mdo_create = cmm_create
};
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)
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,
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);
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;
}