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);
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)
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));
}
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);
}
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));
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);
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);
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));
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));
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));
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));
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));
* 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));
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));
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;
* 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;