Whamcloud - gitweb
- introduce the struct md_create_spec. It contains the various type-depended
authortappro <tappro>
Sat, 5 Aug 2006 22:58:09 +0000 (22:58 +0000)
committertappro <tappro>
Sat, 5 Aug 2006 22:58:09 +0000 (22:58 +0000)
  parameters for create, e.g. symlink target, eadata, parent info for cross-ref
case, etc.
Struct is allocated in thread context and filled while unpacking requests.

lustre/cmm/cmm_object.c
lustre/cmm/mdc_object.c
lustre/include/md_object.h
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c

index 60811cc..7884c89 100644 (file)
@@ -212,11 +212,12 @@ static struct lu_object_operations cml_obj_ops = {
 /* CMM local md_object operations */
 static int cml_object_create(const struct lu_context *ctx,
                              struct md_object *mo,
+                             const struct md_create_spec *spec,
                              struct md_attr *attr)
 {
         int rc;
         ENTRY;
-        rc = mo_object_create(ctx, md_object_next(mo), attr);
+        rc = mo_object_create(ctx, md_object_next(mo), spec, attr);
         RETURN(rc);
 }
 
@@ -354,14 +355,13 @@ static int cml_lookup(const struct lu_context *ctx, struct md_object *mo_p,
 
 static int cml_create(const struct lu_context *ctx, struct md_object *mo_p,
                       const char *child_name, struct md_object *mo_c,
-                      const char *target_name, const void *eadata,
-                      int eadatalen, struct md_attr *ma)
+                      const struct md_create_spec *spec,
+                      struct md_attr *ma)
 {
         int rc;
         ENTRY;
         rc = mdo_create(ctx, md_object_next(mo_p), child_name,
-                        md_object_next(mo_c), target_name, eadata, eadatalen,
-                        ma);
+                        md_object_next(mo_c), spec, ma);
         RETURN(rc);
 }
 
@@ -548,6 +548,7 @@ static struct lu_object_operations cmr_obj_ops = {
 /* CMM remote md_object operations. All are invalid */
 static int cmr_object_create(const struct lu_context *ctx,
                              struct md_object *mo,
+                             const struct md_create_spec *spec,
                              struct md_attr *ma)
 {
         RETURN(-EFAULT);
@@ -660,8 +661,8 @@ static int cmr_lookup(const struct lu_context *ctx, struct md_object *mo_p,
  */
 static int cmr_create(const struct lu_context *ctx, struct md_object *mo_p,
                       const char *child_name, struct md_object *mo_c,
-                      const char *target_name, const void *eadata,
-                      int eadatasize, struct md_attr *ma)
+                      const struct md_create_spec *spec,
+                      struct md_attr *ma)
 {
         int rc;
 
@@ -670,7 +671,7 @@ static int cmr_create(const struct lu_context *ctx, struct md_object *mo_p,
         //XXX: make sure that MDT checks name isn't exist
 
         /* remote object creation and local name insert */
-        rc = mo_object_create(ctx, md_object_next(mo_c), ma);
+        rc = mo_object_create(ctx, md_object_next(mo_c), spec, ma);
         if (rc == 0) {
                 rc = mdo_name_insert(ctx, md_object_next(mo_p),
                                      child_name, lu_object_fid(&mo_c->mo_lu));
index f9fcea0..95bf626 100644 (file)
@@ -91,7 +91,9 @@ static struct lu_object_operations mdc_obj_ops = {
 
 /* md_object_operations */
 static int mdc_object_create(const struct lu_context *ctx,
-                             struct md_object *mo, struct md_attr *ma)
+                             struct md_object *mo, 
+                             const struct md_create_spec *spec,
+                             struct md_attr *ma)
 {
         struct mdc_device *mc = md2mdc_dev(md_obj2dev(mo));
         struct lu_attr *attr = &ma->ma_attr;
@@ -105,7 +107,7 @@ static int mdc_object_create(const struct lu_context *ctx,
         memset(&mci->mci_opdata, 0, sizeof(mci->mci_opdata));
         mci->mci_opdata.fid1 = *lu_object_fid(&mo->mo_lu);
         mci->mci_opdata.mod_time = attr->la_mtime;
-
+        /*TODO: pack create_spec properly */
         rc = md_create(mc->mc_desc.cl_exp, &mci->mci_opdata, NULL, 0,
                        attr->la_mode, attr->la_uid, attr->la_gid, 0, 0,
                        &mci->mci_req);
index 9bb8c01..aad5d66 100644 (file)
@@ -61,6 +61,20 @@ struct md_attr {
         struct llog_cookie     *ma_cookie;
         int                     ma_cookie_size;
 };
+/* additional parameters for create */
+struct md_create_spec {
+        union {
+                /* symlink target */
+                const char               *sp_symname;
+                /* parent FID for cross-ref mkdir */
+                const struct lu_fid      sp_pfid;
+                /* eadata for regular files */
+                struct md_spec_reg {
+                        const void *eadata;
+                        int  eadatalen;
+                } sp_ea;
+        } u;
+};
 
 /*
  * Operations implemented for each md object (both directory and leaf).
@@ -93,7 +107,9 @@ struct md_object_operations {
 
         /* part of cross-ref operation */
         int (*moo_object_create)(const struct lu_context *,
-                                 struct md_object *, struct md_attr *);
+                                 struct md_object *, 
+                                 const struct md_create_spec *spec, 
+                                 struct md_attr *);
         int (*moo_ref_add)(const struct lu_context *, struct md_object *);
         int (*moo_ref_del)(const struct lu_context *, struct md_object *,
                            struct md_attr *);
@@ -111,8 +127,8 @@ struct md_dir_operations {
         /* target_name is valid iff this is a symlink operation. */
         int (*mdo_create)(const struct lu_context *, struct md_object *,
                           const char *child_name, struct md_object *,
-                          const char *target_name, const void *eadata,
-                          int eadatalen, struct md_attr *);
+                          const struct md_create_spec *spec,
+                          struct md_attr *);
         /* This method is used for creating data object for this meta object*/
         int (*mdo_create_data)(const struct lu_context *cx, struct md_object *p,
                                struct md_object *o, const void *eadata,
@@ -289,10 +305,12 @@ static inline int mo_readpage(const struct lu_context *cx, struct md_object *m,
 }
 
 static inline int mo_object_create(const struct lu_context *cx,
-                                   struct md_object *m, struct md_attr *at)
+                                   struct md_object *m,
+                                   const struct md_create_spec *spc,
+                                   struct md_attr *at)
 {
         LASSERT(m->mo_ops->moo_object_create);
-        return m->mo_ops->moo_object_create(cx, m, at);
+        return m->mo_ops->moo_object_create(cx, m, spc, at);
 }
 
 static inline int mo_ref_add(const struct lu_context *cx,
@@ -318,12 +336,11 @@ static inline int mdo_lookup(const struct lu_context *cx, struct md_object *p,
 
 static inline int mdo_create(const struct lu_context *cx, struct md_object *p,
                              const char *child_name, struct md_object *c,
-                             const char *target_name, const void *eadata,
-                             int eadatalen, struct md_attr *at)
+                             const struct md_create_spec *spc,
+                             struct md_attr *at)
 {
         LASSERT(c->mo_dir_ops->mdo_create);
-        return c->mo_dir_ops->mdo_create(cx, p, child_name, c, target_name,
-                                         eadata, eadatalen, at);
+        return c->mo_dir_ops->mdo_create(cx, p, child_name, c, spc, at);
 }
 static inline int mdo_create_data(const struct lu_context *cx,
                                   struct md_object *p, struct md_object *c,
index fe9a4d7..4479963 100644 (file)
@@ -994,8 +994,8 @@ static int mdd_create_sanity_check(const struct lu_context *ctxt,
  */
 static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
                       const char *name, struct md_object *child,
-                      const char *target_name, const void *eadata,
-                      int eadatasize, struct md_attr* ma)
+                      const struct md_create_spec *spec,
+                      struct md_attr* ma)
 {
         struct mdd_device *mdd = mdo2mdd(pobj);
         struct mdd_object *mdo = md2mdd_obj(pobj);
@@ -1013,6 +1013,9 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
         /* no RPC inside the transaction, so OST objects should be created at
          * first */
         if (S_ISREG(attr->la_mode)) {
+                const void *eadata = spec->u.sp_ea.eadata;
+                int eadatasize = spec->u.sp_ea.eadatalen;
+
                 rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
                                     eadata, eadatasize, attr);
                 if (rc)
@@ -1098,8 +1101,10 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
         
         if (S_ISLNK(attr->la_mode)) {
                 struct dt_object *dt = mdd_object_child(son);
-                loff_t pos = 0;
+                const char *target_name = spec->u.sp_symname;
                 int sym_len = strlen(target_name);
+                loff_t pos = 0;
+                
                 rc = dt->do_body_ops->dbo_write(ctxt, dt, target_name,
                                                 sym_len, &pos, handle);
                 if (rc == sym_len)
@@ -1129,7 +1134,9 @@ cleanup:
 }
 /* partial operation */
 static int mdd_object_create(const struct lu_context *ctxt,
-                             struct md_object *obj, struct md_attr *ma)
+                             struct md_object *obj, 
+                             const struct md_create_spec *spec,
+                             struct md_attr *ma)
 {
 
         struct mdd_device *mdd = mdo2mdd(obj);
@@ -1146,7 +1153,7 @@ static int mdd_object_create(const struct lu_context *ctxt,
 /* XXX: parent fid is needed here
         rc = __mdd_object_initialize(ctxt, mdo, son, ma, handle);
 */
-        mdd_attr_get(ctxt, md2mdd_obj(obj), ma);
+        mdd_attr_get(ctxt, obj, ma);
 
         mdd_trans_stop(ctxt, mdd, handle);
 
index b5c2f6b..e8bdf43 100644 (file)
@@ -2268,8 +2268,8 @@ static int mdt_init0(const struct lu_context *ctx, struct mdt_device *m,
 
         spin_lock_init(&m->mdt_transno_lock);
         /* FIXME: We need to load them from disk. But now fake it */
-        m->mdt_last_transno = 100;
-        m->mdt_last_committed = 99;
+        m->mdt_last_transno = 1;
+        m->mdt_last_committed = 1;
         m->mdt_max_mdsize = MAX_MD_SIZE;
         m->mdt_max_cookiesize = sizeof(struct llog_cookie);
 
index 929f4aa..ca6ef8b 100644 (file)
@@ -222,6 +222,10 @@ struct mdt_thread_info {
          */
         struct md_attr             mti_attr;
         /*
+         * Create specification
+         */
+        struct md_create_spec mti_spec;
+        /*
          * reint record. contains information for reint operations.
          */
         struct mdt_reint_record    mti_rr;
index bd01196..feabe4f 100644 (file)
@@ -189,10 +189,12 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
                 rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
                 if (rr->rr_name) {
                         if (req_capsule_field_present(pill, &RMF_SYMTGT)) {
-                                rr->rr_tgt = req_capsule_client_get(pill,
-                                                                &RMF_SYMTGT);
-                                if (rr->rr_tgt == NULL)
+                                const char *tgt;
+                                tgt = req_capsule_client_get(pill,
+                                                             &RMF_SYMTGT);
+                                if (tgt == NULL)
                                         result = -EFAULT;
+                                info->mti_spec.u.sp_symname = tgt;
                         }
                 } else
                         result = -EFAULT;
@@ -299,6 +301,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
 
                 rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
                 if (rr->rr_name == NULL)
+                        /*XXX: what about open by FID? */
                         result = -EFAULT;
                 else
                         result = 0;
@@ -306,10 +309,12 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                 result = -EFAULT;
 
         if (req_capsule_field_present(pill, &RMF_EADATA)) {
-                rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA);
-                rr->rr_eadatalen = req_capsule_get_size(pill,
-                                                        &RMF_EADATA,
-                                                        RCL_CLIENT);
+                struct md_create_spec *sp = &info->mti_spec;
+                sp->u.sp_ea.eadata = req_capsule_client_get(pill,
+                                                            &RMF_EADATA);
+                sp->u.sp_ea.eadatalen = req_capsule_get_size(pill,
+                                                             &RMF_EADATA,
+                                                             RCL_CLIENT);
         }
 
         RETURN(result);
index 60c0777..2f05e25 100644 (file)
@@ -221,9 +221,11 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                                                        &RMF_MDT_MD,
                                                        RCL_SERVER);
                 LASSERT(p != NULL);
+                /*XXX: Tom, do we need this?
                 rc = mdt_create_data_obj(info, p, o);
                 if (rc)
                         RETURN(rc);
+                */
         }
 
         CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64" lmm_size = %d\n", 
@@ -320,6 +322,7 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid,
                         if (la->la_flags & MDS_OPEN_CREAT) {
                                 rc = mo_object_create(info->mti_ctxt,
                                                       mdt_object_child(o),
+                                                      &info->mti_spec,
                                                       &info->mti_attr);
                                 if (rc == 0)
                                         rc = mdt_mfd_open(info, NULL, o, flags, 1);
@@ -425,8 +428,9 @@ int mdt_reint_open(struct mdt_thread_info *info)
                                     mdt_object_child(parent),
                                     rr->rr_name,
                                     mdt_object_child(child),
-                                    rr->rr_tgt, rr->rr_eadata,
-                                    rr->rr_eadatalen, &info->mti_attr);
+                                    &info->mti_spec,
+                                    /* rr->rr_tgt, rr->rr_eadata, rr->rr_eadatalen,*/
+                                    &info->mti_attr);
                 intent_set_disposition(ldlm_rep, DISP_OPEN_CREATE);
                 if (result != 0)
                         GOTO(out_child, result);
index 1166036..854822c 100644 (file)
@@ -64,7 +64,8 @@ static int mdt_md_create(struct mdt_thread_info *info)
                 struct md_object *next = mdt_object_child(parent);
 
                 rc = mdo_create(info->mti_ctxt, next, rr->rr_name,
-                                mdt_object_child(child), rr->rr_tgt, NULL, 0,
+                                mdt_object_child(child), &info->mti_spec,
+                                /* rr->rr_tgt, NULL, 0, */
                                 ma);
                 if (rc == 0) {
                         /* return fid & attr to client. */
@@ -95,7 +96,8 @@ static int mdt_md_mkobj(struct mdt_thread_info *info)
         if (!IS_ERR(o)) {
                 struct md_object *next = mdt_object_child(o);
 
-                rc = mo_object_create(info->mti_ctxt, next, ma);
+                rc = mo_object_create(info->mti_ctxt, next,
+                                      &info->mti_spec, ma);
                 if (rc == 0) {
                         /* return fid & attr to client. */
                         if (ma->ma_valid & MA_INODE)
@@ -204,11 +206,10 @@ static int mdt_reint_create(struct mdt_thread_info *info)
         switch (info->mti_attr.ma_attr.la_mode & S_IFMT) {
         case S_IFREG:
         case S_IFDIR:{
-                if (strlen(info->mti_rr.rr_name) > 0)
-                        rc = mdt_md_create(info);
-                else
+                if (strlen(info->mti_rr.rr_name) == 0) {
                         rc = mdt_md_mkobj(info);
-                break;
+                        break;
+                }
         }
         case S_IFLNK:
         case S_IFCHR: