From d9cd1352947ba3af9051640e0137d9d5ce242f56 Mon Sep 17 00:00:00 2001 From: tappro Date: Sat, 5 Aug 2006 22:58:09 +0000 Subject: [PATCH] - introduce the struct md_create_spec. It contains the various type-depended 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 | 17 +++++++++-------- lustre/cmm/mdc_object.c | 6 ++++-- lustre/include/md_object.h | 35 ++++++++++++++++++++++++++--------- lustre/mdd/mdd_handler.c | 17 ++++++++++++----- lustre/mdt/mdt_handler.c | 4 ++-- lustre/mdt/mdt_internal.h | 4 ++++ lustre/mdt/mdt_lib.c | 19 ++++++++++++------- lustre/mdt/mdt_open.c | 8 ++++++-- lustre/mdt/mdt_reint.c | 13 +++++++------ 9 files changed, 82 insertions(+), 41 deletions(-) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index 60811cc..7884c89 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -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)); diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index f9fcea0..95bf626 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -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); diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 9bb8c01..aad5d66 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -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, diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index fe9a4d7..4479963 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -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); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index b5c2f6b..e8bdf43 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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); diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 929f4aa..ca6ef8b 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -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; diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index bd01196..feabe4f 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -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); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 60c0777..2f05e25 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 1166036..854822c 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -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: -- 1.8.3.1