From aeb77bdb682210783bcbffc9d94889dc30dcc0db Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 17 May 2006 14:15:33 +0000 Subject: [PATCH] sanitize transaction stuff in mdd --- lustre/include/linux/dt_object.h | 6 --- lustre/mdd/mdd_handler.c | 106 ++++++++++++++++++++++++++------------- lustre/osd/osd_handler.c | 27 +++++----- lustre/osd/osd_internal.h | 9 ++++ 4 files changed, 93 insertions(+), 55 deletions(-) diff --git a/lustre/include/linux/dt_object.h b/lustre/include/linux/dt_object.h index ab4c73f..d502242 100644 --- a/lustre/include/linux/dt_object.h +++ b/lustre/include/linux/dt_object.h @@ -285,12 +285,6 @@ struct txn_param { unsigned int tp_credits; }; -#define TXN_PARAM_INIT(credits) { \ - .tp_credits = (credits) \ -} - -#define TXN_PARAM(...) ((struct txn_param)TXN_PARAM_INIT(__VA_ARGS__)) - struct thandle { struct dt_device *th_dev; }; diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index b69901a..bb2a1a2 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -47,8 +47,7 @@ static struct thandle* mdd_trans_start(struct lu_context *ctxt, - struct mdd_device *, - struct txn_param *); + struct mdd_device *); static void mdd_trans_stop(struct lu_context *ctxt, struct mdd_device *mdd, struct thandle *handle); static struct dt_object* mdd_object_child(struct mdd_object *o); @@ -224,21 +223,60 @@ mdd_add_unlink_log(struct mdd_device *mdd, struct mdd_object *obj, return 0; } +enum mdd_txn_op { + MDD_TXN_OBJECT_DESTROY_OP, + MDD_TXN_OBJECT_CREATE_OP, + MDD_TXN_ATTR_SET_OP, + MDD_TXN_XATTR_SET_OP, + MDD_TXN_INDEX_INSERT_OP, + MDD_TXN_INDEX_DELETE_OP, + MDD_TXN_LINK_OP, + MDD_TXN_RENAME_OP, + MDD_TXN_MKDIR_OP +}; + +struct mdd_txn_op_descr { + enum mdd_txn_op mod_op; + unsigned int mod_credits; +}; + +enum { + MDD_TXN_OBJECT_DESTROY_CREDITS = 10, + MDD_TXN_OBJECT_CREATE_CREDITS = 10, + MDD_TXN_ATTR_SET_CREDITS = 10, + MDD_TXN_XATTR_SET_CREDITS = 10, + MDD_TXN_INDEX_INSERT_CREDITS = 10, + MDD_TXN_INDEX_DELETE_CREDITS = 10, + MDD_TXN_LINK_CREDITS = 10, + MDD_TXN_RENAME_CREDITS = 10, + MDD_TXN_MKDIR_CREDITS = 10 +}; + +#define DEFINE_MDD_TXN_OP_DESC(opname) \ +static const struct mdd_txn_op_descr opname = { \ + .mod_op = opname ## _OP, \ + .mod_credits = opname ## _CREDITS, \ +} + /* * number of blocks to reserve for particular operations. Should be function * of ... something. Stub for now. */ -enum { - MDD_OBJECT_DESTROY_CREDITS = 10, - MDD_OBJECT_CREATE_CREDITS = 10, - MDD_ATTR_SET_CREDITS = 10, - MDD_XATTR_SET_CREDITS = 10, - MDD_INDEX_INSERT_CREDITS = 10, - MDD_INDEX_DELETE_CREDITS = 10, - MDD_LINK_CREDITS = 10, - MDD_RENAME_CREDITS = 10, - MDD_MKDIR_CREDITS = 10 -}; +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_OBJECT_DESTROY); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_OBJECT_CREATE); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_ATTR_SET); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_XATTR_SET); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_INSERT); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_DELETE); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_LINK); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_RENAME); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_MKDIR); + +static void mdd_txn_param_build(struct lu_context *ctx, + const struct mdd_txn_op_descr *opd) +{ + mdd_ctx_info(ctx)->mti_param.tp_credits = opd->mod_credits; +} static int mdd_object_destroy(struct lu_context *ctxt, struct md_object *obj) @@ -249,14 +287,8 @@ mdd_object_destroy(struct lu_context *ctxt, struct md_object *obj) int rc ; ENTRY; - handle = mdd_trans_start(ctxt, mdd, - /* - * TXN_PARAM should probably go into - * lu_context_key to reduce stack - * consumption. Currently this is just one - * int, though. - */ - &TXN_PARAM(MDD_OBJECT_DESTROY_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_OBJECT_DESTROY); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -394,9 +426,10 @@ static void mdd_unlock2(struct lu_context *ctxt, } static struct thandle* mdd_trans_start(struct lu_context *ctxt, - struct mdd_device *mdd, - struct txn_param *p) + struct mdd_device *mdd) { + struct txn_param *p = &mdd_ctx_info(ctxt)->mti_param; + return mdd_child_ops(mdd)->dt_trans_start(ctxt, mdd->mdd_child, p); } @@ -428,8 +461,8 @@ static int mdd_object_create(struct lu_context *ctxt, struct md_object *obj, int rc; ENTRY; - handle = mdd_trans_start(ctxt, mdd, - &TXN_PARAM(MDD_OBJECT_CREATE_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_OBJECT_CREATE); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -458,7 +491,8 @@ mdd_attr_set(struct lu_context *ctxt, int rc; ENTRY; - handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_ATTR_SET_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_ATTR_SET); + handle = mdd_trans_start(ctxt, mdd); if (!handle) RETURN(-ENOMEM); @@ -490,7 +524,8 @@ mdd_xattr_set(struct lu_context *ctxt, struct md_object *obj, void *buf, int rc; ENTRY; - handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_XATTR_SET_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_XATTR_SET); + handle = mdd_trans_start(ctxt, mdd); if (!handle) RETURN(-ENOMEM); @@ -551,8 +586,8 @@ mdd_index_delete(struct lu_context *ctxt, struct md_object *pobj, int rc; ENTRY; - handle = mdd_trans_start(ctxt, mdd, - &TXN_PARAM(MDD_INDEX_DELETE_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_INDEX_DELETE); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -574,7 +609,8 @@ mdd_link(struct lu_context *ctxt, struct md_object *tgt_obj, int rc, nlink; ENTRY; - handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_LINK_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_LINK); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -624,7 +660,8 @@ mdd_rename(struct lu_context *ctxt, struct md_object *src_pobj, int rc; struct thandle *handle; - handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_RENAME_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_RENAME); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -665,7 +702,8 @@ static int mdd_mkdir(struct lu_context *ctxt, struct lu_attr* attr, int rc = 0; ENTRY; - handle = mdd_trans_start(ctxt, mdd, &TXN_PARAM(MDD_MKDIR_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_MKDIR); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -694,8 +732,8 @@ static int mdd_mkname(struct lu_context *ctxt, struct md_object *pobj, int rc = 0; ENTRY; - handle = mdd_trans_start(ctxt, mdd, - &TXN_PARAM(MDD_INDEX_INSERT_CREDITS)); + mdd_txn_param_build(ctxt, &MDD_TXN_INDEX_INSERT); + handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 936785e..eb5820b 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -427,10 +427,6 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj, * XXX temporary solution. */ struct dentry *dentry; - char name[32]; - struct qstr str = { - .name = name - }; LASSERT(obj->oo_inode == NULL); LASSERT(S_ISDIR(attr->la_mode)); @@ -439,10 +435,11 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj, dir = osd->od_obj_area->d_inode; LASSERT(dir->i_op != NULL && dir->i_op->mkdir != NULL); - osd_fid_build_name(lu_object_fid(&obj->oo_dt.do_lu), name); - str.len = strlen(name); + osd_fid_build_name(lu_object_fid(&obj->oo_dt.do_lu), info->oti_name); + info->oti_str.name = info->oti_name; + info->oti_str.len = strlen(info->oti_name); - dentry = d_alloc(osd->od_obj_area, &str); + dentry = d_alloc(osd->od_obj_area, &info->oti_str); if (dentry != NULL) { result = dir->i_op->mkdir(dir, dentry, attr->la_mode & (S_IRWXUGO|S_ISVTX)); @@ -560,9 +557,10 @@ static struct dt_body_operations osd_body_ops = { static int osd_index_lookup(struct lu_context *ctxt, struct dt_object *dt, struct dt_rec *rec, const struct dt_key *key) { - struct osd_object *obj = osd_dt_obj(dt); - struct osd_device *osd = osd_obj2dev(obj); - struct inode *dir; + struct osd_object *obj = osd_dt_obj(dt); + struct osd_device *osd = osd_obj2dev(obj); + struct osd_thread_info *info = lu_context_key_get(ctxt, &osd_key); + struct inode *dir; int result; @@ -570,18 +568,17 @@ static int osd_index_lookup(struct lu_context *ctxt, struct dt_object *dt, * XXX temporary solution. */ struct dentry *dentry; - struct qstr str = { - .name = (const char *)key, - .len = strlen((const char *)key) - }; LASSERT(osd_has_index(obj)); LASSERT(osd->od_obj_area != NULL); + info->oti_str.name = (const char *)key; + info->oti_str.len = strlen((const char *)key); + dir = obj->oo_inode; LASSERT(dir->i_op != NULL && dir->i_op->lookup != NULL); - dentry = d_alloc(NULL, &str); + dentry = d_alloc(NULL, &info->oti_str); if (dentry != NULL) { struct dentry *d; diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index a84500e..e623d87 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -76,6 +76,15 @@ struct dentry *osd_open(struct dentry *parent, const char *name, mode_t mode); struct osd_thread_info { struct lu_fid oti_fid; struct osd_inode_id oti_id; + /* + * XXX temporary: Buffer for fid->name conversion. + */ + char oti_name[32]; + /* + * XXX temporary: for ->i_op calls. + */ + struct qstr oti_str; + }; #endif /* __KERNEL__ */ -- 1.8.3.1