Whamcloud - gitweb
add mdo_create support in mdd, cmm. small fix in mdt_reint.
authortappro <tappro>
Wed, 24 May 2006 00:44:29 +0000 (00:44 +0000)
committertappro <tappro>
Wed, 24 May 2006 00:44:29 +0000 (00:44 +0000)
lustre/cmm/cmm_object.c
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_reint.c

index a14faa2..b9fddd7 100644 (file)
@@ -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
 };
 
 
index fa6e6b4..6443705 100644 (file)
@@ -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,
index 65c00ae..fe7d5ca 100644 (file)
@@ -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;
                 }